从定制键盘获取键的键代码


12

我正在尝试将Minitel转换为具有Raspberry Pi的计算机。

这是一个迷你旅馆:

在此处输入图片说明

因此,我将minitel键盘的矩阵焊接到了USB键盘pcb上,如下所示: 在此处输入图片说明

一切正常,我从自定义键盘上收到了一些键。我只需要适当地重新映射键即可。

因此,我试图创建一个程序,要求我按下a并捕获相应的键码,然后使用自定义键盘的所有键最终生成一个xmodmap文件。

我唯一的问题是我不知道如何才能获得该键码(仅此而已!)。我尝试过,xev但是显示的数据太多,无法将其过滤掉。

我知道我可以手工跟踪所有键码,但是我将转换10个Minitel,所以我希望有一个更快的方法!


您可以为MESS项目从拥有的Minitel中转储ROM吗?该硬件目前尚未使用,并且具有历史意义。
sendmoreinfo 2013年

为什么不呢,但是我不知道该怎么做!
xavier.seignard

Answers:


6

我假设您正在尝试在shell或类似程序中执行此操作(否则,您将直接使用X库)。如果是这样,您可能会发现xinput --test «device-name»解析起来容易得多。

不幸的是,它确实不是shell脚本友好的。但是您可以使其与一起使用stdbuf。它会一直运行到您将其杀死为止,但是您的shell脚本可以将其传递给read

因此,您可以执行以下操作:

stty -echo
stdbuf -oL xinput test 'AT Translated Set 2 keyboard' \
    | perl -nE 'BEGIN {$| = 1} m/^key press\s+(\d+)/ and say $1' \
    | for key in q w e r t y; do
         echo -n "Please press $key: "
         read -r keycode
         echo "key $key = $keycode"
    done
stty echo

您将需要使用正确的键盘名称来代替“ AT Translated Set 2键盘”。您可以通过以下方式找到它xinput list

anthony@Zia:~$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]

不幸的是,您必须使用特定的设备,而不能使用核心键盘。

(此外,您还需要找到一种杀死上述xinput的方法,或者只是在输入所有键后才满足于按Control-C。并且您可能想列出比qwerty更多的键。 )


谢谢德罗伯特!完全符合我的需求!我使用id键盘的代替名称,因为与两个相同的名称存在冲突。所以xinput test 1818是我的键盘ID。
xavier.seignard

如果我可以用一个不会长时间运行的命令做同样的事情(即在按下第一个键后停止并返回键代码),那将是一种梦想:)
xavier.seignard

@ xavier.seignard我尝试过,但找不到能做到这一点的实用程序。但是使用xinput源并使其以这种方式工作相当容易...检查test.c,看起来相关的功能是print_events。也许xorg会打个补丁来添加一个在n个事件后停止的标志?
derobert

@ xavier.seignard我只是遇到了一种方法来执行此操作…… xinput --query-state给出当前状态,并立即退出。您可以忙循环。
derobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.