Проблема со считыванием кодов нажатых клавиш
Есть в нашей (научной) группе некая старая программка, использующая «самодельный getch()». Всё годами работало без проблем, а сегодня на одной из машин поимели проблему. Суть в том, что при нажатии любой клавиши, генерирующей esc-последовательность, дальнейшие нажатия не считываются. Код примера такой:
#include <stdio.h>
#include <termios.h>
int
getch()
{
struct termios old_settings;
struct termios new_settings;
tcgetattr(0, &old_settings);
new_settings = old_settings;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ICANON;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 1;
tcsetattr(0, TCSANOW, &new_settings);
int len = 1;
int buffer[10];
int code = buffer[0] = getchar();
if (buffer[0] == 27) // ESC
{
new_settings.c_cc[VMIN] = 0;
tcsetattr(0, TCSANOW, &new_settings);
while ((buffer[len] = getchar()) > 0)
{
++len;
}
}
if (len > 1)
{
// match ESC sequence
// code = ...
}
// debug print
printf("[");
for (int i = 0; i < len; ++i)
{
printf("%d, ", buffer[i]);
}
printf("\b\b] \n");
tcsetattr(0, TCSANOW, &old_settings);
return code;
}
int main(int argc, char** argv)
{
getch();
getch();
getch();
return 0;
}
Пр запуске на машинах с ubuntu 16.04/18.04 все работает как положено. Например при нажатии UpArrow, DownArrow, ESC будет выведено:
[27, 91, 65]
[27, 91, 66]
[27]
При запуске на системе с Арчем выдаётся следующее:
[27, 91, 65]
[-1]
[-1]
Т.е. после обработки первой esc-последовательности все последующие вызовы getchar() возвращают -1 (EOF).
Сборка разными компиляторами (gcc7, gcc8, gcc9, clang8) ничего не меняет, как и загрузка с разными версиями ядра (4.19.56-1-lts, 5.1.15-arch1-1-ARCH).
Подскажите, в чем тут может быть проблема и куда стоит копать. Похоже на какой-то баг, но где именно?