Newsgroup: it.comp.lang.c
Titolo: Mouse + Kbd

	Salve a tutti... Sono da poco passato da BC3.0 a DJGPP e ho un
problema...Devo convertire un programma che sfrutti il modo grafico VESA a
256 colori, il mouse e la tastiera. No panic, ho installato GRX2.0 e tutto
gira a meraviglia ma... Il mio programma (Un micro generatore di frattali
- originale, eh ?) deve gestire il mouse in modo che sia possibile
puntarlo da qualche parte e SENZA CLICKARE o altro, premere un tasto per
ottenere dei "servizi" (Zoom, etc...). Sotto BC usavo delle librerie
scritte da un certo Jorda Hardgrave che in qualche modo (Interrupt ?) si
preoccupavano di campionare il mouse e di spostarlo sullo schermo "in
background". Cosi' il programma leggeva lo stdin con getch() e tutto era
ok. Ora avrei bisogno:
	a) Di qualcosa simile a quanto descritto sopra che gestisca il
mouse totalmente in background e che restituisca a comando la sua
posizione,
	b) Una  routine simile a bioskey(1) che e' ok perche' fa il check
della tastiera e torna 0 se non c'e' tasto premuto....Non ho capito COSA
ritorni questa benedetta routine quando premo un tasto ! (E comunque mi
resta il problema di flushare il buffer.).
Grazie a tutti e scusate se sono stato lungo,
------+ 
(O>   | Fabio Cavaliere
//\   | e-mail > 
fa...@urania.fisica.unige.it
V_/_  | e-mail2 > 
cava...@server3.fisica.unige.it
######| Linux Rulez !
------+ 

 resta il problema di flushare il buffer.).
Non se passi alla funzione il valore 0.
EMG

 
Sai mica l'url dove trovarla? Ho provato cercando su altavista ma non ho
trovato nulla... Grazie.
-- 
*******************************************************
  "C'e' un vecchio detto a riguardo delle reti che    
  recita: i problemi di banda possono essere risolti  
  con il denaro. I problemi di latenza sono piu' dif- 
  ficili poiche' la velocita' della luce e' una cos-  
  tante e non e' possibile corrompere Dio."           
 
                                     David Clark, MIT 
  Reply to 
bia...@maganet.net
*******************************************************

posizione,
Nato due minuti fa nel RHIDE del DJGPP, 
eccoti pronto un piatto bell'e servito :) 
Fammi sapere se funziona sulla tua macchina ;)
#include <stdio.h>
#include <conio.h>
#include <dos.h>
/* elenco delle dichiarazioni delle funzioni usate */
int int86 (int ivec, union REGS *in, union REGS *out);
unsigned mouse_reset                ( void ) ;
    void mouse_cursor_enable        ( void ) ;
    void mouse_cursor_disable       ( void ) ;
unsigned mouse_get_x                ( void ) ;
unsigned mouse_get_y                ( void ) ;
unsigned mouse_left_button_pressed  ( void ) ;
unsigned mouse_right_button_pressed ( void ) ;
/***************************************************/
unsigned mouse_reset ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 0 ;
  int86 ( 0x33, &r_in, &r_out ) ;
  return ( 
r_out.x.ax
 == 0xffff ) ;
}
void mouse_cursor_enable ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 1 ;
  int86 ( 0x33, &r_in, &r_out ) ;
}
void mouse_cursor_disable ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 2 ;
  int86 ( 0x33, &r_in, &r_out ) ;
}
unsigned mouse_get_x ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 3 ;
  int86 ( 0x33, &r_in, &r_out ) ;
  return ( ( 
r_out.x.cx
 & 0x00FF) >> 3 );
}
unsigned mouse_get_y ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 3 ;
  int86 ( 0x33, &r_in, &r_out ) ;
  return ( ( r_out.x.dx & 0x00FF ) >> 3 );
}
unsigned mouse_left_button_pressed ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 3 ;
  int86 ( 0x33, &r_in, &r_out ) ;
  return ( r_out.x.bx & 1 );
}
unsigned mouse_right_button_pressed ()
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 3 ;
  int86 ( 0x33, &r_in, &r_out ) ;
  return ( (r_out.x.bx & 2 ) >> 1 );
}
int main ()
{
    char c = 0 ;
    unsigned old_x = 0, old_y = 0,
             old_left_pressed = 0, old_right_pressed = 0;
    unsigned x, y, left_pressed, right_pressed ;
    clrscr() ;
    if ( ! mouse_reset() )
    {
       fprintf(stderr, "driver del mouse non installato.");
       exit ( 1 ) ;
    }
    else
    {
       mouse_cursor_enable() ;
       while ( c != '\x1B' ) /* premi ESC per uscire */
       {
             if ( kbhit() ) c = getch () ;
             x = mouse_get_x () ;
             y = mouse_get_y () ;
             left_pressed = mouse_left_button_pressed () ;
             right_pressed = mouse_right_button_pressed () ;
             if ( ( x != old_x ) || (y != old_y) )
             {
                mouse_cursor_disable() ;
                printf("posizione : (x = %3u , y = %3u)\n", x, y );
                mouse_cursor_enable() ;
             }
             if ( ( left_pressed != old_left_pressed ) ||
                ( right_pressed != old_right_pressed ) )
             {
                mouse_cursor_disable() ;
                printf("pulsanti  : ( %u, %u )\n", left_pressed,
                                                   right_pressed );
                mouse_cursor_enable() ;
             }
             old_x = x;
             old_y = y;
             old_left_pressed = left_pressed;
             old_right_pressed = right_pressed;
       }
       mouse_cursor_disable() ;
    }
    return 0 ;
}
Skyscraper (apprezzatelo adesso : eviterete la coda)
----------------------------------------------------
 
