Como obter valores Unicode de chaves inativas do teclado do console de mediumraw

2

Em um aplicativo que é executado em um buffer de quadros, eu leio as chaves de / dev / tty depois de tê-las configurado para o modo mediumraw usando

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

Para obter os valores unicode das chaves que representam chars, eu faço algo nos moldes de

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

Isso funciona muito bem, exceto por uma coisa: quando meu teclado tem caracteres mortos, eu recebo aqueles retornados como 0x0400, 0x0401, 0x0402 etc. O 0x04 é KT_DEAD, então isso parece certo, mas quando eu leio o diacrítico do kernel tabela em uma estrutura kbdiacrsuc, vejo que isso espera códigos de caracteres reais em vez de 01, 02, ... Então, como faço para obter esses códigos de caracteres das chaves inativas?

    
por Gunnar 06.01.2016 / 11:52

1 resposta

1

Respondendo minha própria pergunta aqui, como eu descobri. Estudar /usr/include/linux/keyboard.h revelou que pode haver 6 desses caracteres mortos a serem levados em conta. Depois de olhar o que está no struct kbdiacrsuc, eu criei isto:

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

Em seguida, fazer uma pesquisa com um desses como diacr e outro caractere como base gera o caractere acentuado desejado.

    
por 07.01.2016 / 15:38