Linux環境按鍵檢測

最近升級 labwc 到 v0.6.5 的的時候,發現截屏按鍵 print 怎麼按都沒有任何反應。

原因可能是:

  • 聯動的截屏軟件失效了;
  • 按鍵壞了;
  • 升級 labwc 導致的問題。

截屏軟件我用的grip + slurp + ksnip的組合,通過調用 screenshot.sh 腳本實現,實測沒有問題。

1pwd
2/home/mephisto/.config/labwc
3➜  cat screenshot.sh
4#!/bin/sh
5NOW=$(date +"%Y-%m-%d-%H%M%S")
6grim -g "$(slurp )" -t png $HOME/Pictures/grim-$NOW.png
7QT_QPA_PLATFORM=xcb /usr/bin/ksnip $HOME/Pictures/grim-$NOW.png

難道是按鍵壞了?我 ¥1800 的裝備,一個按鍵好歹值個幾美元,沒這麼容易罷工吧!

問題是,Linux 環境下怎麼檢測 print 鍵是否有效呢?此時我想到了 xev 和 wev,分別對應 X 和 Wayland 環境下面的事件檢測。 悲劇的是,用這個兩個命令行工具檢測,唯獨 print 按鍵按下什麼輸出都沒有。我甚至把鍵帽扣動按了按,結果一樣無任何反應!

無奈之下,只能回退 labwc,重新登錄後,一切正常。這玩笑開大了,居然會有這種神奇問題,針對特定按鈕,定點狙擊啊。

普通人這個時候可能就不再追究了,而我晚上睡覺時都在想,怎麼能方便檢測按鍵有效呢?

總結如下:

1. 使用 xev 和 wev

X 環境使用 xev, Wayland 使用 wev,雖然我的問題由於特殊未知這個不能檢測,但是還是非常有用的。

如下所示,我按了 Enter 和 1 旁邊的那個按鍵(它叫 grave,我是看下面的輸出才知道的 😊) 會實時顯示出按鍵核心信息,按鍵名、key 等,按壓和鬆開是各顯示一條。

 1➜  ~ wev
 2[07:         wl_seat] name: seat0
 3[07:         wl_seat] capabilities: pointer keyboard
 4[10:    xdg_toplevel] configure: width: 0; height: 0
 5[09:     xdg_surface] configure: serial: 39874
 6[14:     wl_keyboard] keymap: format: 1 (xkb v1), size: 63738
 7[14:     wl_keyboard] repeat_info: rate: 25 keys/sec; delay: 600 ms
 8[14:     wl_keyboard] enter: serial: 39879; surface: 3
 9'                     sym: Return       (65293), utf8: '
10[14:     wl_keyboard] modifiers: serial: 0; group: 0
11                      depressed: 00000000
12                      latched: 00000000
13                      locked: 00000000
14[11:  wl_data_device] data_offer: id: 4278190080
15[4278190080:   wl_data_offer] offer: mime_type: TEXT
16[4278190080:   wl_data_offer] offer: mime_type: text/plain
17[4278190080:   wl_data_offer] offer: mime_type: text/plain;charset=utf-8
18[4278190080:   wl_data_offer] offer: mime_type: STRING
19[4278190080:   wl_data_offer] offer: mime_type: UTF8_STRING
20[11:  wl_data_device] selection: id: 4278190080
21[13:      wl_pointer] enter: serial: 39882; surface: 3, x, y: 197.863281, 79.218750
22[13:      wl_pointer] frame
23[10:    xdg_toplevel] configure: width: 0; height: 0
24                      activated
25[09:     xdg_surface] configure: serial: 39877
26[14:     wl_keyboard] key: serial: 39883; time: 24157739; key: 36; state: 0 (released)
27                      sym: Return       (65293), utf8: ''
28[14:     wl_keyboard] key: serial: 39884; time: 24162044; key: 49; state: 1 (pressed)
29                      sym: grave        (96), utf8: '`'
30[14:     wl_keyboard] key: serial: 39885; time: 24162200; key: 49; state: 0 (released)
31                      sym: grave        (96), utf8: ''
32[14:     wl_keyboard] key: serial: 39886; time: 24172492; key: 36; state: 1 (pressed)
33'                     sym: Return       (65293), utf8: '
34[14:     wl_keyboard] key: serial: 39887; time: 24172621; key: 36; state: 0 (released)
35                      sym: Return       (65293), utf8: ''
36[14:     wl_keyboard] key: serial: 39888; time: 24183338; key: 49; state: 1 (pressed)
37                      sym: grave        (96), utf8: '`'
38[14:     wl_keyboard] key: serial: 39889; time: 24183480; key: 49; state: 0 (released)

2. 使用 showkey 命令

如果你已經進入系統圖形界面,需要運行sudo showkey, 如下操作所示 99 是 print 鍵。

 1➜  ~ sudo showkey
 2[sudo] password for mephisto:
 3kb mode was ?UNKNOWN?
 4[ if you are trying this under X, it might not work
 5since the X server is also reading /dev/console ]
 6
 7press any key (program terminates 10s after last keypress)...
 8keycode  28 release
 9keycode  99 press
10keycode  99 release
11keycode  99 press
12keycode  99 release
13keycode   1 press
14keycode   1 release

如果在終端環境(可按Ctl + Alt + F1-F7, F1-F7 選一個切換到終端環境測試),輸入密碼後直接運行即可,無需 sudo。此時任何按鍵都會被攔截,只能等 10s 自動退出,不曾體驗過。

也就是說,showkey 纔是大招,不受各種環境影響,能用於檢測按鍵是是否物理損壞了。

有人會問,我直接找個能輸入字符的地方打字,眼睛看屏幕字符是否正確不就好了嗎?這種不能檢測各種功能按鍵比如 print

還有人會說,我是嵌入式工程師,寫程序檢測解決,的確可以。但 showkey 已經存在很久,拿來使用不耽誤時間。

總結,簡單鍵盤檢測用 xev 和 wev,特殊情況下用 showkey。

最後說明,新版本的 labwc 觸發截圖無效,估計是加發腳本 screenshot.sh 的時候就有異常了,沒有簡單調試方法,先回退解決,labwc 是個二進制程序,直接替換,並不不麻煩。

最後修改於: Tuesday, September 26, 2023

相關文章:

翻譯: