使用 xbindkeys 检测按住的键

使用 xbindkeys 检测按住的键

我使用xbindkeys绑定 Alt+left 和 Alt+right 来chvt循环虚拟终端,如上所述这里。我将算法修改为关于可用虚拟终端数量(六个)的模块化。我xbindkeys为窗口管理器的每个实例启动一个守护进程(例如,在 tty1 上启动 dwm 之前,同样为 tty2 上的 openbox 启动);即,每个 tty 都有自己的xbindkeys实例。

显然,xbindkeys只能检测新的按键事件,而不能检测残留的按键。因此,如果我按 Alt+right 从tty1切换到tty2然后想要继续到tty3,我必须释放这两个键并重新按下这两个键才能前进。对于非Xtty,我可以按住两个键,也可以Alt在点击箭头键时按住两个键。可以用 复制此功能(即按键记忆)吗xbindkeys?由于我显然需要多个实例(如上所述,每个 WM 一个实例),并且程序 ( xbindkeys) 似乎检测新生的按键事件而不是按住的按键,因此这可能是不可能的。任何解决方法将不胜感激。

答案1

要继续您当前开发的内容,您可以使用埃维姆使用实用程序evtest和 的工具包evemu-event。列出输入事件设备sudo evtest并找到与您的键盘对应的行。我有一个特殊的键盘,所以我得到了:

/dev/input/event2:      HID 05f3:0007

现在选择该数字(在我的例子中为 2)并按您想要识别的键(Alt 为您)。我使用左移并得到

Event: time 15094562, -------------- SYN_REPORT ------------
Event: time 15094562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 15094562, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1

我们在这里看到,当我按下 Shift 时,我得到了一个 EV_KEY 类型的事件,代码 KEY_LEFTSHIFT 的值为 1,当我释放它时,也得到了一个类似的事件,值为 0。

现在,您可以随时简单地查询该键的状态,例如在 chvt 之后。就我而言,使用

sudo evtest --query  /dev/input/event2 EV_KEY KEY_LEFTSHIFT

如果值为 0,则该命令的返回码为 0;如果值为 1,则返回码为 10。您可以使用echo $?显示该值。

了解按键的状态后,您现在可以模拟按键事件,以便 X11 服务器看到“当前”状态。就我而言,我会做

sudo evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTSHIFT --value 1

正如您可能想象的那样,对于您原来的问题可能有一个更简单的解决方案。您可以使用 libevent 查看不同的解决方案,而不是xbindkeys在此处使用并解决此问题。 C 中有例子Linux USB 输入子系统第2部分在 Linux 杂志上。您的系统可能有一个Python库埃夫德夫让这变得更容易。

相关内容