Mediumraw 콘솔 키보드에서 데드 키의 유니코드 값을 얻는 방법

Mediumraw 콘솔 키보드에서 데드 키의 유니코드 값을 얻는 방법

프레임 버퍼에서 실행되는 애플리케이션에서 Mediumraw 모드로 설정한 후 /dev/tty에서 키를 읽었습니다.

int fd = open("/dev/tty", O_RDWR);
...
ioctl(fd, KDSKBMODE, K_MEDIUMRAW);

문자를 나타내는 키의 유니코드 값을 얻으려면 다음과 같이 했습니다.

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로 사용하고 다른 문자를 조회 기준으로 사용하면 원하는 악센트 문자가 생성됩니다.

관련 정보