Search code examples
c++unixcommand-linencurses

Create a function to check for key press in Unix using ncurses


I have been looking for an equivalent to kbhit() and I have read several forums on this subject, and the majority seem to suggest using ncurses.

How should I go about checking if a key is pressed in C++ using ncurses?

The function getch() provided by ncurses reads a character from the window. I would like to write a function that only checks if there is a key press and then I want to do getch().


Solution

  • You can use the nodelay() function to turn getch() into a non-blocking call, which returns ERR if no key-press is available. If a key-press is available, it is pulled from the input queue, but you can push it back onto the queue if you like with ungetch().

    #include <ncurses.h>
    #include <unistd.h>  /* only for sleep() */
    
    int kbhit(void)
    {
        int ch = getch();
    
        if (ch != ERR) {
            ungetch(ch);
            return 1;
        } else {
            return 0;
        }
    }
    
    int main(void)
    {
        initscr();
    
        cbreak();
        noecho();
        nodelay(stdscr, TRUE);
    
        scrollok(stdscr, TRUE);
        while (1) {
            if (kbhit()) {
                printw("Key pressed! It was: %d\n", getch());
                refresh();
            } else {
                printw("No key pressed yet...\n");
                refresh();
                sleep(1);
            }
        }
    }