28
votes

I'm having some problems getting ncurses' getch() to block. Default operation seems to be non-blocking (or have I missed some initialization)? I would like it to work like getch() in Windows. I have tried various versions of

timeout(3000000);
nocbreak();
cbreak();
noraw();
etc...

(not all at the same time). I would prefer to not (explicitly) use any WINDOW, if possible. A while loop around getch(), checking for a specific return value is OK too.

3

3 Answers

40
votes

The curses library is a package deal. You can't just pull out one routine and hope for the best without properly initializing the library. Here's a code that correctly blocks on getch():

#include <curses.h>

int main(void) {
  initscr();
  timeout(-1);
  int c = getch();
  endwin();
  printf ("%d %c\n", c, c);
  return 0;
}
11
votes

From a man page (emphasis added):

The timeout and wtimeout routines set blocking or non-blocking read for a given window. If delay is negative, blocking read is used (i.e., waits indefinitely for input).

10
votes

You need to call initscr() or newterm() to initialize curses before it will work. This works fine for me:

#include <ncurses.h>

int main() {
    WINDOW *w;
    char c;

    w = initscr();
    timeout(3000);
    c = getch();
    endwin();

    printf("received %c (%d)\n", c, (int) c);
}