2011-01-23 14 views
8

Estoy aprendiendo a programar en C y quiero poder escribir caracteres en la terminal mientras mi código se está ejecutando sin presionar return. Mi programa funciona, sin embargo, cuando llamo al initscr(), la pantalla se borra, incluso después de llamar al filter(). La documentación para filter sugiere que debe deshabilitar el borrado, sin embargo, este no es el caso para mí.¿Cómo uso getch de curses sin borrar la pantalla?

#include <stdio.h> 
#include <curses.h> 
#include <term.h> 

int main(void) { 

    int ch; 

    filter(); 
    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    while((ch = getch()) != EOF); 

    endwin(); 

    return 0; 
} 

¿Por qué el código anterior sigue limpiando la pantalla y qué se puede hacer para solucionarlo?

Estoy usando Debian Lenny (estable) y gnome-terminal si eso ayuda.

+0

Para PDCurses puede establecer el PDC_PRESERVE_SCREEN variables de entorno o PDC_RESTORE_SCREEN a cualquier valor: desde el historial de archivos: – Brandin

+0

PDC_PRESERVE_SCREEN Si esta variable de entorno está configurado, PDCurses no borrará la pantalla con el blanco predeterminado en negro al inicio. Esto le permite superponer una ventana sobre el fondo de la pantalla existente. PDC_RESTORE_SCREEN Si se establece esta variable de entorno, PDCurses tomará una copia del contenido de la pantalla en el momento en que se inicie PDCurses; initscr(), y cuando se invoca endwin(), la pantalla se restaurará. – Brandin

Respuesta

2

Use newterm() en lugar de initscr(), debería estar bien entonces. Y no se olvide de delscreen() si sigue este consejo.

+0

Hola, gracias por la respuesta, intenté con lo que dijiste y la funcionalidad es la misma: la pantalla se borró nuevamente. En lugar de 'initscr()' tengo 'FILE * fild_id = fopen ("/dev/tty "," r + "); SCREEN * termref = newterm (NULL, file_id, file_id); 'y en lugar de' endwin() 'Tengo' delscreen (termref) '. –

+0

Extraño, pero no borra mi pantalla cuando lo uso en lugar de 'initscr()'. Lo llamo 'newterm (NULL, stdin, stdout)' embargo. –

+3

La única razón por la que no está despejando su pantalla, Mike, es que invirtió los argumentos a newterm(). Toma stdout, stdin, not stdin, stdout. Apuesto a que después de que se ejecute su programa de prueba, su entrada está en mal estado? No hace eco, tal vez? Si usa el orden de argumento correcto para newterm(), de hecho borra la pantalla. Tu respuesta es simplemente incorrecta. –

4

Extendiendo la respuesta por mike.dld, esto funciona para mí en MacOS X 10.6.6 (GCC 4.5.2) con la biblioteca de curses del sistema - sin borrar la pantalla. Agregué la capacidad de registrar los caracteres escritos (registrados en un archivo "x") y la capacidad de escribir CONTROL-D y detener el programa en lugar de forzar al usuario a interrumpir.

#include <stdio.h> 
#include <curses.h> 
#include <term.h> 

#define CONTROL(x) ((x) & 0x1F) 

int main(void) 
{ 
    FILE *fp = fopen("x", "w"); 
    if (fp == 0) 
     return(-1); 
    SCREEN *s = newterm(NULL, stdin, stdout); 
    if (s == 0) 
     return(-1); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    int ch; 
    while ((ch = getch()) != EOF && ch != CONTROL('d')) 
     fprintf(fp, "%d\n", ch); 

    endwin(); 

    return 0; 
} 
+0

Gracias chicos por responder, esto funcionó perfectamente –

+0

Esto borra la pantalla para mí (por lo que no funciona). – nh2

+0

@ nh2: puede depender de su tipo de terminal y de la entrada de curses que esté utilizando. –

0

Básicamente, curses está diseñado para tomar la pantalla (o ventana, en el caso de un terminal con ventana). Realmente no puedes mezclar maldiciones con stdio, y no puedes usar maldiciones para simplemente ingresar o sacar algo sin interferir con el resto de la pantalla. Existen soluciones parciales, pero nunca podrá hacer que funcionen del modo que parezca. Lo siento.

Sugiero que reescribas tu programa para usar maldiciones o investigar alternativas como readline.

+0

readline usa ncurses internamente. –

+1

readline usa solo la interfaz termcap –

1

que se vería en su pantalla aclarado en una aplicación de maldiciones por una de estas razones:

  • su programa llama initscr (que borra la pantalla) o newterm sin antes llamar filter o
  • la inicialización del terminal borra la pantalla (o hace que parezca despejada, al cambiar a la pantalla alternativa).

En este último caso, se puede suprimir la función de pantalla se alternan en ncurses restableciendo los enter_ca_mode y exit_ca_mode punteros a NULL as done in dialog. Mejor aún, elija una descripción de terminal que haga lo que quiera.

Más información:

Cuestiones relacionadas