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
欢迎关注微信公众号,留言交流。

相关文章:

翻译: