Non-bloquant getch(), ncurses

j'ai de la difficulté à faire bloquer le getch() de ncurses. L'opération par défaut ne semble pas bloquer (ou Ai-je manqué une certaine initialisation)? Je voudrais travailler comme getch() dans Windows. J'ai essayé différentes versions de

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

(pas tous en même temps). Je préfère ne pas (explicitement) d'utiliser tout WINDOW, si possible. while boucle autour de getch (), vérifier une valeur de retour spécifique est OK aussi.

19
demandé sur Jonas Byström 2009-05-25 05:38:00

3 réponses

La bibliothèque curses est un package deal. Vous ne pouvez pas simplement sortir une routine et espérer le meilleur sans initialiser correctement la bibliothèque. Voici un code qui bloque correctement getch():

#include <curses.h>

int main(void) {
  initscr();
  timeout(-1);
  int c = getch();
  endwin();
  printf ("%d %c\n", c, c);
  return 0;
}
34
répondu Norman Ramsey 2009-05-25 02:11:53

Vous devez appeler initscr() ou newterm() pour initialiser les malédictions avant qu'il fonctionne. Cela fonctionne bien pour moi:

#include <ncurses.h>

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

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

    printf("received %c (%d)\n", c, (int) c);
}
8
répondu Curt J. Sampson 2009-05-25 02:08:07

une page de manuel de (italiques ajoutés):

timeout et wtimeout routines définir le blocage ou le non-blocage lire pour une fenêtre donnée. Si delay est négatif, la lecture de blocage est utilisée (i.e., attend indéfiniment d'entrée).

7
répondu Rob Kennedy 2009-05-25 01:44:02