Linux環境按鍵檢測
最近升級 labwc 到 v0.6.5 的的時候,發現截屏按鍵 print 怎麼按都沒有任何反應。
原因可能是:
- 聯動的截屏軟件失效了;
- 按鍵壞了;
- 升級 labwc 導致的問題。
截屏軟件我用的grip + slurp + ksnip
的組合,通過調用 screenshot.sh 腳本實現,實測沒有問題。
1➜ pwd
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 是個二進制程序,直接替換,並不不麻煩。
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。