GNU compilatore KEY_F non rilevare tasti funzione
Domanda
In sostanza, ho rilevamento chiave per la mia applicazione console, per qualche motivo non è la rilevazione tasti funzione.
Ecco il mio codice, sto usando GNU compilatore su linux. Qualsiasi aiuto o idee sarebbe molto apprezzato.
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;
}
Soluzione
Non sono un esperto di maledizioni, ma un po 'di lettura di pagine man mi compensate questo programma:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
Quando si preme un tasto F, ottengo una sequenza di 3 caratteri: 27, 79, (80 + N-1), dove N è il numero del tasto F. Penso che lo switch dovrà riconoscere che la chiave è una sequenza di escape e gestirlo in modo speciale.
Modifica Questo modello vale solo per la F1-F4. F5 cambia in su. Probabilmente si vorrà per incorporare le macro (n) F da maledizioni.
Altri suggerimenti
Avere lo stesso problema, personalmente.
Casting la macro F (n) a un tipo char magicamente cancellato il problema per me;
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 simili. Lavorato per F2 a F10 F12 inclusa. F 1, 10 e 11 sono "occupati" per mancanza di una parola migliore sul mio xterm. (F1 si apre la finestra di aiuto, F11 alterna modalità a schermo intero, ecc) Anche in questo caso, non posso sottolineare abbastanza che non ho potuto cominciare a indovinare perché che funziona.
Potrebbe essere necessario per attivare la funzionalità "tastiera" del terminale utilizzando la funzione keypad
. Dalla pagina di manuale tastiera (3x):
int keypad(WINDOW *win, bool bf);
Il Tastiera opzione abilita la tastiera dell'utente del terminale. Se abilitato ( bf è TRUE ), l'utente può premere un tasto funzione (ad esempio un tasto freccia) e wgetch restituisce un singolo valore che rappresenta il tasto funzione, come in KEY_LEFT . Se disabilitato ( bf false ), maledizioni non funziona treat chiavi appositamente e il programma deve interpretare le sequenze di escape stesso. Se la tastiera del terminale può essere attivata (fatte a trasmissione) e off (Fatti funzionare localmente), attivando questa opzione provoca la tastiera del terminale per essere acceso quando wgetch si chiama. Il valore di default per la tastiera è falso.