पता लगाएँ कि क्या माउस बटन दबाया गया है, तो एक स्क्रिप्ट या कमांड को लागू करें


11

क्या बैश से माउस बटन स्टेट प्राप्त करने का कोई तरीका है? Xdotool केवल माउस स्थान प्राप्त कर सकते हैं।

मैं कुछ ऐसा सेट करना चाहूंगा जहां मैं एक नियम को परिभाषित कर सकता हूं जहां एक माउस बटन दबाया जाता है, एक स्क्रिप्ट निष्पादित हो सकती है।


आप निश्चित रूप से माउस की घटनाओं का पता लगा सकते हैं , लेकिन मुझे विश्वास नहीं है कि सिस्टम से पूछने का कोई तरीका है कि माउस बटन अभी दबाया जा रहा है । अगर आप छद्मकोड, MouseButton1Downऔर MouseButton1Upघटनाओं पर कार्य करने के लिए क्षमा करेंगे, तो हर माउस गतिविधि पार्सर के लिए मैंने घड़ियाँ देखी हैं ।
डोपघोटी

मुझे कुछ स्क्रिप्ट की आवश्यकता है जो माउस को देखेगा और जब बाएं बटन दबाया जाएगा, तो यह कुछ करेगा।
मार्टिन डीपी

स्पष्टीकरण चाहिए। क्या आप कुछ चाहते हैं, जब आप एक शेल में हों, और आप टर्मिनल विंडो पर क्लिक करें, तो वह विशिष्ट शेल कुछ करता है? या क्या आप ऐसा चाहते हैं कि जब आप एक विशिष्ट माउस बटन पर क्लिक करें तो कहीं भी एक स्क्रिप्ट चल रही है (और आपको स्क्रिप्ट को टर्मिनल में देखने की आवश्यकता नहीं है)?
पैट्रिक

मुझे स्क्रिप्ट की आवश्यकता है, जिसे मैं चलाऊंगा और फिर यह डेस्कटॉप पर कहीं भी माउस बटन के लिए देखेगा। यह माउस को ब्लॉक नहीं करेगा, यह केवल इसे सुनेगा। मैंने Xlib के साथ C में इसके लिए प्रोग्राम लिखने की कोशिश की, लेकिन इसमें केवल XGrabButton और XGrabPointer है और मुझे इसकी इच्छा है, क्योंकि यह पॉइंटर पकड़ लेता है और अन्य विंडो क्लिक घटनाओं को पंजीकृत नहीं करती हैं।
मार्टिन डीपी

जवाबों:


11
xinput --query-state <mouse_id>

यह आपको सभी माउस बटन के लिए एक राज्य देता है, जो इस तरह दिखता है:

2 classes :
ButtonClass
    button[1]=up
    button[2]=up
    button[3]=up
    button[4]=up
    button[5]=up
    button[6]=up
    button[7]=up
    button[8]=up
    button[9]=up
    button[10]=up
    button[11]=up
    button[12]=up
    button[13]=up
    button[14]=up
    button[15]=up
    button[16]=up
ValuatorClass Mode=Relative Proximity=In
    valuator[0]=313
    valuator[1]=667
    valuator[2]=-20

Mouse_id से प्राप्त किया जा सकता है:

xinput --list

यहाँ एक छोटा माउस बटन वॉचर स्क्रिप्ट है:

#!/bin/bash

MOUSE_ID=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')

STATE1=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
while true; do
    sleep 0.2
    STATE2=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
    comm -13 <(echo "$STATE1") <(echo "$STATE2")
    STATE1=$STATE2
done

आपको MOUSE_ID डिटेक्शन स्ट्रिंग ('माउस') को कुछ और में बदलना पड़ सकता है।


xinput --listमुझे देता है X Input extension not available.। अफसोस की बात है कि इस मामले के लिए Google कुछ भी प्रकट नहीं करता है जो मेरे मामले में सहायक है: Xvnc4एक न्यूनतम डेबियन वीएम में। संभवतः मैं भाग्य से बाहर हूँ
टीन

