在帧缓冲区中运行的应用程序中,我在将其设置为mediumraw模式后从/dev/tty读取密钥
int fd = open("/dev/tty", O_RDWR);
...
ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
为了获取代表字符的键的 unicode 值,我做了一些类似的事情
struct kbentry entry;
entry.kb_table = (some combination of KG_* values or 0);
entry.kb_index = code & 0x7f; /* code is the value received by read()ing from /dev/tty */
ioctl(fd, KDSKBMODE, K_UNICODE);
ioctl(kbd->fd, KDGKBENT, &entry);
ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
/* unicode value is now in entry.kb_value */
这工作得很好,除了一件事:当我的键盘有死字符时,我得到的返回值为 0x0400、0x0401、0x0402 等。0x04 是 KT_DEAD,所以这看起来是正确的,但是当我将内核的变音表读入struct kbdiacrsuc,我看到它需要实际的字符代码而不是 01, 02, ... 那么,如何从死键中获取这些字符代码?
答案1
在这里回答我自己的问题,正如我已经弄清楚的那样。研究 /usr/include/linux/keyboard.h 发现可能只有 6 个死字符需要考虑。在查看了 struct kbdiacrsuc 中的内容后,我想出了这个:
switch (entry.kb_value) {
case K_DGRAVE: accent = 96; break;
case K_DACUTE: accent = 39; break;
case K_DCIRCM: accent = 94; break;
case K_DTILDE: accent = 126; break;
case K_DDIERE: accent = 34; break;
case K_DCEDIL: accent = 44; break;
default: /* whatever... */
}
然后,使用其中一个字符作为 diacr 并使用另一个字符作为基础进行查找,会产生所需的重音字符。