Newsgroup: it.comp.os.linux.development
Titolo: freccette

Come faccio ad intercettare la pressione delle freccette senza usare le 
ncurses? Sono veramente disperato
Grazie
--
Abruzzo Silvio

 ncurses? Sono veramente disperato
Non capisco a cosa possano servire questi tasti, se non li usi in combinazione
con la gestione del terminale. Rassegnati alle ncurses, in fondo non sono
puoi quella bestia nera che sembrano all'inizio!
Ciao,
// Umberto Salsi
//
// 
http://digilander.iol.it/salsi
  --  GnuPG Key ID = BE2C F6CD 77E9 29AE

 
Io le conosco le ncurses e le so usare anche abbastanza discretamente, 
ma non voglio usarle. Le ncurses daltronte come faranno?
--
Abruzzo Silvio

 richiamo precedenti comandi? Io lo voglio fare senza ncurses, 
Se e` esattamente questo che vuoi fare, usa la libreria readline.
Massimiliano

 perchè altrimenti dovrei riscrivere quasi tutto il programma.
C'e' gia' una funzione di libreria che si chiama readline, e che
fa proprio quel mestiere (man readline).
A sua volta questa funzione accede al termcap (o al terminfo), cioe'
al DB delle proprieta' del terminale corrente.
Maggiori info per il controllo a basso livello del terminale le trovi
nell documentazione delle libc capitolo "Low-Level Terminal Interface"
(info libc, disponibile anche in HTML credo nel sito 
www.gnu.org
).
Fai prima ad usare le ncurses... :-)



si, avevo anche io fatto una cosa del genere, il problema è proprio qui 
se io premo la freccia lui mi restituisce 4 byte e non riesco a gestire 
questa cosa.
Grazie cmq.
--
Abruzzo Silvio

 writes:
    Abruzzo> si, avevo anche io fatto una cosa del genere, il problema
    Abruzzo> è proprio qui se io premo la freccia lui mi restituisce 4
    Abruzzo> byte e non riesco a gestire questa cosa.  Grazie cmq.
si, è vero.  sul mio terminale però restituisce  sempre tre interi, di
cui  i  primi 2  sono  sempre  uguali,  l'ultimo definisce  la  giusta
sequenza di escape per la freccia (65, 66, 67, 68).
mi  è venuta  in mente  una soluzione,  ma non  troppo furba  ed anche
buggata. vedi  di raffinarla  tu e poi  posta il codice  :-) (quotando
meglio, questa volta)
<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
struct termios old, new;
void init_term(FILE *input);
void reset_term(FILE *input);
void check_press(int press);
int sequence[20], pos = 0;
int main(int argc, char **argv) {
  char press;
  FILE *term;
  if((term = fopen("/dev/tty", "r")) == NULL) {
    fprintf(stderr, "Unable to open the terminal\n");
    exit(EXIT_FAILURE);
  }
  init_term(term);
  do {
    printf("press a character (q to exit)\n");
    read(fileno(term), &press, 1);
    sequence[pos] = press;
    check_press(press);
  } while (press != 'q');
  reset_term(term);
  exit(EXIT_SUCCESS);
}
void init_term(FILE *input) {
  tcgetattr(fileno(input), &old);
  new = old;
  new.c_lflag &= ~(ICANON | ECHO | ISIG);
  new.c_cc[VMIN] = 1;
  new.c_cc[VTIME] = 0;
  if(tcsetattr(fileno(input), TCSANOW, &new) != 0) {
    fprintf(stderr, "Unable to set terminal attributes\n");
    exit(EXIT_FAILURE);
  }
}
void reset_term(FILE *input) {
  if(tcsetattr(fileno(input), TCSANOW, &old) != 0) {
    fprintf(stderr, "Unable to set terminal attributes\n");
    exit(EXIT_FAILURE);
  }
}
void check_press(int press) {
  if((press >= 65) && (press <= 68)) {
    if((sequence[pos - 1] == 91) && (sequence[pos - 2] == 27)) { 
        /* se i due interi precedenti sono quelli, 
           allora è una freccia. vediamo quale... */
      switch(press) {
      case 65: 
	printf("up arrow pressed\n");
	break;
      case 66:
	printf("down arrow pressed\n");
	break;
      case 67:
	printf("right arrow pressed\n");
	break;
      case 68:
	printf("left arrow pressed\n");
	break;
      }
      for(pos = 0; pos < 10; pos++)
	sequence[pos] = '\0';
      pos = 0;
    }
  }
  else
    pos++;
}
</CODE>
il bug  sta nel  fatto che, se  il buffer  sequence[] è alla  fine, il
controllo  per interpretare la  sequenza manda  in tilt  il terminale


 
Bene mi metto subiro al lavoro. Grazie.
P.S.
Qual'era il problema nella quotatura?
--
Abruzzo Silvio

 writes:
    Abruzzo> P.S.  Qual'era il problema nella quotatura?
era un po' abbondante :-)
