Question

I am using fedora 20 and learning ncurses programming by studying example programs. I have reached one in NCURSES Programming HOWTO (listed below from my file "border.c", see note) that should exit on pressing function key F1: instead it gives me a window headed "Terminal Help", so I use CTRL-C to exit. I am compiling and running the programs from the bash shell command window with the commands:

[Harry@localhost ~]$ gcc -o border.o border.c -l ncurses
[Harry@localhost ~]$ ./border.o

Please, can I override this F1 action somehow so that the key press is read and acted on by the ncurses program, and preferably also retain its default action elsewhere?

Note the effect of TAB is ok in the draft, but goes a bit haywire as displayed in the actual question.

#include <ncurses.h>

typedef struct _win_border_struct {
    chtype  ls, rs, ts, bs, 
        tl, tr, bl, br;
}WIN_BORDER;

typedef struct _WIN_struct {

    int startx, starty;
    int height, width;
    WIN_BORDER border;
}WIN;

void init_win_params(WIN *p_win);
void print_win_params(WIN *p_win);
void create_box(WIN *win, bool flag);

int main(int argc, char *argv[])
{   WIN win;
    int ch;

    initscr();          /* Start curses mode        */
    start_color();          /* Start the color functionality */
    cbreak();           /* Line buffering disabled, Pass on
                     * everty thing to me       */
    keypad(stdscr, TRUE);       /* I need that nifty F1     */
    noecho();
    init_pair(1, COLOR_CYAN, COLOR_BLACK);

    /* Initialize the window parameters */
    init_win_params(&win);
    print_win_params(&win);

    attron(COLOR_PAIR(1));
    printw("Press F1 to exit");
    refresh();
    attroff(COLOR_PAIR(1));

    create_box(&win, TRUE);
    while((ch = getch()) != KEY_F(1))
    {   switch(ch)
        {   case KEY_LEFT:
                create_box(&win, FALSE);
                --win.startx;
                create_box(&win, TRUE);
                break;
            case KEY_RIGHT:
                create_box(&win, FALSE);
                ++win.startx;
                create_box(&win, TRUE);
                break;
            case KEY_UP:
                create_box(&win, FALSE);
                --win.starty;
                create_box(&win, TRUE);
                break;
            case KEY_DOWN:
                create_box(&win, FALSE);
                ++win.starty;
                create_box(&win, TRUE);
                break;  
        }
    }
    endwin();           /* End curses mode        */
    return 0;
}
void init_win_params(WIN *p_win)
{
    p_win->height = 3;
    p_win->width = 10;
    p_win->starty = (LINES - p_win->height)/2;  
    p_win->startx = (COLS - p_win->width)/2;

    p_win->border.ls = '|';
    p_win->border.rs = '|';
    p_win->border.ts = '-';
    p_win->border.bs = '-';
    p_win->border.tl = '+';
    p_win->border.tr = '+';
    p_win->border.bl = '+';
    p_win->border.br = '+';

}
void print_win_params(WIN *p_win)
{
#ifdef _DEBUG
    mvprintw(25, 0, "%d %d %d %d", p_win->startx, p_win->starty, 
                p_win->width, p_win->height);
    refresh();
#endif
}
void create_box(WIN *p_win, bool flag)
{   int i, j;
    int x, y, w, h;

    x = p_win->startx;
    y = p_win->starty;
    w = p_win->width;
    h = p_win->height;

    if(flag == TRUE)
    {   mvaddch(y, x, p_win->border.tl);
        mvaddch(y, x + w, p_win->border.tr);
        mvaddch(y + h, x, p_win->border.bl);
        mvaddch(y + h, x + w, p_win->border.br);
        mvhline(y, x + 1, p_win->border.ts, w - 1);
        mvhline(y + h, x + 1, p_win->border.bs, w - 1);
        mvvline(y + 1, x, p_win->border.ls, h - 1);
        mvvline(y + 1, x + w, p_win->border.rs, h - 1);

    }
    else
        for(j = y; j <= y + h; ++j)
            for(i = x; i <= x + w; ++i)
                mvaddch(j, i, ' ');

    refresh();

}
Was it helpful?

Solution

Similar questions are indeed posted here in Stackoverflow, and the answer is that it is incompatibilities between various aspects of the system, which look tricky to overcome: so, I will avoid these awkward F keys for now.

After experimenting, I now find that F(2) to F(9) and F(12) work ok; F(10) opens up the Toolbar; and F(11) toggles full screen on and off; in addition to the effect of F(1) that I asked about.

Thanks to edvinas for pointing out that I should have used Stackoverflow, and to those who migrated it here

I will accept this as answer as soon as I can, to save further comments here

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top