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... */
    }

次に、文字の1つをdiacrとして使用し、他の文字をルックアップ基準として使用すると、目的のアクセント文字が生成されます。

おすすめ記事