GNU compilador key_f não detectando chaves de função
Pergunta
Basicamente, tenho a detecção de chaves para o meu aplicativo de console, por algum motivo, não está detectando teclas de função.
Aqui está o meu código, estou usando o GNU Compiler no Linux. Qualquer ajuda ou sugestões são bem vindos.
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;
}
Solução
Eu não sou especialista em maldições, mas um pouco de leitura do homem das páginas me rendeu neste programa:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
Quando pressiono uma tecla F, recebo uma sequência de 3 caracteres: 27, 79, (80 + n-1) em que n é o número da tecla F. Eu acho que sua mudança terá que reconhecer que a chave é uma sequência de fuga e lidar com ela especialmente.
Editar: Esse padrão é mantido apenas para F1-F4. F5 muda. Você provavelmente vai querer incorporar as macros f (n) a partir de maldições.
Outras dicas
Tendo o mesmo problema, pessoalmente.
Lançar a macro f (n) para um tipo de char limpou magicamente o problema para mim;
cmd = getch();
switch(cmd){
case 'r':
addch('r');
break;
case 'w':
addch('x');
break;
default:
if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
}
e similar. Trabalhou para F2 a F10 Plus F12. 1, 10 e 11 estão "ocupados" por falta de uma palavra melhor no meu Xterm. (F1 abre a janela de ajuda, o F11 alterna o modo de tela cheia, etc.) Novamente, não posso enfatizar o suficiente para não poder começar a adivinhar por que isso funciona.
Pode ser necessário ativar a funcionalidade "teclado" do terminal usando o keypad
função. Da página manual do teclado (3x):
int keypad(WINDOW *win, bool bf);
o teclado A opção permite o teclado do terminal do usuário. Se ativado (BF é VERDADE), o usuário pode pressionar uma tecla de função (como uma tecla de seta) e Wgetch retorna um único valor que representa a chave da função, como em Key_left. Se desativado (BF é FALSO), maldições não trata as chaves da função especialmente e o programa precisa interpretar as próprias seqüências de fuga. Se o teclado no terminal puder ser ativado (feito para transmitir) e desligado (feito para funcionar localmente), ativar essa opção faz com que o teclado terminal seja ligado quando ligado quando Wgetch é chamado. O valor padrão para o teclado é falso.