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 是个二进制程序,直接替换,并不不麻烦。
版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。