GNU Compiler key_f не обнаружение функциональных клавиш
Вопрос
По сути, у меня есть ключевое обнаружение для моего консоли, по какой-то причине это не обнаружение функциональных клавиш.
Вот мой код, я использую компилятор GNU на Linux. Любая помощь или идеи были бы очень оценены.
refresh();
key = getch();
switch(key) {
case KEY_HOME: key = HOME; break;
case KEY_END: key = END; break;
case KEY_UP: key = UP; break;
case KEY_DOWN: key = DOWN; break;
case KEY_LEFT: key = LEFT; break;
case KEY_RIGHT: key = RIGHT; break;
case KEY_NPAGE: key = PGDN; break;
case KEY_PPAGE: key = PGUP; break;
case KEY_DC: key = DEL; break;
case KEY_IC: key = INSERT; break;
case KEY_F(1): key = F(1); break;
case KEY_F(2): key = F(2); break;
case KEY_F(3): key = F(3); break;
case KEY_F(4): key = F(4); break;
case KEY_F(5): key = F(5); break;
case KEY_F(6): key = F(6); break;
case KEY_F(7): key = F(7); break;
case KEY_F(8): key = F(8); break;
case KEY_F(9): key = F(9); break;
case KEY_F(10): key = F(10); break;
case KEY_F(11): key = F(11); break;
case KEY_F(12): key = F(12); break;
case KEY_ENTER: key = ENTER; break;
case KEY_BACKSPACE: key = BACKSPACE; break;
default:
//key = F(2); //For any function keypress, it jumps to default
if (NON_ASCII(key) != 0)
key = UNKNOWN;
}
Решение
Я не эксперт в курсах, но немного чтения Человек страниц носил мне эту программу:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
Когда я нажимаю клавишу F, я получаю 3-символьную последовательность: 27, 79, (80 + N-1), где n - это номер клавиши f. Я думаю, что ваш коммутатор должен будет распознать, что ключ - это последовательность побега и справляется с ней специально.
Редактировать: Этот шаблон держит только для F1-F4. F5 изменяет это. Вы, вероятно, захотите включить MACROS F (N) из проклейки.
Другие советы
Имея ту же проблему, лично.
Отказ от макроса F (N) в тип Char Magically очистил проблему для меня;
cmd = getch();
switch(cmd){
case 'r':
addch('r');
break;
case 'w':
addch('x');
break;
default:
if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
}
и тому подобное. Работал на F2 через F10 плюс F12. F's 1, 10 и 11 «заняты» из-за отсутствия лучшего слова на моем Xterm. (F1 открывает окно справки, F11 переключает полноэкранный режим и т. Д.) Опять же, я не могу подчеркивать достаточно, чтобы я не мог начать угадать, почему это работает.
Вам может потребоваться включить функциональность «клавиатуры» терминала, используя keypad
функция. С клавиатуры (3x) ручной страницы:
int keypad(WINDOW *win, bool bf);
То клавиатура Опция Включает клавиатуру терминала пользователя. Если включено (палец является ИСТИННЫЙ), пользователь может нажать функциональную клавишу (например, клавишу со стрелкой) и WGETCH Возвращает одно значение, представляющее функциональный ключ, как в Key_left.. Отказ Если отключено (палец является ЛОЖНЫЙ), проклятия Не обрабатывает функциональные клавиши специально, и программа должна интерпретировать саму эвакуирующие последовательности. Если клавиатура в терминале может быть включена (сделана для передачи) и выключена (сделана для работы локально), включение этой опции приводит к включению клеммной клавиатуры, когда WGETCH называется. Значение по умолчанию для клавиатуры ложно.