Come si usa getch da maledizioni senza cancellare lo schermo?
Domanda
sto imparando a programmare in C e vogliono essere in grado di digitare i caratteri nel terminale, mentre il mio codice è in esecuzione senza premere tornare . Le mie opere programma, tuttavia quando chiamo initscr()
, lo schermo si oscura - anche dopo aver chiamato filter()
. La documentazione per filter
suggerisce dovrebbe compensazione disable -. Tuttavia questo non è il caso per me
#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;
}
Perché il codice di cui sopra ancora clearr lo schermo, e che cosa si potrebbe fare per risolvere il problema?
sto usando Debian Lenny (stabile) e gnome-terminal se questo aiuta.
Soluzione
Usa newterm()
invece di initscr()
, si dovrebbe andare bene, allora. E non dimenticare delscreen()
se si segue questo consiglio.
Altri suggerimenti
L'estensione della risposta da mike.dld, questo funziona per me su MacOS X 10.6.6 (GCC 4.5.2) con il sistema di maledice biblioteca - senza cancellare lo schermo. Ho aggiunto la possibilità di registrare i caratteri digitati (registrati in un file di "x"), e la possibilità di digitare CONTROL-D e fermare il programma piuttosto che costringere l'utente a interrupt.
#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;
}
Si potrebbe vedere il vostro schermo cancellata in un'applicazione maledizioni per uno di questi motivi:
-
initscr
(che cancella il schermo) onewterm
senza prima convocazionefilter
, o - l'inizializzazione terminale cancella lo schermo (o fa apparire per cancellare, passando alla schermata alternativo).
In quest'ultimo caso, si può sopprimere la funzione di schermo si alternano in ncurses reimpostando i puntatori enter_ca_mode
e exit_ca_mode
NULL come fatto in dialog
. Meglio ancora, scegliere una descrizione terminale che fa quello che si vuole.
Per ulteriori approfondimenti:
- perché non lo schermo chiaro quando si esegue VI? ( xterm FAQ)
Fondamentalmente, curses è progettato per assumere lo schermo (o finestra, nel caso di un terminale finestra). Non si può davvero mescolare maledizioni con stdio, e non si può davvero usare maledizioni a poco input o output qualcosa senza fare confusione con il resto dello schermo. Ci sono soluzioni alternative parziali, ma non si è mai davvero di essere in grado di farlo funzionare il modo in cui suona come si desidera. Siamo spiacenti.
suggerirei o riscrivere il programma da utilizzare durante maledizioni, o indagando alternative come readline.