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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top