¿Cómo uso Getch de las maldiciones sin borrar la pantalla?
Pregunta
Estoy aprendiendo a programar en C y quiero poder escribir caracteres en el terminal mientras mi código se ejecuta sin presionar devolver. Mi programa funciona, sin embargo, cuando llamo initscr()
, se borra la pantalla, incluso después de llamar filter()
. La documentación para filter
sugiere que debería deshabilitar la compensación, sin embargo, este no es el caso para mí.
#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 todavía borra la pantalla y qué se podría hacer para solucionarlo?
Estoy usando Debian Lenny (estable) y gnomo-terminal si eso ayuda.
Solución
Usar newterm()
en vez de initscr()
, deberías estar bien entonces. Y no te olvides de delscreen()
Si sigues este consejo.
Otros consejos
Extendiendo la respuesta de Mike.dld, esto funciona para mí en MacOS X 10.6.6 (GCC 4.5.2) con la biblioteca de Cursos del sistema, sin borrar la pantalla. Agregué la capacidad de grabar los caracteres escrito (registrado en un archivo "x") y la capacidad de escribir Control-d y detener el programa en lugar de obligar 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;
}
Verá su pantalla borraed en una aplicación de Maldiciones por una de estas razones:
- Tu programa llama
initscr
(que borra la pantalla) onewterm
sin la primera llamadafilter
, o - La inicialización del terminal borra la pantalla (o hace que parezca borrar, cambiando a la pantalla alternativa).
En el último caso, puede suprimir la función de pantalla alternativa en NCurses restableciendo el enter_ca_mode
y exit_ca_mode
consejos para nulo Como se hizo en dialog
. Mejor aún, elija una descripción terminal que haga lo que desea.
Otras lecturas:
- ¿Por qué la pantalla no se borra cuando se ejecuta VI? (Preguntas frecuentes de xterm)
Básicamente, Curses está diseñado para hacerse cargo de la pantalla (o ventana, en el caso de una terminal con ventana). Realmente no puede mezclar maldiciones con STDIO, y realmente no puede usar maldiciones para simplemente ingresar o emitir algo sin meterse con el resto de la pantalla. Hay soluciones parciales, pero nunca podrás hacer que funcione de la manera que parece que quieres. Lo siento.
Sugeriría reescribir su programa para usar maldiciones en todo momento o investigar alternativas como Readline.