LINUX.ORG.RU

Как считывать клавиши F1...F12?

 , ,


0

1

Перевел терминал в неканонический режим. Следующим кодом (язык Си) хочу захватить любую из клавиш F*. Записать код в строку. И затем проверить содержимое этой самой строки для дальнейших действий.

char input[10];
read(0, input, 10);
if (strcmp(input, "\033[15~") == 0)   //если F5
...
Проблема в том, что в неканоническом режиме считывается только 1 символ после нажатия клавиши. Как правильно считать нажатую клавишу F5?



Последнее исправление: kennydzzze (всего исправлений: 1)

cat /dev/input/event*

anonymous
()

Читай «The Linux keyboard and console HOWTO» и man showkey (из пакета kbd)

sigurd ★★★★★
()

Проверять, что считанный символ — escape (27), дальше дочитывать по одному и парсить. F5 это ещё четыре байта после escape.

Проверять какие именно удобно чем-то вроде этого:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int main() {
    char c;
    struct termios savetty;
    struct termios tty;
        tcgetattr(0, &savetty);
        tty = savetty;
        tty.c_lflag &= ~(ICANON|ECHO|ISIG);
        tty.c_cc[VMIN] = 1;
        tty.c_cc[VTIME] = 0;
        tcsetattr(0, TCSAFLUSH, &tty);
    while (1) {
        read(0, &c, 1);
        printf("%d\n", c);
        if (c == 'q')
            return 0;
    }
    return 0;
}

evilface ★★
()
Ответ на: комментарий от evilface

Спасибо, помогли, все работает. Только не понимаю почему после проверки на символ '\033' я вызываю read() в цикле и она не требует повторного ввода, а как бы продолжает считывать символы, которые не влезли после самого первого ввода. Байты, которые не влезли, все равно записываются в поток ввода?

kennydzzze
() автор топика
Ответ на: комментарий от kennydzzze

Потому что терминал отдаёт сразу несколько байт за эти клавиши. read(2) читает из файла указанное количество байт. В данном случае файл — /dev/tty, твой терминал, а данные в нём — ввод с клавиатуры. Соответственно, на всякие особые многобайтные кнопки /dev/tty хранит в себе и готов выдать сразу много байт. А раз читаешь ты лишь один, остальные лежат у него в буффере. Так оно в неканоническом режиме работает.

evilface ★★
()
Ответ на: комментарий от evilface

А раз читаешь ты лишь один, остальные лежат у него в буффере. Так оно в неканоническом режиме работает.

Оно так и в каноничном работает, вся разница - когда начать отдавать, при VMIN или при '\n' в icanon.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Вот именно что есть разница, когда управление вернётся в программу, когда пользователь одну кнопку набрал или когда целую строку. Это важно. Возможно, я не прав, что не акцентировал на этом внимание.

С другой стороны, есть ещё всякие милые вещи, которые терминал в каноническом режиме делает сам. К примеру, обрабатывает ^C, ^D, backspace, etc, выкидывает из ввода \n и кучу других символов, ограничивает ввод до \n. Разница так что довольно большая в плане работы, на мой взгляд.

evilface ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.