Чтение ESC в Linux во время небуферизованного ввода в C

Я написал функцию getch для программы. Я не мог использовать проклятия, поскольку он ломает терминал для iostream Я уже пользуюсь. Код:

inline std::string getch() {
char inp[4];
system("stty raw");
inp[0] = std::cin.get();
if(inp[0] == 27 && (inp[1] = std::cin.get()) != std::char_traits<char>::eof()) {
std::cin>>inp[2];
inp[3] = '\0';
}
else {
inp[1] = '\0';
}
system("stty cooked echo");
return std::string(inp);
}

Я знаю, что было бы лучше использовать termios.h вместо системных вызовов. Все работает нормально, если только ESC key, Я пытаюсь захватить стрелки, которые являются строкой, например, "\1B[A", Когда я обнаруживаю ESC в качестве первого символа я также прочитал вторые два, чтобы получить полный код ключа.
Проблема в том, что это не должно происходить, когда я нажимаю ESC так как это код 1B один. cin.get() должен return EOF когда буфер пуст во время чтения, но он просто останавливается.

Есть ли способ прочитать ESC ключ на linux без использования проклятий? Почему мое решение не работает?

Спасибо

1

Решение

После многих часов поисков я нашел решение. Я должен был использовать функцию чтения из unistd.h
Он заполняет массив заданного размера символами из ввода. При нажатии клавиши буфер заполняется всеми прочитанными символами (работает также на нескольких клавишах). Таким образом, ESC имеет просто {27,0,0, …, 0} и стрелку {27, ‘[‘, ‘A’, 0,0, …, 0}.
Я переписал свою функцию с помощью termios.h и поместил в библиотеку, так что любой может получить пользу.

Вот код:
ключ чтения на github

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]