Newsgroup: it.comp.lang.c++
Titolo: equivalente a kbhit

Salve a tutti, tempo fa avevo trovato un semplicissimo modo per 
attendere la pressione di un tasto qualsiasi senza che fosse seguito da 
invio
qualcosa di simile a
int i;
       for (i=0; !kbhit(); i++);
in windows con conio.h
ora in linux so che esiste qualcosa di altrettanto semplice 
semplicemente includendo le ncurses ma mi sfugge la sintassi

 
la sintassi è:
$ man ncurses

 $ man ncurses
Certo, l'avevo fatto :-)
Avevo provato getchar(), ma non funziona, resta bloccato anche se premo 
un tasto, non sapendo dove sbattere la testa chiedo se qualcuno ha gia' 
provato qualcosa di simile

 provato qualcosa di simile
Per attivare l'eco ed i buffering ci sono le funzioni echo, raw, e cbreak
(noecho, noraw e nocbreak per disattivare).

 
mettendo insieme diversi suggerimenti ho partorito questo:
#include <ncurses.h>
int main(int argc, char *argv[])
{
	int ch;
 
	initscr(); //inizializza lo schermo
 
	printw("Premere un tasto: "); //stampa un testo formattato: simile alla 
printf
         noecho(); //in realta a me serve che il carattere non si veda
	ch = getch(); //attende in input un carattere
 
	printw("\nPremuto: %c\n\n", ch); //visualizza l'inut
	printw("Premere un tasto per uscire.");
 
	getch(); //attende un altro tasto
 
	endwin(); //sospende la sessione ncurses
	return 0;
}
che pero' va compilato con l'opzione -lncurses cosa che preferirei 
evitare...

 evitare...
 Allura...
1) Perché vuoi evitarlo?
2) -lncurses è una opzione del linker, dice solo di usare la 
     libreria ncurses. Cosa c'e di sbagliato?
3) Quale altro modo hai per linkare la una libreria?
4) Stai dicendo che NON vuoi usare le ncurses!

 4) Stai dicendo che NON vuoi usare le ncurses!
mea culpa...
ora pero' implementando il codice di prima vorrei che non si pulisse 
completamente lo schermo, ma che l'opzione di inizializzazione fosse 
conseguente al codice eseguito immediatamente prima.
Ma forse in questo caso bisognerebbe davvero evitare le ncurses :D

 Ma forse in questo caso bisognerebbe davvero evitare le ncurses :D
No. Se ho ben capito cosa vuoi fare allora:
Esegui def_prog_mode() per salvare il modo del terminale
e fai endwin() per uscire da ncurses e tornare al terminale.
Quindi fai le tue belle cosette nel terminale.
Quando hai finito fai reset_prog_mode() per tornare in ncurser
ed infine fai un refresh() ed ecco riappaiono le tue belle finestre.


Puoi anche farlo a mano, con una select:
http://www.ozzu.com/unix-linux-forum/kbhit-t34401.html
http://www.linuxquestions.org/questions/programming-9/way-of-use-of-kbhit-function-in-gcc-776487/
http://forums.fedoraforum.org/archive/index.php/t-172337.html
Riccardo

 [...]
Ciao   Manlio

 
Non ci avevo pensato, avevo gia' visto i primi 2 links, ma questo no, 
davvero interessante.
Grazie ancora per l'aiuto, passettino dopo l'altro mi sa che ce la fo'
:D

Io una volta avevo fatto cosi', settando lo stdin come mi faceva
comodo e andando a fare una semplice read() sul descrittore:
// setta le impostazioni della tastiera
struct termios oldterm, newterm;
tcgetattr(STDIN_FILENO, &oldterm);	//copia le vecchie impostazioni per
poterle ripristinare in seguito
newterm = oldterm;
newterm.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
newterm.c_iflag &= ~(IXON | BRKINT | PARMRK);
newterm.c_cc[VMIN] = 1;
newterm.c_cc[VTIME] = 0;
tcsetattr(STDIN_FILENO, TCSANOW, &newterm);
// leggi carattere
char ch;
read(STDIN_FILENO, &ch, 1);
// quando hai finito, ripristina le vecchie impostazioni della
tastiera prima di uscire
tcsetattr(STDIN_FILENO, TCSANOW, oldterm);
e a quel punto gestisci il carattere come vuoi.  Occhio alle iflag e
lflag, non mi ricordo cosa significano le singole costanti al momento
(l'ho scritto tipo3  anni fa e recuperato da un backup), ma se googoli
le trovi tutte.  Mi ricordo che prendevo il controllo completo del
terminale, quindi ad es. anche CTRL+c non uccide il programma, ma
viene passato al programma che lo gestisce lui.
Nel mio esempio la read() e' bloccante, potresti renderla non
bloccante o usare la select con timeout nullo coem nell'esempio che ti
hanno dato sopra.
Pleg