Fare düğmesine basılıp basılmadığını tespit edin, ardından bir komut dosyası veya komut çağırın


11

Fare düğmesinin durumunu bash'den almanın bir yolu var mı? Xdotool sadece fare konumunu alabilir.

Bir fare düğmesine basıldığında bir komut dosyası çalıştırılabilecek bir kural tanımlayabileceğim bir şey ayarlamak istiyorum.


Fare olaylarını kesinlikle algılayabilirsiniz , ancak şu anda fare düğmesine basılıp basılmadığını sisteme sormanın bir yolu olduğuna inanmıyorum . Gördüğüm her fare etkinliği ayrıştırıcısı, sözde kodu MouseButton1Downve MouseButton1Upharekete geçecek olayları affedecekseniz izler .
DopeGhoti

Fareyi izleyecek bir komut dosyasına ihtiyacım var ve sol düğmeye basıldığında bir şey yapacak.
MartinP

Açıklama gerekli. Bir kabuğun içindeyken ve terminal penceresini tıklattığınızda, o kabuğun bir şey yaptığı bir şey mi istiyorsunuz? Veya belirli bir fare düğmesini tıkladığınızda bir komut dosyasının çalıştırıldığı (ve komut dosyasını terminalde görmeniz gerekmediği) için mi istiyorsunuz?
Patrick

Çalıştırdığım komut dosyasına ihtiyacım var ve masaüstünde herhangi bir yerde fare düğmelerini izleyecek. Fareyi engellemez, sadece dinler. Ben Xlib ile C için program yazmaya çalıştım, ama sadece XGrabButton ve XGrabPointer vardır ve ben istemiyorum, çünkü işaretçiyi kapmak ve başka bir pencere tıklama olayları kaydetmez.
MartinP

Yanıtlar:


11
xinput --query-state <mouse_id>

Bu, tüm fare düğmeleri için aşağıdaki gibi bir durum verir:

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

Fare_kimliği aşağıdakilerden elde edilebilir:

xinput --list

İşte küçük bir fare düğmesi izleme komut dosyası:

#!/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 algılama dizesini ('fare') başka bir şeyle değiştirmeniz gerekebilir.


xinput --listverir X Input extension not available.. Maalesef bu konu için Google benim durumumda yardımcı olan hiçbir şeyi açığa çıkarmıyor: Xvnc4minimal bir Debian VM'sinde. Muhtemelen
Tino

6

xevX ortamında farenizin düğmelerinin durumunu öğrenmek için komut satırı aracını kullanabilirsiniz.

Misal

$ 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

Ancak bu bilgiler sizi yalnızca bir çözüme götürür. Yukarıdan ayıklamak istediğiniz temel bilgiler, farenizdeki belirli bir düğmeyle hangi sayının ilişkilendirilmiş olduğudur. Örneğimde sol tuşa "buton 1" basıyorum.

xbindkeys

Basılan bir düğmeyle ilişkili bir eylem ayarlamak için bu aracı kullanabilirsiniz. Hatta bir tuşa basma veya hatta bir tuşa + basılması gereken bir kural bile ayarlayabilirsiniz.

Misal

Önce xbindkeys paketlerinin kurulu olduğundan emin olmanız gerekir.

Ardından, bir şablon xbindkeys yapılandırma dosyası oluşturmak için aşağıdaki komutu yalnızca bir kez çalıştırmanız gerekir.

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

Oluşturulan dosya ile bir metin düzenleyicide açabilir ve şöyle bir kural ekleyebilirsiniz:

"xterm"
  b:3

Bu kural xterm, düğmeye 3 basıldığında programı çalıştırmak istediğimizi belirtir . "Düğme 3", sağ fare düğmemdir.

Yukarıdaki değişiklik yapıldığında, zaten çalışıyorsa xbindkey'leri öldürmeli ve sonra yeniden başlatmalıyız.

$ killall xbindkeys
$ xbindkeys

Şimdi bu fareyle sağ fare düğmesine her tıkladığımda, bir xtermçalıştırılacak.

Referanslar


2
Ancak bu yalnızca oluşturulan pencere için geçerlidir. Bu etkinliği küresel olarak nasıl yakalayabilirim?
MartinP

4

sadece fare tıklamasıyla (veya tekerlek olayında) baster komutunu xterm'de çalıştırmak istiyorsanız bu örneği deneyebilirsiniz:

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

bu tekerleğin etkinliği içindir (bunun yerine tıklama kümesi 12 için)


Lütfen açıklayabilir misiniz?
lucaswxp

2

Sen olamaz kek düğme baskı olayı ve yemek. Betiğinizin bir fare olayı almasını istiyorsanız, fare olayı herhangi bir uygulama yerine betiğinize gönderilir - yani betiğinizin fare olayını alması gerekir. Senaryonuz olayı talep etmiyorsa, onu alması gereken pencere olayı alır.

İsterseniz, fare olayını odaklanan pencereye veya verilen koordinatlardaki pencereye ( xdotool click) yeniden gönderebilirsiniz .

Belirli fare veya klavye olaylarında komut dosyası yürütmek için XBindKeys kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.