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

Leggendo alcuni msg nel NG e spulciando la Interrupt list di Ralf
Brown ho visto quant'e' semplice usare il mouse nei programmi DOS e
cosi' mi sono messo a scrivere le funzioni necessarie. Ho pero' alcuni
problemi/domande :
1 - Cosa c'e' di sbagliato nel listato che segue ? Spesso funziona
bene ma, di tanto in tanto, il cursore del mouse prende delle forme
strane (pixel vengono illuminati a casaccio) o diventa addirittura
piu' grande (invece di 16x16 pixel sembra che sia 24 pixel in
orizzontale per 16 in verticale). Generalmente quando succedono queste
cose strane poi c'e' un crash.
2 - Come si puo' dare un colore alla freccia del mouse ? (colore che
deve restare costante e non deve venir influenzato dal colore della
zona dove e' posizionato il mouse)
3 - Esiste un modo semplice per gestire anche la rotellina dei mouse
Logitech ?
Ecco il listato (compilato con Borland TC 3.00 - modello Compact)
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <graphics.h>
#include <string.h>
struct mouse_info
    {
    int x;
    int y;
    int lb;
    int rb;
    int mb;
    };
// Prototipi
int mouse_reset(void);
void mouse_get(struct mouse_info *, int);
void mouse_cursor(int);
void mouse_cursor_graphic(unsigned char *);
void mouse_get(struct mouse_info *m, int gmode)
    {
    union REGS regs;
 
regs.x.ax
 = 0x03;
    int86(0x33, &regs, &regs);
    m->x = 
regs.x.cx
;
    m->y = regs.x.dx;
    m->lb = regs.x.bx & 1;
    m->rb = (regs.x.bx & 2) >> 1;
    m->mb = (regs.x.bx & 4) >> 2;
    if (!gmode)
        {
        m->x = (m->x >> 3) + 1;
        m->y = (m->y >> 3) + 1;
        }
    }
int mouse_reset(void)
    {
    union REGS regs;
 
regs.x.ax
 = 0x00;
    int86(0x33, &regs, &regs);
    return (
regs.x.ax
 == 0xffff);
    }
void mouse_cursor(int enable)
    {
    union REGS regs;
 
regs.x.ax
 = 0x02;
    if (enable)
        {
 
regs.x.ax
 = 0x01;
        }
    int86(0x33, &regs, &regs);
    }
void mouse_cursor_graphic(unsigned char *curs_mask)
    {
    struct SREGS sregs;
    union REGS regs;
    unsigned char mask[64];
    int i;
    // Crea la screen mask in modo da avere la freccia del mouse
    // sempre dello stesso colore e lo spazio intorno trasparente.
    for (i = 0; i < 64; i++)
        {
        mask[i] = i < 32 ? 0xff ^ curs_mask[i] : curs_mask[i - 32];
        }
 
regs.x.ax
 = 0x09;
    regs.x.bx = 1;
 
regs.x.cx
 = 1;
 
sregs.es
 = FP_SEG(mask);
    regs.x.dx = FP_OFF(mask);
    int86x(0x33, &regs, &regs, &sregs);
    }
int main(void)
    {
    char c = 0 ;
    struct mouse_info mouse;
    struct mouse_info old_m = {0, 0, 0, 0, 0};
    int colore = 1;
    int cursor_change = 1;
    unsigned char mouse_ar[7][32] = {
        {0},
        {0,128,0,192,0,224,0,240,0,248,124,252,102,254,102,    // R
         255,102,248,124,216,108,140,102,12,102,6,102,6,0,0,0,0},
        {0,128,0,192,0,224,0,240,0,248,124,252,102,254,102,    // B
         255,102,248,124,216,102,140,102,12,102,6,124,6,0,0,0,0},
        {0,128,0,192,0,224,0,240,0,248,60,252,24,254,24,255,    // I
         24,248,24,216,24,140,24,12,24,6,60,6,0,0,0,0},
        {0,128,0,192,0,224,0,240,0,248,102,252,102,254,102,    // V
         255,102,248,102,216,102,140,102,12,60,6,24,6,0,0,0,0},
        {0,128,0,192,0,224,0,240,0,248,60,252,102,254,102,    // G
         255,96,248,96,216,110,140,102,12,102,6,62,6,0,0,0,0},
        {0,128,0,192,0,224,0,240,0,248,24,252,60,254,102,255,    // A
         102,248,102,216,126,140,102,12,102,6,102,6,0,0,0,0}
        };
    int i;
    int gdriver = VGA;
    int gmode = VGAHI;
    registerbgidriver(EGAVGA_driver);
    initgraph(&gdriver, &gmode, "");
    graphresult();
    mouse_reset();
    for (i = EGA_BLUE; i <= EGA_MAGENTA; i++)
        {
        setcolor(i);
        setfillstyle(SOLID_FILL, i);
        rectangle(80 * i, 200, 80 * (i + 1) - 1, 300);
        floodfill(80 * i + 10, 210, i);
        }
    mouse_cursor(1);
    while ( c != '\x1B' )
        {
        if (cursor_change)
            {
            mouse_cursor_graphic(mouse_ar[colore]);
            cursor_change = 0;
            }
        if (kbhit()) c = getch();
        mouse_get(&mouse, 1);
        if ((mouse.x != old_m.x) ||
            (mouse.y != old_m.y) ||
            (
mouse.lb
 != 
old_m.lb
) ||
            (mouse.rb != old_m.rb) ||
            (mouse.mb != old_m.mb))
            {
            mouse_cursor(0) ;
            printf("%4u,%4u,%u,%u,%u\r", mouse.x, mouse.y, 
mouse.lb
,
                mouse.mb, mouse.rb);
            mouse_cursor(1) ;
            }
        if (
mouse.lb
 && !
old_m.lb
)
            {
            colore++;
            cursor_change = 1;
            }
        if (colore > 6)
            {
            colore = 1;
            }
        old_m.x = mouse.x;
        old_m.y = mouse.y;
 
old_m.lb
 = 
mouse.lb
;
        old_m.rb = mouse.rb;
        old_m.mb = mouse.mb;
        }
    mouse_cursor(0);
    return 0;
    }

 Brown ho visto quant'e' semplice usare il mouse nei programmi DOS e
