GNU compilateur KEY_F pas détecter les touches de fonction
Question
En fait, j'ai détection clé pour mon application de la console, pour une raison quelconque, il ne détecte pas les touches de fonction.
Voici mon code, j'utilise le compilateur GNU sous Linux. Toute aide ou idées seraient grandement appréciés.
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;
}
La solution
Je ne suis pas un expert en malédictions, mais un peu de lecture des pages de manuel me Netted ce programme:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
Lorsque j'appuie sur une touche F, I obtenir une séquence de 3 caractères: 27, 79, (80 + N-1) où N est le numéro de la touche F. Je pense que votre commutateur devra reconnaître que la clé est une séquence d'échappement et le manipuler spécialement.
Modifier Ce modèle ne vaut que pour F1-F4. F5 il change vers le haut. Vous aurez probablement envie d'intégrer les macros de malédictions F (n).
Autres conseils
Avoir la même question, personnellement.
Castings la macro F (n) à un type char effacé par magie la question pour moi;
cmd = getch();
switch(cmd){
case 'r':
addch('r');
break;
case 'w':
addch('x');
break;
default:
if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
}
et autres. Travaillé pour F2 à F10 F12 comprises. F de 1, 10 et 11 sont « occupés » par manque d'un meilleur mot sur mon xterm. (F1 ouvre la fenêtre d'aide, F11 permet de basculer en mode plein écran, etc.) Encore une fois, je ne peux pas dire que je ne pouvais pas commencer à deviner pourquoi cela fonctionne.
Vous devrez peut-être activer la fonctionnalité « clavier » du terminal en utilisant la fonction keypad
. A partir de la page de manuel clavier (3x):
int keypad(WINDOW *win, bool bf);
Le clavier permet au clavier du terminal de l'utilisateur. Si elle est activée ( bf est true ), l'utilisateur peut appuyer sur une touche de fonction (par exemple une flèche) et wgetch renvoie une valeur unique représentant la touche de fonction, comme dans KEY_LEFT . Si elle est désactivée ( bf est false ), malédictions ne fonctionne pas traiter clés spécialement et le programme doit interpréter les séquences d'échappement lui-même. Si le clavier du terminal peut être activé (fait de transmettre) et hors (Fait travailler localement), l'activation de cette option, le clavier du terminal pour être activée lorsque wgetch est appelé. La valeur par défaut pour le clavier est faux.