Phát hiện nếu nhấn nút chuột, sau đó gọi tập lệnh hoặc lệnh


11

Có cách nào để có được trạng thái nút chuột từ bash không? Xdotool chỉ có thể có được vị trí chuột.

Tôi muốn thiết lập một cái gì đó để tôi có thể xác định quy tắc khi nhấn nút chuột, tập lệnh có thể được thực thi.


Bạn chắc chắn có thể phát hiện các sự kiện chuột , nhưng tôi không tin có cách nào để hỏi hệ thống nếu nút chuột hiện đang được nhấn . Mọi trình phân tích hoạt động của chuột mà tôi đã thấy đồng hồ, nếu bạn tha thứ cho mã giả MouseButton1DownMouseButton1Upcác sự kiện để hành động.
DopeGhoti

Tôi cần một số kịch bản sẽ xem chuột và khi nhấn nút trái, nó sẽ làm một cái gì đó.
MartinP

Cần làm rõ. Bạn có muốn một cái gì đó khi bạn ở trong một cái vỏ và bạn nhấp vào cửa sổ đầu cuối, cái vỏ cụ thể đó sẽ làm gì đó không? Hoặc bạn có muốn nó để khi bạn nhấp vào một nút chuột cụ thể ở bất cứ nơi nào một tập lệnh được chạy (và bạn không cần phải xem tập lệnh trong một thiết bị đầu cuối)?
Patrick

Tôi cần kịch bản, tôi sẽ chạy và sau đó nó sẽ xem các nút chuột ở bất cứ đâu trên máy tính để bàn. Nó sẽ không chặn chuột, nó sẽ chỉ nghe nó. Tôi đã cố gắng viết chương trình cho nó bằng C với Xlib, nhưng nó chỉ có XGrabButton và XGrabPulum và tôi không muốn, vì nó lấy con trỏ và các cửa sổ khác không đăng ký các sự kiện nhấp chuột.
MartinP

Câu trả lời:


11
xinput --query-state <mouse_id>

Điều này cung cấp cho bạn trạng thái cho tất cả các nút chuột, trông giống như thế này:

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

Có thể lấy mouse_id từ:

xinput --list

Đây là một kịch bản xem nút chuột nhỏ:

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

Bạn có thể cần thay đổi chuỗi phát hiện MOUSE_ID ('chuột') sang thứ khác.


xinput --listmang lại cho tôi X Input extension not available.. Đáng buồn thay, Google cho vấn đề này không tiết lộ bất cứ điều gì hữu ích trong trường hợp của tôi: Xvnc4trong một máy ảo Debian tối thiểu. Có khả năng tôi không gặp may
Tino

6

Bạn có thể sử dụng công cụ dòng lệnh xevđể tìm hiểu trạng thái của các nút chuột trong môi trường X.

Thí dụ

$ 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

Nhưng thông tin này chỉ giúp bạn một phần giải pháp. Thông tin chính bạn muốn trích xuất từ ​​phía trên là số nào được liên kết với một nút cụ thể trên chuột của bạn. Trong ví dụ của tôi, tôi đang nhấn nút bên trái, "buton 1".

xbindkey

Bạn có thể sử dụng công cụ này để thiết lập một hành động liên quan đến việc nhấn nút. Bạn thậm chí có thể thiết lập quy tắc yêu cầu nhấn phím hoặc thậm chí là nút + phím được nhấn cùng nhau.

Thí dụ

Trước tiên bạn cần đảm bảo các gói xbindkeys đã được cài đặt.

Sau đó, bạn sẽ cần chạy lệnh sau, chỉ một lần duy nhất, để tạo tệp cấu hình xbindkeys mẫu.

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

Với tệp được tạo, bạn có thể mở tệp trong trình soạn thảo văn bản và thêm quy tắc như thế này:

"xterm"
  b:3

Quy tắc này nói rằng chúng tôi muốn chạy chương trình xtermkhi nhấn nút 3. "Nút 3" là nút chuột phải của tôi.

Với sự thay đổi ở trên, chúng ta cần phải giết xbindkey nếu nó đã chạy và sau đó khởi động lại nó.

$ killall xbindkeys
$ xbindkeys

Bây giờ với điều này chạy bất cứ khi nào tôi nhấp vào nút chuột phải, một xtermsẽ được thực hiện.

Người giới thiệu


2
Nhưng điều đó chỉ hoạt động cho các cửa sổ được tạo ra. Làm thế nào tôi có thể nắm bắt sự kiện đó trên toàn cầu?
MartinP

4

nếu bạn chỉ muốn chạy lệnh bash trong xterm khi nhấp chuột (hoặc sự kiện bánh xe), bạn có thể thử ví dụ này:

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

đây là sự kiện bánh xe (thay vào đó là tập 12)


Xin vui lòng, bạn có thể giải thích?
lucaswxp

2

Bạn không thể có sự kiện nhấn nút bánh của bạn và ăn nó. Nếu bạn muốn tập lệnh của mình nhận được một sự kiện chuột, thì sự kiện chuột sẽ được gửi đến tập lệnh của bạn thay vì bất kỳ ứng dụng nào khác - điều đó có nghĩa là tập lệnh của bạn phải lấy sự kiện chuột. Nếu tập lệnh của bạn không yêu cầu sự kiện thì cửa sổ sẽ lấy nó.

Nếu bạn muốn, bạn có thể gửi lại sự kiện chuột đến cửa sổ tập trung hoặc cửa sổ ở tọa độ đã cho ( xdotool click).

Bạn có thể sử dụng XBindKeys để thực thi tập lệnh trên một số sự kiện chuột hoặc bàn phím nhất định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.