Невозможно получить правильный ввод с клавиатуры из буфера клавиатуры в linux - PullRequest
0 голосов
/ 09 января 2020

Я пишу программу, которая будет просто читать буфер клавиатуры и распечатывать текущую нажатую клавишу на терминале. Программа будет запускаться из командной строки без запуска X-сервера, поэтому важно, чтобы она читала прямо с устройства. Используя API ввода linux, я могу прочитать коды клавиш, но они хранятся в неправильной переменной (event.value, а не event.code). Более того, в некоторых системах я вообще не могу получить правильный код, а он просто выкидывает мусор. Я также пытался использовать getch () из библиотеки ncurses, но она не читает некоторые специальные ключи, такие как увеличение и уменьшение громкости. Вот мой сокращенный код:

#include <linux/input.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{   
    int fd = 0;
    char device[PATH_MAX];

    /*
    *
    *This code finds the first keyboard device in /dev/input/by-path/
    *
    */

    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir ("/dev/input/by-path/")) != NULL) {
        /* print all the files and directories within directory */
        while ((ent = readdir (dir)) != NULL) {
             if(strstr(ent->d_name, "kbd") != NULL)
             {
                sprintf(device, "/dev/input/by-path/%s", ent->d_name);
             }
        }
        closedir (dir);
    }

    /*
    *
    *This code reads the keyboard buffer and prints the key code
    *
    */

    while(true)
    {
        // Read the key from the keyboard buffer
        int fd1 = 0;
        if((fd1 = open(device, O_RDONLY)) > 0 ) 
        {
            struct input_event event;
            unsigned int key = 0;
            read(fd1, &event, sizeof(struct input_event));
            key = event.value; //seems contrary to documentation, but it works(mostly)

            printf("Key Code: %d\n", key);
        }

    }
}
...