如何从mediumraw控制台键盘获取死键的Unicode值

如何从mediumraw控制台键盘获取死键的Unicode值

在帧缓冲区中运行的应用程序中,我在将其设置为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 并使用另一个字符作为基础进行查找,会产生所需的重音字符。

相关内容