Deteksi jika tombol mouse ditekan, lalu aktifkan skrip atau perintah

11

Apakah ada cara untuk mendapatkan status tombol mouse dari bash? Xdotool hanya bisa mendapatkan lokasi mouse.

Saya ingin mengatur sesuatu di mana saya dapat mendefinisikan aturan di mana ketika tombol mouse ditekan, skrip dapat dijalankan.

MartinP
sumber
Anda tentu saja dapat mendeteksi kejadian mouse , tetapi saya tidak percaya ada cara untuk menanyakan sistem apakah tombol mouse sedang ditekan sekarang . Setiap pengurai aktivitas mouse yang pernah saya tonton, jika Anda akan memaafkan kodesemu, MouseButton1Downdan MouseButton1Upperistiwa untuk ditindaklanjuti.
DopeGhoti
Saya memerlukan beberapa skrip yang akan menonton mouse dan ketika tombol kiri ditekan, ia akan melakukan sesuatu.
MartinP
Perlu klarifikasi. Apakah Anda menginginkan sesuatu ketika Anda berada di shell, dan Anda mengklik jendela terminal, shell spesifik itu melakukan sesuatu? Atau Anda menginginkannya sehingga ketika Anda mengklik tombol mouse tertentu di mana saja skrip dijalankan (dan Anda tidak perlu melihat skrip di terminal)?
Patrick
Saya perlu skrip, yang akan saya jalankan dan kemudian akan menonton untuk tombol mouse di mana saja di desktop. Itu tidak akan memblokir mouse, itu hanya akan mendengarkannya. Saya mencoba untuk menulis program untuk itu dalam C dengan Xlib, tetapi hanya memiliki XGrabButton dan XGrabPointer dan saya tidak mau, karena ia meraih pointer dan jendela lain tidak mendaftar peristiwa klik.
MartinP

Jawaban:

11
xinput --query-state <mouse_id>

Ini memberi Anda keadaan untuk semua tombol mouse, yang terlihat seperti ini:

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 dapat diperoleh dari:

xinput --list

Berikut ini adalah script pengamat tombol mouse kecil:

#!/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

Anda mungkin perlu mengubah string deteksi MOUSE_ID ('mouse') menjadi sesuatu yang lain.

Pemenang
sumber
xinput --listmemberi saya X Input extension not available.. Sayangnya Google dalam hal ini tidak mengungkapkan apa pun yang membantu dalam kasus saya: Xvnc4dalam VM Debian minimal. Kemungkinan saya kurang beruntung
Tino
6

Anda dapat menggunakan alat baris perintah xevuntuk mengetahui status tombol mouse Anda dalam lingkungan X.

Contoh

$ 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

Tetapi informasi ini hanya memberi Anda sebagian solusi. Informasi kunci yang ingin Anda ekstrak dari atas adalah nomor mana yang dikaitkan dengan tombol tertentu pada mouse Anda. Dalam contoh saya, saya menekan tombol kiri, "buton 1".

xbindkeys

Anda dapat menggunakan alat ini untuk mengatur tindakan yang terkait dengan tombol yang ditekan. Anda bahkan dapat mengatur aturan yang mengharuskan tombol ditekan atau bahkan tombol + ditekan bersamaan.

Contoh

Anda harus terlebih dahulu memastikan paket xbindkeys diinstal.

Maka Anda harus menjalankan perintah berikut, satu kali saja, untuk membuat file konfigurasi template xbindkeys.

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

Dengan file yang dibuat Anda dapat membukanya di editor teks dan menambahkan aturan seperti ini:

"xterm"
  b:3

Aturan ini menyatakan bahwa kita ingin menjalankan program xtermketika tombol 3 ditekan. "Tombol 3" adalah tombol kanan mouse saya.

Dengan perubahan di atas, kita perlu mematikan xbindkeys jika sudah berjalan dan kemudian restart.

$ killall xbindkeys
$ xbindkeys

Sekarang dengan ini berjalan setiap kali saya mengklik tombol kanan mouse, sebuah xtermakan dieksekusi.

Referensi

slm
sumber
2
Tapi itu hanya berfungsi untuk jendela yang dibuat. Bagaimana saya bisa menangkap peristiwa itu secara global?
MartinP
4

jika Anda hanya ingin menjalankan perintah bash di xterm pada klik mouse (atau acara roda) Anda dapat mencoba contoh ini:

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

ini untuk acara roda (untuk set klik 12 sebagai gantinya)

Ivan M.
sumber
Tolong, bisakah Anda menjelaskan?
lucaswxp
2

Anda tidak dapat memiliki acara tekan tombol kue dan memakannya. Jika Anda ingin skrip Anda menerima acara mouse, maka acara mouse akan dikirim ke skrip Anda daripada aplikasi lain - itu berarti skrip Anda harus mengambil acara mouse. Jika skrip Anda tidak mengklaim acara, maka jendela yang seharusnya mendapatkannya akan mendapatkannya.

Jika mau, Anda dapat mengirim ulang acara mouse ke jendela fokus atau jendela pada koordinat yang diberikan ( xdotool click).

Anda dapat menggunakan XBindKeys untuk menjalankan skrip pada acara mouse atau keyboard tertentu.

Gilles 'SANGAT berhenti menjadi jahat'
sumber