X11

我如何找出哪個程序“擁有”熱鍵?

  • March 10, 2022

我在帶有 4.2.0 核心的 Gentoo 之上執行 XFCE 4.12。我鍵盤上的 PlayPause 按鈕曾經用作 VLC 的全域熱鍵。現在 VLC 甚至無法辨識密鑰。它確實看到“Alt + Media Play Pause”,但不是單獨的鍵。

有沒有辦法查看是否以及哪些程序可能正在擷取該密鑰?

當我執行文件xdotool key "XF86LogGrabInfo"讀取tail /var/log/Xorg.0.log

[ 10138.690] (II) Printing all currently active device grabs:
[ 10138.690] (II) End list of active device grabs

要找出哪個應用程序/程序獲取了您的密鑰,請使用 debug keysym XF86LogGrabInfo。用於xdotool同時按 + 鍵XF86LogGrabInfo,例如在終端執行中

KEY=XF86AudioPlay
xdotool keydown ${KEY}; xdotool key XF86LogGrabInfo; xdotool keyup ${KEY} 

tail /var/log/Xorg.0.log

然後使用注意檢查輸出,gnome 3/gdmsystemd不再記錄到Xorg.0.log(而是記錄到日誌)。在這種情況下,您可以執行

journalctl -f

然後在另一個終端中執行xdotool命令。切換到第一個終端,你會看到類似

/usr/lib/gdm/gdm-x-session[629]: Active grab 0x40c0a58e (xi2) on device 'Virtual core keyboard' (3):
/usr/lib/gdm/gdm-x-session[629]: client pid 708 /usr/bin/gnome-shell
/usr/lib/gdm/gdm-x-session[629]: at 32595124 (from passive grab) (device frozen, state 6)
/usr/lib/gdm/gdm-x-session[629]: xi2 event mask for device 3: 0xc000
/usr/lib/gdm/gdm-x-session[629]: passive grab type 2, detail 0xac, activating key 172

在上面的範例中,獲取密鑰的程序(客戶端)是gnome-shell.

我如何弄清楚鍵的名稱?

查看xdotool使用手冊man xdotool線上版本,因為它列出了許多特殊鍵。例如,“alt+r”、“Control_L+J”、“ctrl+alt+n”、“BackSpace”。LinuxQuestions wiki 也有一個可以使用的 X Keysyms 列表。為了使事情更容易xdotool一些,其中一些也有別名,例如按下 Shift-Alt-Tab 將只是shift+alt+Tab. 要驗證這確實確實點擊了該組合鍵,您可以將輸入發送到xev,這是一個程序,它將列印到控制台的任何鍵或滑鼠事件。只需在兩秒鐘過去之前sleep 2; xdotool keydown ${KEY}切換到視窗以查看在該視窗上點擊的鍵。xev然後它應該輸出一系列事件,

PropertyNotify event, serial 168, synthetic NO, window 0x1e00001,
   atom 0x13e (_GTK_EDGE_CONSTRAINTS), time 4390512, state PropertyNewValue

MappingNotify event, serial 168, synthetic NO, window 0x0,
   request MappingKeyboard, first_keycode 8, count 248

KeyPress event, serial 168, synthetic NO, window 0x1e00001,
   root 0x163, subw 0x0, time 4390719, (882,657), root:(1000,771),
   state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XmbLookupString gives 0 bytes: 
   XFilterEvent returns: False

KeyPress event, serial 169, synthetic NO, window 0x1e00001,
   root 0x163, subw 0x0, time 4390738, (882,657), root:(1000,771),
   state 0x8, keycode 23 (keysym 0xff09, Tab), same_screen YES,
   XLookupString gives 1 bytes: (09) " "
   XmbLookupString gives 1 bytes: (09) "   "
   XFilterEvent returns: False

引用自:https://unix.stackexchange.com/questions/261371