Veilchen4ever
Veilchen4ever

Reputation: 399

Ncurses: F1-F5 keys

I have a Probclem with functions keys in curses.h. I have this littel programm seen on different websites/tutorials

#include <ncurses.h>

int main()
{       int ch;

    initscr();                      /* Start curses mode            */
    raw();                          /* Line buffering disabled      */
    keypad(stdscr, TRUE);           /* We get F1, F2 etc..          */
    noecho();                       /* Don't echo() while we do getch */

    printw("Type any character to see it in bold\n");
    ch = getch();
    while (ch != KEY_F(1))
    {
            if(ch == KEY_F(1))      
                    printw("F1 Key pressed: Ending program.\n");

            else
            {       printw("The pressed key is ");
                    attron(A_BOLD);
                    printw("%c\n", ch);
                    attroff(A_BOLD);
            }

            refresh();     

            ch = getch();

    }
    printw("end\n");
    endwin();                       /* End curses mode                */

    return 0;
}

The keys F6-F12 works fine and the code which is returned is also fine (for example: 270 if F6 ist pressed). But if I press F5 not 269 is returned, like it would be supposed to be, instead the following is happening (only by pressing F5 once):

Type any character to see it in bold
The pressed key is ^[
27
The pressed key is [
91
The pressed key is 1
49
The pressed key is 5
53
The pressed key is ~
126

So I think the whole Escape Sequence ist returned. I read on the internet about this problem and two times there was a hint which describes to change the TERM variable to xterm or vt100. So I tried to change TERM to vt 220 and also xterm, but nothing change. When i changed it to vt100 also F6-F12 didn't work.

Can anybody help me how I can recognize if the user presses F1-F5? Keys like enter, Backspace, up, down, etc. are recognized fine.

best regards

Upvotes: 4

Views: 7284

Answers (1)

LeoNerd
LeoNerd

Reputation: 8532

Sounds like a disagreement between what terminfo says your terminal sends and what it actually does. May be the result of an incorrect terminfo file on the target machine, or the wrong $TERM setting, or any number of things.

I'd start by comparing what

$ infocmp -L

says on the target machine, as compared what the terminal actually sends when running, say, cat.

If you are running xterm, maybe you have a ~/.Xresources file translating your function keys. VMS users often would remap F1 - F5 keys that way. Also many terminal emulators (like Putty) have options to remap these keys.

Upvotes: 6

Related Questions