6

आप xevX वातावरण के भीतर अपने माउस के बटन की स्थिति का पता लगाने के लिए कमांड लाइन टूल का उपयोग कर सकते हैं ।

उदाहरण

$ xev
...
ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064320, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064439, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065208, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065337, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319066059, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

लेकिन यह जानकारी केवल आपको आंशिक रूप से एक समाधान के लिए मिलती है। ऊपर से आप जो महत्वपूर्ण जानकारी निकालना चाहते हैं, वह संख्या आपके माउस पर किसी विशेष बटन से जुड़ी है। मेरे उदाहरण में मैं बाएं बटन को दबा रहा हूं, "ब्यूटेन 1"।

xbindkeys

आप इस टूल का उपयोग उस क्रिया को सेटअप करने के लिए कर सकते हैं जो बटन दबाए जाने से जुड़ी है। आप एक नियम भी सेट कर सकते हैं जिसमें एक कुंजी या यहां तक ​​कि एक कुंजी + बटन को एक साथ दबाया जाना चाहिए।

उदाहरण

आपको पहले सुनिश्चित करना होगा कि संकुल xbindkeys स्थापित है।

फिर आपको टेम्पलेट xbindkeys कॉन्फ़िगरेशन फ़ाइल बनाने के लिए, केवल एक बार, निम्न कमांड चलाने की आवश्यकता होगी।

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

बनाई गई फ़ाइल के साथ आप इसे टेक्स्ट एडिटर में खोल सकते हैं और इस तरह से एक नियम जोड़ सकते हैं:

"xterm"
  b:3

यह नियम बताता है कि हम xtermबटन 3 दबाए जाने पर प्रोग्राम चलाना चाहते हैं । "बटन 3" मेरा सही माउस बटन है।

उपरोक्त बदलाव के साथ हमें xbindkeys को मारने की आवश्यकता है यदि यह पहले से ही चल रहा है और फिर इसे पुनरारंभ करें।

$ killall xbindkeys
$ xbindkeys

अब किसी भी समय मैं सही माउस बटन पर क्लिक करने के साथ, एक xtermनिष्पादित हो जाएगा।

संदर्भ


2
लेकिन यह केवल बनाई गई विंडो के लिए काम करता है। मैं उस घटना को विश्व स्तर पर कैसे पकड़ सकता हूं?
मार्टिन डीपी

4

अगर आप माउस क्लिक (या व्हील इवेंट) पर xterm में बस bash कमांड चलाना चाहते हैं, तो आप इस उदाहरण की कोशिश कर सकते हैं:

$ echo -e "\e[?1000h"
$ while read -n 6; do echo hellowworld; done

यह व्हील इवेंट के लिए है (इसके बजाय 12 सेट पर क्लिक करें)


कृपया, क्या आप समझा सकते हैं?
lucaswxp

2

आप अपने केक बटन प्रेस घटना नहीं है और यह खा सकते हैं। यदि आप चाहते हैं कि आपकी स्क्रिप्ट एक माउस ईवेंट प्राप्त करे, तो माउस ईवेंट को किसी अन्य एप्लिकेशन के बजाय आपकी स्क्रिप्ट पर भेजा जाएगा - अर्थात आपकी स्क्रिप्ट को माउस ईवेंट को हथियाना होगा। यदि आपकी स्क्रिप्ट ईवेंट का दावा नहीं करती है तो जो विंडो उसे मिलनी चाहिए वह मिल जाती है।

यदि आप चाहें, तो आप माउस इवेंट को फ़ोकस किए गए विंडो या विंडो पर दिए गए निर्देशांक ( xdotool click) में बदल सकते हैं।

आप कुछ माउस या कीबोर्ड ईवेंट पर स्क्रिप्ट निष्पादित करने के लिए XBindKeys का उपयोग कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.