我使用xbindkeys
绑定 Alt+left 和 Alt+right 来chvt
循环虚拟终端,如上所述这里。我将算法修改为关于可用虚拟终端数量(六个)的模块化。我xbindkeys
为窗口管理器的每个实例启动一个守护进程(例如,在 tty1 上启动 dwm 之前,同样为 tty2 上的 openbox 启动);即,每个 tty 都有自己的xbindkeys
实例。
显然,xbindkeys
只能检测新的按键事件,而不能检测残留的按键。因此,如果我按 Alt+right 从tty1
切换到tty2
然后想要继续到tty3
,我必须释放这两个键并重新按下这两个键才能前进。对于非X
tty,我可以按住两个键,也可以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库埃夫德夫让这变得更容易。