2010-09-27 26 views
10

Tengo un pequeño programa ncurse estoy ejecutando, pero la salida no parece mostrarse a menos que pegue el wrefresh() en un ciclo while.NCurses Refresh

¿Hay algún almacenamiento en búfer o algo por el estilo? Probé otras funciones de refresh en la biblioteca y fflush con stddout (lo cual no creo que tenga sentido, pero vale la pena intentarlo), pero nada parece funcionar.

Una segunda pregunta pequeña: para hacer getch() sin bloqueo, necesitamos llamar al nodelay(win,TRUE), ¿verdad?

 

void main() 
{ 
     initscr(); 
     start_color(); 
     init_pair(1,COLOR_YELLOW,COLOR_CYAN); 
     WINDOW *win = newwin(10,10,1,1); 
     wbkgd(win,COLOR_PAIR(1)); 
     wprintw(win,"Hello, World."); 
     wrefresh(win); 
     getch(); 
     delwin(win); 
     endwin(); 
} 
 
+0

He añadido el siguiente código: while (ERR == getch()) { wrefresh (win); ++ ctr; } y la salida se ve bien, pero todavía no entiendo por qué no se muestra inicialmente sin bucle. – Tim

Respuesta

17

No debe mezclar operaciones en stdscr y ventanas creadas con newwin(). getch() funciona en stdscr, por lo que ese es su problema. Sustituir a la llamada con

wgetch(win); 

(getch()stdscr está causando a ser objeto de dumping sobre la parte superior de la otra ventana, y debido a eso sucede tan rápido que se parece a la otra ventana nunca nos mostraban en lo absoluto).

+0

Tienes razón. ¡Gracias un montón! Lo siento, pero necesito preguntar uno más: cuando llamas a una función que opera en una ventana, ¿establece el foco en esa ventana si hay algo así como el foco? – Tim

+0

@Tim: el cursor de hardware se deja en la ubicación del cursor en la ventana que actualizó por última vez, pero ese es realmente el único tipo de "foco". – caf

+0

Si necesita ventanas superpuestas independientes, debe consultar la biblioteca de paneles que forma parte de ncurses. – Craig

2

Eso está funcionando como se diseñó. Eso le permite volver a dibujar por completo la siguiente pantalla, pero solo las partes que realmente se modifican se envían a la terminal en el momento de la actualización. Esto no es tan importante en estos días, pero marcó una gran diferencia cuando las conexiones de los terminales fueron relativamente lentas.

+0

Gracias por la respuesta. Entiendo que ese es el caso, pero no veo nada más que una pantalla en blanco. ¿Cómo aparece la ventana y el texto * inicialmente * sin llamar repetidamente a wrefresh()? – Tim