Pregunta

Básicamente, tengo la detección clave para mi aplicación de consola, por alguna razón que no es la detección de las teclas de función.

Aquí está mi código, estoy usando el compilador de GNU en Linux. Cualquier ayuda o idea sería muy apreciados.

        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;
        }    
¿Fue útil?

Solución

No soy un experto en maldiciones, pero un poco de leer páginas man me anotó este programa:

#include <curses.h>

int main()
{
    int key;

    initscr(); cbreak(); noecho();

    while (1)
    {

        key = getch();
        printw ("%u\n", key);
    }

    return 0;
}

Cuando presiono una clave F, I conseguir una secuencia de 3 caracteres: 27, 79, (80 + N-1), donde N es el número de la tecla F. Creo que su interruptor tendrá que reconocer que la clave es una secuencia de escape y manejarlo de forma especial.

Editar Este patrón es válida sólo para la F1-F4. F5 cambia hacia arriba. Es probable que desee incorporar las macros (n) F de las maldiciones.

Otros consejos

Tener el mismo tema, en lo personal.

Lanzamiento de la macro F (n) a un tipo char mágicamente despejó el problema para mí;

cmd = getch();
    switch(cmd){
        case 'r':
            addch('r');
            break;
        case 'w':
            addch('x');
            break;
        default:
            if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
    }

y similares. Trabajado para F2 a través de F10 plus F12. F 1, 10 y 11 están "ocupados" por falta de una mejor palabra en mi xterm. (F1 abre la ventana de ayuda, F11 cambia el modo de pantalla completa, etc.) Una vez más, no puedo enfatizar lo suficiente que no podía comenzar a adivinar por qué funciona.

Es posible que necesite habilitar la funcionalidad "teclado" de la terminal utilizando la función keypad. Desde la página de manual de teclado (3x):

  

int keypad(WINDOW *win, bool bf);

     

La teclado permite que el teclado del usuario del terminal. Si está habilitado   ( bf es TRUE ), el usuario puede pulsar una tecla de función (tal como una tecla de flecha) y    wgetch devuelve un único valor que representa la tecla de función, como en    KEY_LEFT . Si está desactivado ( bf es false ), maldiciones no funciona convite   especialmente llaves y el programa ha de interpretar las propias secuencias de escape.   Si el teclado en el terminal puede estar activada (hecha a transmitir) y fuera   (Hecha a trabajo a nivel local), al encender esta opción hace que el teclado del terminal para ser   encendido cuando wgetch se llama. El valor por defecto para teclado es falso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top