## diffname port/devmouse.c 1993/1006 ## diff -e /dev/null /n/fornaxdump/1993/1006/sys/src/brazil/port/devmouse.c 0a #include "u.h" #include "../port/lib.h" #include #include #include "mem.h" #include "dat.h" #include "fns.h" #include "../port/error.h" #include "devtab.h" /* * Some monochrome screens are reversed from what we like: * We want 0's bright and 1's dark. * Indexed by an Fcode, these compensate for the source bitmap being wrong * (exchange S rows) and destination (exchange D columns and invert result) */ int flipS[] = { 0x0, 0x4, 0x8, 0xC, 0x1, 0x5, 0x9, 0xD, 0x2, 0x6, 0xA, 0xE, 0x3, 0x7, 0xB, 0xF }; int flipD[] = { 0xF, 0xD, 0xE, 0xC, 0x7, 0x5, 0x6, 0x4, 0xB, 0x9, 0xA, 0x8, 0x3, 0x1, 0x2, 0x0, }; int flipping; /* are flip tables being used to transform Fcodes? */ typedef struct Mouseinfo Mouseinfo; typedef struct Cursorinfo Cursorinfo; struct Mouseinfo { /* * First three fields are known in some l.s's */ int dx; int dy; int track; /* l.s has updated dx & dy */ Mouse; int redraw; /* update cursor on screen */ ulong counter; /* increments every update */ ulong lastcounter; /* value when /dev/mouse read */ Rendez r; Ref; QLock; int open; }; struct Cursorinfo { Cursor; Lock; int visible; /* on screen */ int disable; /* from being used */ Rectangle r; /* location */ }; Mouseinfo mouse; Cursorinfo cursor; int mouseshifted; int mousetype; int hwcurs; Cursor arrow = { {-1, -1}, {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, }, {0x00, 0x00, 0x7F, 0xC0, 0x7F, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x7F, 0x00, 0x6F, 0x80, 0x67, 0xC0, 0x43, 0xE0, 0x41, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, } }; ulong setbits[16]; GBitmap set = { setbits, 0, 1, 0, {0, 0, 16, 16}, {0, 0, 16, 16} }; ulong clrbits[16]; GBitmap clr = { clrbits, 0, 1, 0, {0, 0, 16, 16}, {0, 0, 16, 16} }; ulong cursorbackbits[16*4]; GBitmap cursorback = { cursorbackbits, 0, 1, 0, {0, 0, 16, 16}, {0, 0, 16, 16} }; void Cursortocursor(Cursor*); int mousechanged(void*); enum{ Qdir, Qmouse, Qmousectl, }; Dirtab mousedir[]={ "mouse", {Qmouse}, 0, 0666, "mousectl", {Qmousectl}, 0, 0220, }; #define NMOUSE (sizeof(mousedir)/sizeof(Dirtab)) extern GBitmap gscreen; void mousereset(void) { ulong r; if(!conf.monitor) return; getcolor(0, &r, &r, &r); if(r == 0) flipping = 1; flipping = 0; /* howard, why is this necessary to get a black arrow on carrera? */ Cursortocursor(&arrow); } void mouseinit(void) { if(!conf.monitor) return; if(gscreen.ldepth > 3) cursorback.ldepth = 0; else{ cursorback.ldepth = gscreen.ldepth; cursorback.width = ((16 << gscreen.ldepth) + 31) >> 5; } cursoron(1); } Chan* mouseattach(char *spec) { if(!conf.monitor) error(Egreg); return devattach('m', spec); } Chan* mouseclone(Chan *c, Chan *nc) { nc = devclone(c, nc); if(c->qid.path != CHDIR) incref(&mouse); return nc; } int mousewalk(Chan *c, char *name) { return devwalk(c, name, mousedir, NMOUSE, devgen); } void mousestat(Chan *c, char *db) { devstat(c, db, mousedir, NMOUSE, devgen); } Chan* mouseopen(Chan *c, int omode) { switch(c->qid.path){ case CHDIR: if(omode != OREAD) error(Eperm); break; case Qmouse: lock(&mouse); if(mouse.open){ unlock(&mouse); error(Einuse); } mouse.open = 1; mouse.ref++; unlock(&mouse); break; default: incref(&mouse); } c->mode = openmode(omode); c->flag |= COPEN; c->offset = 0; return c; } void mousecreate(Chan *c, char *name, int omode, ulong perm) { if(!conf.monitor) error(Egreg); USED(c, name, omode, perm); error(Eperm); } void mouseremove(Chan *c) { USED(c); error(Eperm); } void mousewstat(Chan *c, char *db) { USED(c, db); error(Eperm); } void mouseclose(Chan *c) { if(c->qid.path!=CHDIR && (c->flag&COPEN)){ lock(&mouse); if(c->qid.path == Qmouse) mouse.open = 0; unlock(&mouse); } } long mouseread(Chan *c, void *va, long n, ulong offset) { uchar *p; USED(offset); if(c->qid.path & CHDIR) return devdirread(c, va, n, mousedir, NMOUSE, devgen); if(c->qid.path == Qmouse){ /* * mouse: * 'm' 1 * buttons 1 * point 8 * msec 4 */ if(n < 14) error(Eshort); while(mousechanged(0) == 0) sleep(&mouse.r, mousechanged, 0); lock(&cursor); p = va; p[0] = 'm'; p[1] = mouse.buttons; BPLONG(p+2, mouse.xy.x); BPLONG(p+6, mouse.xy.y); BPLONG(p+10, TK2MS(MACHP(0)->ticks)); mouse.lastcounter = mouse.counter; unlock(&cursor); return 14; } return 0; } long mousewrite(Chan *c, void *va, long n, ulong offset) { uchar *p; Point pt; char buf[64]; USED(offset); switch(c->qid.path){ case CHDIR: error(Eisdir); case Qmousectl: if(n >= sizeof(buf)) n = sizeof(buf)-1; strncpy(buf, va, n); buf[n] = 0; mousectl(buf); return n; case Qmouse: if(n != 9) error(Eshort); qlock(&mouse); p = va; pt.x = BGLONG(p+1); pt.y = BGLONG(p+5); if(ptinrect(pt, gscreen.r)){ mouse.xy = pt; mouse.redraw = 1; mouse.track = 1; mouseclock(); } qunlock(&mouse); return n; } error(Egreg); return -1; } void Cursortocursor(Cursor *c) { int i; uchar *p; lock(&cursor); memmove(&cursor, c, sizeof(Cursor)); for(i=0; i<16; i++){ p = (uchar*)&setbits[i]; *p = c->set[2*i]; *(p+1) = c->set[2*i+1]; p = (uchar*)&clrbits[i]; *p = c->clr[2*i]; *(p+1) = c->clr[2*i+1]; } if(hwcurs) hwcursset(set.base, clr.base, cursor.offset.x, cursor.offset.y); unlock(&cursor); } void cursoron(int dolock) { if(cursor.disable) return; if(dolock) lock(&cursor); if(cursor.visible++ == 0){ if(hwcurs) hwcursmove(mouse.xy.x, mouse.xy.y); else { cursor.r.min = mouse.xy; cursor.r.max = add(mouse.xy, Pt(16, 16)); cursor.r = raddp(cursor.r, cursor.offset); gbitblt(&cursorback, Pt(0, 0), &gscreen, cursor.r, S); gbitblt(&gscreen, cursor.r.min, &clr, Rect(0, 0, 16, 16), flipping? flipD[D&~S] : D&~S); gbitblt(&gscreen, cursor.r.min, &set, Rect(0, 0, 16, 16), flipping? flipD[S|D] : S|D); mbbrect(cursor.r); } } if(dolock) unlock(&cursor); } void cursoroff(int dolock) { if(cursor.disable) return; if(dolock) lock(&cursor); if(--cursor.visible == 0) { if(!hwcurs) { gbitblt(&gscreen, cursor.r.min, &cursorback, Rect(0, 0, 16, 16), S); mbbrect(cursor.r); mousescreenupdate(); } } if(dolock) unlock(&cursor); } /* * called by the clock routine to redraw the cursor */ void mouseclock(void) { if(mouse.track){ mousetrack(mouse.buttons, mouse.dx, mouse.dy); mouse.track = 0; mouse.dx = 0; mouse.dy = 0; } if(mouse.redraw && canlock(&cursor)){ mouse.redraw = 0; cursoroff(0); cursoron(0); mousescreenupdate(); unlock(&cursor); } } /* * called at interrupt level to update the structure and * awaken any waiting procs. */ void mousetrack(int b, int dx, int dy) { int x, y; x = mouse.xy.x + dx; if(x < gscreen.r.min.x) x = gscreen.r.min.x; if(x >= gscreen.r.max.x) x = gscreen.r.max.x; y = mouse.xy.y + dy; if(y < gscreen.r.min.y) y = gscreen.r.min.y; if(y >= gscreen.r.max.y) y = gscreen.r.max.y; mouse.counter++; mouse.xy = Pt(x, y); mouse.buttons = b; mouse.redraw = 1; wakeup(&mouse.r); } /* * microsoft 3 button, 7 bit bytes * * byte 0 - 1 L R Y7 Y6 X7 X6 * byte 1 - 0 X5 X4 X3 X2 X1 X0 * byte 2 - 0 Y5 Y4 Y3 Y2 Y1 Y0 * byte 3 - 0 M x x x x x (optional) * * shift & right button is the same as middle button (for 2 button mice) */ int m3mouseputc(IOQ *q, int c) { static uchar msg[3]; static int nb; static int middle; static uchar b[] = { 0, 4, 1, 5, 0, 2, 1, 5 }; short x; int dx, dy, newbuttons; USED(q); /* * check bit 6 for consistency */ if(nb==0){ if((c&0x40) == 0){ /* an extra byte gets sent for the middle button */ middle = (c&0x20) ? 2 : 0; newbuttons = (mouse.buttons & ~2) | middle; mousetrack(newbuttons, 0, 0); return 0; } } msg[nb] = c; if(++nb == 3){ nb = 0; newbuttons = middle | b[(msg[0]>>4)&3 | (mouseshifted ? 4 : 0)]; x = (msg[0]&0x3)<<14; dx = (x>>8) | msg[1]; x = (msg[0]&0xc)<<12; dy = (x>>8) | msg[2]; mousetrack(newbuttons, dx, dy); } return 0; } /* * Logitech 5 byte packed binary mouse format, 8 bit bytes * * shift & right button is the same as middle button (for 2 button mice) */ int mouseputc(IOQ *q, int c) { static short msg[5]; static int nb; static uchar b[] = {0, 4, 2, 6, 1, 5, 3, 7, 0, 2, 2, 6, 1, 5, 3, 7}; int dx, dy, newbuttons; USED(q); if((c&0xF0) == 0x80) nb=0; msg[nb] = c; if(c & 0x80) msg[nb] |= ~0xFF; /* sign extend */ if(++nb == 5){ newbuttons = b[((msg[0]&7)^7) | (mouseshifted ? 8 : 0)]; dx = msg[1]+msg[3]; dy = -(msg[2]+msg[4]); mousetrack(newbuttons, dx, dy); nb = 0; } return 0; } int mousechanged(void *m) { USED(m); return mouse.lastcounter - mouse.counter; } . ## diffname port/devmouse.c 1993/1008 ## diff -e /n/fornaxdump/1993/1006/sys/src/brazil/port/devmouse.c /n/fornaxdump/1993/1008/sys/src/brazil/port/devmouse.c 311,313d 309a pt.y = strtoul(p, 0, 0); . 308c if(n > sizeof buf-1) n = sizeof buf -1; memmove(buf, va, n); buf[n] = 0; p = 0; pt.x = strtoul(buf, &p, 0); if(p == 0) . 289c char *p; . 281c if(n > 4*12) n = 4*12; memmove(va, buf, n); return n; . 273,278c sprint(buf, "%11d %11d %11d %11d", mouse.xy.x, mouse.xy.y, mouse.buttons, TK2MS(MACHP(0)->ticks)); . 261,269d 254c char buf[4*12+1]; . ## diffname port/devmouse.c 1993/1009 ## diff -e /n/fornaxdump/1993/1008/sys/src/brazil/port/devmouse.c /n/fornaxdump/1993/1009/sys/src/brazil/port/devmouse.c 288a case Qcursor: cursoroff(1); if(n < 2*4+2*2*16){ curs = arrow; Cursortocursor(&arrow); }else{ n = 2*4+2*2*16; curs.offset.x = BGLONG(p+0); curs.offset.y = BGLONG(p+4); memmove(curs.clr, p+8, 2*16); memmove(curs.set, p+40, 2*16); Cursortocursor(&curs); } cursoron(1); return n; . 284,285c p = va; . 260c case Qcursor: if(offset != 0) return 0; if(n < 2*4+2*2*16) error(Eshort); n = 2*4+2*2*16; lock(&cursor); BPLONG(p+0, curs.offset.x); BPLONG(p+4, curs.offset.y); memmove(p+8, curs.clr, 2*16); memmove(p+40, curs.set, 2*16); unlock(&cursor); return n; case Qmouse: . 256,257c p = va; switch(c->qid.path){ case CHDIR: . 254a uchar *p; . 246a if(--mouse.ref == 0){ cursoroff(1); curs = arrow; Cursortocursor(&arrow); cursoron(1); } . 143a curs = arrow; . 123a "cursor", {Qcursor}, 0, 0666, . 118a Qcursor, . 64a Cursor curs; . ## diffname port/devmouse.c 1993/1026 ## diff -e /n/fornaxdump/1993/1009/sys/src/brazil/port/devmouse.c /n/fornaxdump/1993/1026/sys/src/brazil/port/devmouse.c 381a unlock(&cursor); } void cursorlock(Rectangle r) { if(hwcurs) return; lock(&cursor); if(rectXrect(cursor.r, r)){ cursoroff(0); cursor.frozen = 1; } cursor.disable++; unlock(&cursor); } void cursorunlock(void) { if(hwcurs) return; lock(&cursor); cursor.disable--; if(cursor.frozen) cursoron(0); cursor.frozen = 0; . 56a int frozen; /* from being used */ . ## diffname port/devmouse.c 1993/1108 ## diff -e /n/fornaxdump/1993/1026/sys/src/brazil/port/devmouse.c /n/fornaxdump/1993/1108/sys/src/brazil/port/devmouse.c 328a qlock(&mouse); mouse.redraw = 1; mouseclock(); qunlock(&mouse); . ## diffname port/devmouse.c 1993/1201 ## diff -e /n/fornaxdump/1993/1108/sys/src/brazil/port/devmouse.c /n/fornaxdump/1993/1201/sys/src/brazil/port/devmouse.c 567d 560c mouseputc(int c) . 528d 519c m3mouseputc(int c) . ## diffname port/devmouse.c 1994/0210 ## diff -e /n/fornaxdump/1993/1201/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0210/sys/src/brazil/port/devmouse.c 10a #include "screen.h" . ## diffname port/devmouse.c 1994/0216 ## diff -e /n/fornaxdump/1994/0210/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0216/sys/src/brazil/port/devmouse.c 293c mouse.xy.x, mouse.xy.y, mouseswap ? map[mouse.buttons&7] : mouse.buttons, . 267a static int map[8] = {0, 4, 2, 6, 1, 5, 3, 7 }; . 262a . 65a int mouseswap; . ## diffname port/devmouse.c 1994/0325 ## diff -e /n/fornaxdump/1994/0216/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0325/sys/src/brazil/port/devmouse.c 315a USED(offset); . ## diffname port/devmouse.c 1994/0412 ## diff -e /n/fornaxdump/1994/0325/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0412/sys/src/brazil/port/devmouse.c 483d 457,461c if(!hwcurs) screenload(cursor.r, (uchar*)cursorbackbits, (16>>3) << gscreen.ldepth, cursorback.width*BY2WD, 0); . 442c screenload(cursor.r, (uchar*)cursorworkbits, (16>>3) << gscreen.ldepth, cursorwork.width*BY2WD, 0); . 440c gbitblt(&cursorwork, cursorwork.r.min, . 437,438c screenunload(cursor.r, (uchar*)cursorworkbits, (16>>3) << gscreen.ldepth, cursorwork.width*BY2WD, 0); memmove(cursorbackbits, cursorworkbits, 16*cursorback.width*BY2WD); gbitblt(&cursorwork, cursorwork.r.min, . 163a cursorwork.ldepth = gscreen.ldepth; cursorwork.width = ((16 << gscreen.ldepth) + 31) >> 5; . 161c cursorwork.ldepth = 0; }else{ . 159c if(gscreen.ldepth > 3){ . 120a extern void screenload(Rectangle, uchar*, int, int, int); extern void screenunload(Rectangle, uchar*, int, int, int); . 117a ulong cursorworkbits[16*4]; GBitmap cursorwork = { cursorworkbits, 0, 1, 0, {0, 0, 16, 16}, {0, 0, 16, 16} }; . ## diffname port/devmouse.c 1994/0413 ## diff -e /n/fornaxdump/1994/0412/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0413/sys/src/brazil/port/devmouse.c 476,480c if(--cursor.visible == 0 && !hwcurs && cursor.tl > 0) screenload(cursor.clipr, (uchar*)backbits, cursor.tl, cursor.l, 0); . 454,462c /* bit offset into backup area */ off = ((1< 0){ /* get tile */ screenunload(x.r, (uchar*)workbits, cursor.tl, cursor.l, 0); /* save for cursoroff */ memmove(backbits, workbits, cursor.l*16); /* add mouse into work area */ r = Rect(0, 0, Dx(x.r), Dy(x.r)); bitblt(&cursorwork, x.p, &clr, r, cursor.clrop); bitblt(&cursorwork, x.p, &set, r, cursor.setop); /* put back tile */ cursor.clipr = x.r; screenload(x.r, (uchar*)workbits, cursor.tl, cursor.l, 0); } . 442a int off; Rectangle r; uchar *a; XXX x; extern int graphicssubtile(uchar*, int, int, Rectangle, Rectangle, uchar**); . 439a typedef struct { Bitmap *dm; Point p; Bitmap *sm; Rectangle r; Fcode f; } XXX; . 189a cursorinit(); . 181a cursorinit(); . 174,180c print("mouse can't work ldepth > 3"); cursor.disable = 1; . 172a . 168a cursorinit(void) { cursorwork.ldepth = gscreen.ldepth; cursorwork.width = ((cursorwork.r.max.x << gscreen.ldepth) + 31) >> 5; cursor.l = cursorwork.width*BY2WD; if(flipping){ cursor.setop = flipD[S|D]; cursor.clrop = flipD[D&~S]; } else { cursor.setop = S|D; cursor.clrop = D&~S; } } void . 150c extern Bitmap gscreen; . 125,126d 122a workbits, . 121c {0, 0, 16+8, 16}, {0, 0, 16+8, 16}, . 118,119c ulong backbits[16*5]; ulong workbits[16*5]; Bitmap cursorwork = . 114,115d 111a clrbits, . 104,110c {0, 0, 16, 16}, . 99,102d 97c Bitmap clr = . 92,93d 89a setbits, . 88c {0, 0, 16, 16}, {0, 0, 16, 16}, . 86c Bitmap set = . 59a int l; int tl; int setop; int clrop; Rectangle clipr; . 4d ## diffname port/devmouse.c 1994/0414 ## diff -e /n/fornaxdump/1994/0413/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0414/sys/src/brazil/port/devmouse.c 653a } Point mousexy(void) { return mouse.xy; . 439,529d 425,437d 420,421c setcursor(setbits, clrbits, cursor.offset.x, cursor.offset.y); . 411c memmove(&cursor.Cursor, c, sizeof(Cursor)); . 201d 186,192d 164,180d 155,158d 150,151d 127,129d 112,123d 102,110d 91,100d 72,73c Cursor curs; . 51,66d 31d 12,29d ## diffname port/devmouse.c 1994/0520 ## diff -e /n/fornaxdump/1994/0414/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0520/sys/src/brazil/port/devmouse.c 311,319c setcursor(c); . 306,308d 54,56d ## diffname port/devmouse.c 1994/0521 ## diff -e /n/fornaxdump/1994/0520/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0521/sys/src/brazil/port/devmouse.c 47,51c { 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF0, 0x7F, 0xE0, 0x7F, 0xE0, 0x7F, 0xF0, 0x7F, 0xF8, 0x7F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFC, 0x73, 0xF8, 0x61, 0xF0, 0x60, 0xE0, 0x40, 0x40, 0x00, 0x00, }, . 39,45c Cursor arrow = { { -1, -1 }, { 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x80, 0x0C, 0x80, 0x10, 0x80, 0x10, 0x80, 0x08, 0x80, 0x04, 0x80, 0x02, 0x80, 0x01, 0x80, 0x02, 0x8C, 0x04, 0x92, 0x08, 0x91, 0x10, 0xA0, 0xA0, 0xC0, 0x40, . ## diffname port/devmouse.c 1994/0624 ## diff -e /n/fornaxdump/1994/0521/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0624/sys/src/brazil/port/devmouse.c 324c mouse.redraw = cursoron(0); . ## diffname port/devmouse.c 1994/0730 ## diff -e /n/fornaxdump/1994/0624/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0730/sys/src/brazil/port/devmouse.c 412a USED(q); . 406c mouseputc(void *q, int c) . 374a USED(q); . 366c m3mouseputc(void *q, int c) . ## diffname port/devmouse.c 1994/0913 ## diff -e /n/fornaxdump/1994/0730/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/0913/sys/src/brazil/port/devmouse.c 352a graphicsactive(1); . 326a graphicsactive(0); . ## diffname port/devmouse.c 1994/1013 ## diff -e /n/fornaxdump/1994/0913/sys/src/brazil/port/devmouse.c /n/fornaxdump/1994/1013/sys/src/brazil/port/devmouse.c 280c pt.x = strtoul(buf+1, &p, 0); . 225,226c if(n > 1+4*12) n = 1+4*12; . 219c sprint(buf, "m%11d %11d %11d %11d", . ## diffname port/devmouse.c 1995/0108 ## diff -e /n/fornaxdump/1994/1013/sys/src/brazil/port/devmouse.c /n/fornaxdump/1995/0108/sys/src/brazil/port/devmouse.c 296a } long mousebwrite(Chan *c, Block *bp, ulong offset) { return devbwrite(c, bp, offset); . 232a Block* mousebread(Chan *c, long n, ulong offset) { return devbread(c, n, offset); } . ## diffname port/devmouse.c 1995/0804 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/devmouse.c /n/fornaxdump/1995/0804/sys/src/brazil/port/devmouse.c 448d 446c mousechanged(void*) . 429d 422c mouseputc(void*, int c) . 389,390d 380c m3mouseputc(void*, int c) . 246d 240c mousewrite(Chan *c, void *va, long n, ulong) . 167d 165c mousewstat(Chan*, char*) . 160d 158c mouseremove(Chan*) . 153d 149c mousecreate(Chan*, char*, int, ulong) . ## diffname port/devmouse.c 1995/0812 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/devmouse.c /n/fornaxdump/1995/0812/sys/src/brazil/port/devmouse.c 215c while(!canlock(&cursor)) tsleep(&up->sleep, return0, 0, TK2MS(1)); . ## diffname port/devmouse.c 1995/1216 ## diff -e /n/fornaxdump/1995/0812/sys/src/brazil/port/devmouse.c /n/fornaxdump/1995/1216/sys/src/brazil/port/devmouse.c 450a } void mouseaccelerate(char *x) { if(x == 0) x = "1"; mouse.acceleration = atoi(x); if(mouse.acceleration < 3) mouse.maxacc = 2; else mouse.maxacc = mouse.acceleration; . 349a if(mouse.acceleration){ dx = scale(dx); dy = scale(dy); } . 340a static int scale(int x) { int sign = 1; if(x < 0){ sign = -1; x = -x; } switch(x){ case 0: case 1: case 2: case 3: break; case 4: x = 6 + (mouse.acceleration>>2); break; case 5: x = 9 + (mouse.acceleration>>1); break; default: x *= mouse.maxacc; break; } return sign*x; } . 275c if(buf[n - 1] == '\n') buf[n-1] = 0; else buf[n] = 0; . 29a int acceleration; int maxacc; . ## diffname port/devmouse.c 1996/0223 ## diff -e /n/fornaxdump/1995/1216/sys/src/brazil/port/devmouse.c /n/fornaxdump/1996/0223/sys/src/brazil/port/devmouse.c 9d ## diffname port/devmouse.c 1997/0201 ## diff -e /n/fornaxdump/1996/0223/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/0201/sys/src/brazil/port/devmouse.c 3c #include . ## diffname port/devmouse.c 1997/0202 ## diff -e /n/emeliedump/1997/0201/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/0202/sys/src/brazil/port/devmouse.c 3c #include . ## diffname port/devmouse.c 1997/0327 ## diff -e /n/emeliedump/1997/0202/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/0327/sys/src/brazil/port/devmouse.c 327c static void . 308,312c Dev mousedevtab = { mousereset, mouseinit, mouseattach, mouseclone, mousewalk, mousestat, mouseopen, mousecreate, mouseclose, mouseread, devbread, mousewrite, devbwrite, devremove, devwstat, }; . 234,240c static long . 197c return devdirread(c, va, n, mousedir, nelem(mousedir), devgen); . 187c static long . 157,169c static void . 149c static void . 122c static Chan* . 119c devstat(c, db, mousedir, nelem(mousedir), devgen); . 116c static void . 113c return devwalk(c, name, mousedir, nelem(mousedir), devgen); . 110c static int . 101c static Chan* . 93c static Chan* . 84c static void . 81a addclock0link(mouseclock); . 74c static void . 70,71d 55a static void mouseclock(void); . 8a #include . 3d ## diffname port/devmouse.c 1997/0408 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/0408/sys/src/brazil/port/devmouse.c 290a 'm', "mouse", . ## diffname port/devmouse.c 1997/1101 ## diff -e /n/emeliedump/1997/0408/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/1101/sys/src/brazil/port/devmouse.c 398c drawactive(1); . 339c drawactive(0); . 71c extern Memimage gscreen; . 36d 20c int track; /* dx & dy updated */ . 15,17d 8c #define Image IMAGE #define mouse moose #include #undef mouse #include . ## diffname port/devmouse.c 1997/1112 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/port/devmouse.c /n/emeliedump/1997/1112/sys/src/brazil/port/devmouse.c 425c /* * an extra byte comes for middle button motion. * only two possible values for the extra byte. */ if(c == 0x00 || c == 0x20){ . 421,423d ## diffname port/devmouse.c 1998/0209 ## diff -e /n/emeliedump/1997/1112/sys/src/brazil/port/devmouse.c /n/emeliedump/1998/0209/sys/src/brazil/port/devmouse.c 40,53d ## diffname port/devmouse.c 1998/0319 ## diff -e /n/emeliedump/1998/0209/sys/src/brazil/port/devmouse.c /n/emeliedump/1998/0319/sys/src/brazil/port/devmouse.c 209c mousewrite(Chan *c, void *va, long n, vlong) . 166a ulong offset = off; . 162c mouseread(Chan *c, void *va, long n, vlong off) . ## diffname port/devmouse.c 1998/0417 ## diff -e /n/emeliedump/1998/0319/sys/src/brazil/port/devmouse.c /n/emeliedump/1998/0417/sys/src/brazil/port/devmouse.c 249c nf = parsefields(buf, field, 3, " "); if(strcmp(field[0], "swap") == 0){ if(mouseswap) setbuttonmap("123"); else setbuttonmap("321"); mouseswap ^= 1; } else if(strcmp(field[0], "buttonmap") == 0){ if(nf == 1) setbuttonmap("123"); else setbuttonmap(field[1]); } else mousectl(field, nf); . 214c char buf[64], *field[3]; int nf; . 208a static void setbuttonmap(char* map) { int i, x, one, two, three; one = two = three = 0; for(i = 0; i < 3; i++){ if(map[i] == 0) error(Ebadarg); if(map[i] == '1'){ if(one) error(Ebadarg); one = 1< . 11d 9d ## diffname port/devmouse.c 1999/0225 ## diff -e /n/emeliedump/1999/0119/sys/src/brazil/port/devmouse.c /n/emeliedump/1999/0225/sys/src/brazil/port/devmouse.c 540,542c mouse.acceleration = x; . 538c mouseaccelerate(int x) . ## diffname port/devmouse.c 1999/0320 ## diff -e /n/emeliedump/1999/0225/sys/src/brazil/port/devmouse.c /n/emeliedump/1999/0320/sys/src/brazil/port/devmouse.c 503c mouseputc(Queue*, int c) . 462c m3mouseputc(Queue*, int c) . ## diffname port/devmouse.c 1999/1005 ## diff -e /n/emeliedump/1999/0320/sys/src/brazil/port/devmouse.c /n/emeliedump/1999/1005/sys/src/brazil/port/devmouse.c 439,442c if(y < gscreen->r.min.y) y = gscreen->r.min.y; if(y >= gscreen->r.max.y) y = gscreen->r.max.y; . 434,437c if(x < gscreen->r.min.x) x = gscreen->r.min.x; if(x >= gscreen->r.max.x) x = gscreen->r.max.x; . 428a if(gscreen==nil) return; . 326c if(ptinrect(pt, gscreen->r)){ . 61c extern Memimage* gscreen; . ## diffname port/devmouse.c 1999/1012 ## diff -e /n/emeliedump/1999/1005/sys/src/brazil/port/devmouse.c /n/emeliedump/1999/1012/sys/src/brazil/port/devmouse.c 314a case Qmousein: if(n > sizeof buf-1) n = sizeof buf -1; memmove(buf, va, n); buf[n] = 0; p = 0; pt.x = strtol(buf+1, &p, 0); if(p == 0) error(Eshort); pt.y = strtol(p, &p, 0); if(p == 0) error(Eshort); b = strtol(p, &p, 0); mousetrack(b, pt.x, pt.y); return n; . 262c int nf, b; . 153a else if(c->qid.path == Qmousein){ mouse.inopen = 0; unlock(&mouse); return; } . 129a case Qmousein: lock(&mouse); if(mouse.inopen){ unlock(&mouse); error(Einuse); } mouse.inopen = 1; unlock(&mouse); break; . 52a "mousein", {Qmousein}, 0, 0220, . 46a Qmousein, . 29a int inopen; . ## diffname port/devmouse.c 2000/0308 ## diff -e /n/emeliedump/1999/1012/sys/src/brazil/port/devmouse.c /n/emeliedump/2000/0308/sys/src/9/port/devmouse.c 314c nf = getfields(buf, field, 3, 1, " "); . ## diffname port/devmouse.c 2000/0314 ## diff -e /n/emeliedump/2000/0308/sys/src/9/port/devmouse.c /n/emeliedump/2000/0314/sys/src/9/port/devmouse.c 564c return mouse.lastcounter != mouse.counter; . 482a mouse.counter++; mouse.msec = TK2MS(MACHP(0)->ticks); /* * if the queue fills, we discard the entire queue and don't * queue any more events until a reader polls the mouse. */ if(!mouse.qfull && lastb != b) { /* add to ring */ mouse.queue[mouse.wi] = mouse.Mousestate; if(++mouse.wi == nelem(mouse.queue)) mouse.wi = 0; if(mouse.wi == mouse.ri) mouse.qfull = 1; } . 479c lastb = mouse.buttons; . 460c int x, y, lastb; . 217,221c m.xy.x, m.xy.y, buttonmap[m.buttons&7], m.msec); mouse.lastcounter = m.counter; . 215a /* * No lock of the indicies is necessary here, because ri is only * updated by us, and there is only one mouse reader * at a time. I suppose that more than one process * could try to read the fd at one time, but such behavior * is degenerate and already violates the calling * conventions for sleep above. */ if(mouse.ri != mouse.wi) { m = mouse.queue[mouse.ri]; if(++mouse.ri == nelem(mouse.queue)) mouse.ri = 0; } else { while(!canlock(&cursor)) tsleep(&up->sleep, return0, 0, TK2MS(1)); m = mouse.Mousestate; unlock(&cursor); } . 213,214c mouse.qfull = 0; . 188a Mousestate m; . 32a Mousestate queue[16]; /* circular buffer of click events */ int ri; /* read index into queue */ int wi; /* write index into queue */ uchar qfull; /* queue is full */ . 24d 21,22d 17a Mousestate; . 15a struct Mousestate { Point xy; /* mouse.xy */ int buttons; /* mouse.buttons */ ulong counter; /* increments every update */ ulong msec; /* time of last event */ }; . 14a typedef struct Mousestate Mousestate; . ## diffname port/devmouse.c 2000/0516 ## diff -e /n/emeliedump/2000/0314/sys/src/9/port/devmouse.c /n/emeliedump/2000/0516/sys/src/9/port/devmouse.c 144a error("disabled"); . ## diffname port/devmouse.c 2000/0716 ## diff -e /n/emeliedump/2000/0516/sys/src/9/port/devmouse.c /n/emeliedump/2000/0716/sys/src/9/port/devmouse.c 589c static uchar b[] = {0, 4, 2, 6, 1, 5, 3, 7, 0, 2, 2, 6, 1, 3, 3, 7}; . 549c static uchar b[] = { 0, 4, 1, 5, 0, 2, 1, 3 }; . 145c /* error("disabled"); */ . ## diffname port/devmouse.c 2000/1012 ## diff -e /n/emeliedump/2000/0716/sys/src/9/port/devmouse.c /n/emeliedump/2000/1012/sys/src/9/port/devmouse.c 250c b, . 247a b = buttonmap[m.buttons&7]; /* put buttons 4 and 5 back in */ b |= m.buttons & (3<<3); . 201a int b; . ## diffname port/devmouse.c 2001/0527 ## diff -e /n/emeliedump/2000/1012/sys/src/9/port/devmouse.c /n/emeliedump/2001/0527/sys/src/9/port/devmouse.c 605c mousetrack(dx, dy, newbuttons, TK2MS(MACHP(0)->ticks)); . 578c mousetrack(dx, dy, newbuttons, TK2MS(MACHP(0)->ticks)); . 566c mousetrack(0, 0, newbuttons, TK2MS(MACHP(0)->ticks)); . 520c mouse.msec = msec; . 493c mousetrack(int dx, int dy, int b, int msec) . 446c mousetrack(mouse.dx, mouse.dy, mouse.buttons, TK2MS(MACHP(0)->ticks)); . 415d 380c msec = strtol(p, &p, 0); if(msec == 0) msec = TK2MS(MACHP(0)->ticks); mousetrack(pt.x, pt.y, b, msec); . 317,318c switch((ulong)c->qid.path){ case Qdir: . 314c int nf, b, msec; . 205,206c switch((ulong)c->qid.path){ case Qdir: . 174c if((c->qid.type&QTDIR)==0 && (c->flag&COPEN)){ . 129,130c switch((ulong)c->qid.path){ case Qdir: . 120,125d 117c return devstat(c, db, n, mousedir, nelem(mousedir), devgen); . 115c mousestat(Chan *c, uchar *db, int n) . 111c return wq; . 108,109c Walkqid *wq; wq = devwalk(c, nc, name, nname, mousedir, nelem(mousedir), devgen); if(wq != nil && wq->clone != c && (wq->clone->qid.type&QTDIR)==0) . 105,106c static Walkqid* mousewalk(Chan *c, Chan *nc, char **name, int nname) . 63a ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, . ## diffname port/devmouse.c 2001/1015 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/devmouse.c /n/emeliedump/2001/1015/sys/src/9/port/devmouse.c 509,512c if(y < gscreen->clipr.min.y) y = gscreen->clipr.min.y; if(y >= gscreen->clipr.max.y) y = gscreen->clipr.max.y; . 504,507c if(x < gscreen->clipr.min.x) x = gscreen->clipr.min.x; if(x >= gscreen->clipr.max.x) x = gscreen->clipr.max.x; . ## diffname port/devmouse.c 2001/1117 ## diff -e /n/emeliedump/2001/1015/sys/src/9/port/devmouse.c /n/emeliedump/2001/1117/sys/src/9/port/devmouse.c 346c nf = tokenize(buf, field, 3); . ## diffname port/devmouse.c 2001/1120 ## diff -e /n/emeliedump/2001/1117/sys/src/9/port/devmouse.c /n/emeliedump/2001/1120/sys/src/9/port/devmouse.c 360,361c free(cb); poperror(); . 358c setbuttonmap(cb->f[1]); break; case CMwildcard: mousectl(cb); break; . 353,355c break; case CMbuttonmap: if(cb->nf == 1) . 339,347c cb = parsecmd(va, n); if(waserror()){ free(cb); nexterror(); } ct = lookupcmd(cb, mousectlmsg, nelem(mousectlmsg)); switch(ct->index){ case CMswap: . 310,311c Cmdbuf *cb; Cmdtab *ct; char buf[64]; int b, msec; . 45a enum { CMbuttonmap, CMswap, CMwildcard, }; static Cmdtab mousectlmsg[] = { CMbuttonmap, "buttonmap", 0, CMswap, "swap", 1, CMwildcard, "*", 0, }; . ## diffname port/devmouse.c 2002/0109 ## diff -e /n/emeliedump/2001/1120/sys/src/9/port/devmouse.c /n/emeliedump/2002/0109/sys/src/9/port/devmouse.c 437a devshutdown, . ## diffname port/devmouse.c 2002/0502 ## diff -e /n/emeliedump/2002/0109/sys/src/9/port/devmouse.c /n/emeliedump/2002/0502/sys/src/9/port/devmouse.c 156c if(!iseve()) error(Eperm); . ## diffname port/devmouse.c 2002/0928 ## diff -e /n/emeliedump/2002/0502/sys/src/9/port/devmouse.c /n/emeliedump/2002/0928/sys/src/9/port/devmouse.c 100c /* redraw cursor about 30 times per second */ addclock0link(mouseclock, 33); . ## diffname port/devmouse.c 2002/1109 ## diff -e /n/emeliedump/2002/0928/sys/src/9/port/devmouse.c /n/emeliedump/2002/1109/sys/src/9/port/devmouse.c 127c if(wq != nil && wq->clone != c && wq->clone != nil && (wq->clone->qid.type&QTDIR)==0) . ## diffname port/devmouse.c 2003/0326 ## diff -e /n/emeliedump/2002/1109/sys/src/9/port/devmouse.c /n/emeliedump/2003/0326/sys/src/9/port/devmouse.c 109a curs = arrow; Cursortocursor(&arrow); .