Volevo postarti del codice vecchiotto ma già pronto all'uso, proveniente da
una BBS (e quindi qualche annetto fa).
Poi ho pensato che avrei disturbato gli altri con qualche K di codice. (7,22
K)
Scrivimi in e-mail e te lo inoltro.
--
Alessandro Monti

 proveniente da una BBS (e quindi qualche annetto fa).
Anch'io sono stato un frequentatore (e point) di BBS per vari anni e
cosi' ho qualche file messo da parte :-)
Comunque ho spulciato anche interi CD di raccolte di software (tipo i
vecchi NightOwl) e di sorgenti e non ho trovato nulla. Molti esempi su
come usare il mouse ma nemmeno uno su come colorarlo (mi viene da
pensare che non si puo').
Inoltre vorrei anche capire come mai quelle quattro righe che ho
scritto mandano di tanto in tanto il PC in crash.

 
nonzo... non e' che simula la pressione di alcuni tasti??
bye!
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
"E se la torre di Pisa avesse ragione lei?"
		-- Walter Valdi

nonzo... non e' che simula la pressione di alcuni tasti??
Quando la usi come tasto allora si comporta come terzo tasto del
mouse. Quello che mi manca e' quando la usi come rotella per scorrere
il testo.

Logitech ?
Installare un driver per il mouse scritto da te (ma per far questo dovresti
sapere come il mouse Logitech notifica tramite interrupt e porte hardware il
movimento della rotellina).
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------

e porte hardware il movimento della rotellina).
Era per l'appunto quello che cercavo, solo che non ho trovato nulla
:-((

:-((
Al sito della Logitech? Una ricerca su Altavista con le parole "Logitech
Hardware programming"?


Hardware programming"?
Cercato molto, trovato nulla :-((((

 
intendevo dire che, magari, simula la pressione di qualche tasto, tipo
"Pag. Su" e "Pag. Giu'", pero' non lo so: non ho la rotella :-)
bye!
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
Se ti lanci con il paracadute, e il paracadute non si apre, e i tuoi
amici ti guardano tutti cadere, penso che sarebbe una gag divertente
pretendere che tu stia nuotando.
		-- Jack Handey

 "Pag. Su" e "Pag. Giu'", pero' non lo so: non ho la rotella :-)
Per sincerarsene, dato che comunque il mouse è su una porta seriale,
basterebbe disabilitare il muose e intercettare tutti i caratteri che
provengono dalla porta.
Una cosa come:
c:\>ctty com1
dovrebbe stamparti a video i caratteri, ma potrebbero essere
incomprensibili, oltretutto dovresti resettare il PC.
Però magari funziona anche una cosa come:
c:\>copy com1 codici.txt
e poi guardare dentro il file codici.txt per vedere cosa ha combinato. C'è
il problema di far terminare la scrittura, ma forse un bel reset è
sufficente.
Oppure ancora puoi scriverti un programmino in C del tipo CAT.C (sorgente
del comando cat in unix, di solito incluso in tutti gli esempi) e
interrompere la scrittura dopo n caratteri. (eventualmente ti posto le 30
righe di sorgente, commenti inclusi)
c:>cat com1 codici.txt
Spero di essermi spiegato.
Ciao
--
Alessandro Monti

provengono dalla porta.
L'idea e' ganza ma non risolve il problema. A parte il fatto che
bisognerebbe essere certi della velocita' di trasmissione da mouse
verso COM1: (9600 ?) una volta individuati i caratteri inviati dal
mouse non sarebbe possibile risalire a quale interrupt gestisce tale
informazione.
Pertanto, secondo me, l'unico modo di sapere che la rotellina e' stata
utilizzata sarebbe quello di scrivere un driver del mouse che si
sostituisca a quello originale della Logitech.
Non credete che si stia un pochino esagerando ? Siamo partiti dal
voler dare un po' di rotella ad un programma DOS (sono troppo abituato
ad usarla in Win) e si e' arrivati a pensare di riscrivere il driver.
Se andiamo avanti cosi' riscriviamo il DOS.
p.s. Direi che ormai il discorso e' un pochino OT.

 p.s. Direi che ormai il discorso e' un pochino OT.
Mah, finchè non ci urlano dietro...
E poi non so quale NG sarebbe adatto.
--
Alessandro Monti


non vorrei scoraggiarvi, ma...
Se proprio volete scrivere, contribuite allo sviluppo dello unix-rifatto :-)
 
bye!
-- 
Emanuele Cesena                 
http://www.penguinpowered.com/~ecesena
ece...@penguinpowered.com
                 Attenti all'antispam NOSPAM
Medico giapponese: "Ma che magnifico colorito giallo abbiamo oggi!".
		-- Da it.hobby.umorismo

> Se proprio volete scrivere, contribuite allo sviluppo dello unix-rifatto
:-)
Non c'è già abbastanza gente?
E poi il DOS non sarebbe mica da buttare via, se si migliorasse un tantino.
Il DR-DOS a suo tempo aveva dimostrato che è possibile, anche mantenendo la
quasi totale compatibilità.
--
Alessandro Monti