andrea_...@bigfoot.com
----------------------------------------------------
--
Posted from 
itaca.ulysse.it
 [195.223.254.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

 Fammi sapere se funziona sulla tua macchina ;)
A me funziona tutto quanto (compilato col DJGPP) tranne una cosa: il
cursore del mouse è nero. Come mai?
EMG

posizione,
ERRATA CORRIGE !!! :
nella routine mouse_get_x() non e'
return ( ( 
r_out.x.cx
 & 0x00FF) >> 3 );
ma 
return ( ( 
r_out.x.cx
 & 0x0FFF) >> 3 );
;)


cursore del mouse h nero. Come mai?
A me e' bianco ! :)
Non so da cosa dipenda, ma a questo proposito ho scritto la funzione :
void mouse_change_color ( unsigned cursor_mask )
{
  union REGS r_in, r_out ;
 
r_in.x.ax
 = 0x000a ;
  r_in.x.bx = 0 ;
 
r_in.x.cx
 = 0x8fff ;
  r_in.x.dx = cursor_mask ;
  int86 ( 0x33, &r_in, &r_out ) ;
}
Bisogna pero' inserire le linee seguenti all'inizio del programma :
/* costanti cursor mask */
const unsigned black   = 0x0000 ;
const unsigned blue    = 0x1000 ;
const unsigned green   = 0x2000 ;
const unsigned cyan    = 0x3000 ;
const unsigned red     = 0x4000 ;
const unsigned magenta = 0x5000 ;
const unsigned yellow  = 0x6000 ;
const unsigned white   = 0x7000 ;
/************************/
In pratica, i valori in cx e dx sono chiamati rispettivamente "screen mask" e
cursor mask".
Per ogni carattere del video e' possibile creare una "word" costituita come byte
piu' alto dall'attributo di colore e quello piu' basso dal valore del carattere.
L'attributo di colore e' formato nel modo seguente
[bit di lampeggiamento][R][G][B][intensita'][r][g][b]
[R][G][B] costituiscono il colore di sfondo.
Ogni volta che il mouse si muove sullo schermo, la word corrispondente al
carattere in quella posizione si trasforma mediante un'operazione AND con la
screen mask e successivamente una XOR con la cursor mask, e, dopo il passaggio,
viene ripristinata.
Quindi, riepilogando, supponiamo di aver impostato mouse_change_color(blue).
Il carattere 'A' (che sulla mia macchina vale 65) bianco non intenso, non
lampeggiante, su sfondo nero ha una word corrispondente del tipo : 0x0741 
(0000011101000001 in binario).
Quando il cursore del mouse passa su di esso diventa :
0x0741 & 0x8fff = 0x0741 ^ 0x1000 = 0x1741 
(0001011101000001 in binario).
L'unico bit che e' cambiato e' quello dell'attributo di sfondo.
A questo punto, prova ad invocare la funzione con qualcosa del tipo
 mouse_change_color( green ) ;
E dimmi se funziona...
(io uso il DJGPP e riesco a visualizzare il cursore di tutti i colori)...


   
ma dove hai trovato la lista di funzioni del djgpp?!?!?!??!
anche se non ho ancora guardato nulla......cmq potresti anche scriverti un 
TSR.
Poi bisogna dire che se usi l'int 33 devi caricare il driver del mouse
altrimenti potresti scrivertelo tu.....=)
-- 
 Signed: Paolo"Flag"Pisati            Be-Developer#E-17711
 "Resistence is not futile.Be."       "Death to false metal!!!"
 

 E dimmi se funziona...
Perfettamente. Come mai che il mio default è nero???
EMG

	Grazie per l'aiuto, provero' a fare andare il tutto perche' ho
avuto un po' di problemi (Con Grx20 se uso l'int 0x33 non riesco a far
comparire il cursore del mouse - figurati a fare fungere il resto... -
mentre in una roba tipo "if (kbhit()) k = getch();" non restituisce mai
nulla in "k". Questo l'ho provato usando la gestione del Mouse di Grx
perche' l'int non ne vuol sapere di andare...). Cerchero' meglio
l'errore...
Grazie \infty per l'aiuto !!!	


altrimenti potresti scrivertelo tu.....=)
Andiamo !!! c'e' Windows !!!


 ma dove hai trovato la lista di funzioni del djgpp?!?!?!??!
Ehm, negli include files... :-(
EMG

Perfettamente. Come mai che il mio default h nero???
Mistero !!! :)


perche' l'int non ne vuol sapere di andare...). 
Be' pero' e' strano, perche', a meno di non avere un driver incorporato, il
mouse si gestisce comunque con l'int 0x33 !
