From fe99aed693000fbd49d33afc7ab14241bbb64ba3 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 6 May 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-05-06 --- pc/fns.h | 1 + pc/kbd.c | 19 ++++ pc/psaux.c | 57 +++++++++++ port/devnmouse.c | 247 +++++++++++++++++++++++++++++++++++++++++++++++ port/proc.c | 2 +- 5 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 pc/psaux.c create mode 100644 port/devnmouse.c diff --git a/pc/fns.h b/pc/fns.h index 88b41466e3c7a940cf54d93d999180d82ff768c8..54ea0a43804bf312f9e326be2ad9552d38a417f8 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -35,6 +35,7 @@ char* getconf(char*); void guesscpuhz(int); void halt(void); int i8042auxcmd(int); +int i8042auxcmds(uchar*, int); void i8042auxenable(void (*)(int, int)); void i8042reset(void); void i8250console(void); diff --git a/pc/kbd.c b/pc/kbd.c index a306ea1d22501da507686bc83cd608f4494d95d6..efc5fde59847502d707705f810984fc6a8370235 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -226,6 +226,24 @@ i8042auxcmd(int cmd) return 0; } +int +i8042auxcmds(uchar *cmd, int ncmd) +{ + int i; + + ilock(&i8042lock); + for(i=0; i +#include +#include +#include "screen.h" + +/* + * BUG: we ignore shift here. + * we need a more general solution, + * one that will also work for serial mice. + */ +Queue *psauxq; + +static void +psauxputc(int c, int) +{ + uchar uc; + + uc = c; + qproduce(psauxq, &uc, 1); +} + +static long +psauxread(Chan*, void *a, long n, vlong) +{ + return qread(psauxq, a, n); +} + +static long +psauxwrite(Chan*, void *a, long n, vlong) +{ + return i8042auxcmds(a, n); +} + +void +psauxlink(void) +{ + psauxq = qopen(1024, 0, 0, 0); + if(psauxq == nil) + panic("psauxlink"); + qnoblock(psauxq, 1); + i8042auxenable(psauxputc); + addarchfile("psaux", DMEXCL|0660, psauxread, psauxwrite); +} diff --git a/port/devnmouse.c b/port/devnmouse.c new file mode 100644 index 0000000000000000000000000000000000000000..25b9e21885fed2430d2b0c8e40361322541365a3 --- /dev/null +++ b/port/devnmouse.c @@ -0,0 +1,247 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "../port/error.h" + +#define Image IMAGE +#include +#include +#include +#include "screen.h" + +typedef struct Mouseinfo Mouseinfo; + +struct Mouseinfo +{ + Point xy; + int redraw; /* update cursor on screen */ +}; + +Mouseinfo mouse; +Cursorinfo cursor; +int mouseshifted; +Cursor curs; + +void Cursortocursor(Cursor*); +int mousechanged(void*); +static void mouseclock(void); + +enum{ + Qdir, + Qcursor, + Qmousepoint, + Qmousein, + Qmousectl, +}; + +static Dirtab mousedir[]={ + ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, + "cursor", {Qcursor}, 0, 0660, + "mousepoint", {Qmousepoint}, 0, 0220, +}; + +extern Memimage* gscreen; + +static void +mousereset(void) +{ + if(!conf.monitor) + return; + + curs = arrow; + Cursortocursor(&arrow); + addclock0link(mouseclock); +} + +static void +mouseinit(void) +{ + if(!conf.monitor) + return; + + cursoron(1); +} + +static Chan* +mouseattach(char *spec) +{ + if(!conf.monitor) + error(Egreg); + return devattach('m', spec); +} + +static Walkqid* +mousewalk(Chan *c, Chan *nc, char **name, int nname) +{ + return devwalk(c, nc, name, nname, mousedir, nelem(mousedir), devgen); +} + +static int +mousestat(Chan *c, uchar *db, int n) +{ + return devstat(c, db, n, mousedir, nelem(mousedir), devgen); +} + +static Chan* +mouseopen(Chan *c, int omode) +{ + switch((ulong)c->qid.path){ + case Qdir: + if(omode != OREAD) + error(Eperm); + break; + case Qmousepoint: + if(omode != OWRITE) + error(Eperm); + break; + default: + break; + } + c->mode = openmode(omode); + c->flag |= COPEN; + c->offset = 0; + return c; +} + +static void +mouseclose(Chan*) +{ +} + +static long +mouseread(Chan *c, void *va, long n, vlong off) +{ + uchar *p; + + p = va; + switch((ulong)c->qid.path){ + case Qdir: + return devdirread(c, va, n, mousedir, nelem(mousedir), devgen); + + case Qcursor: + if(off != 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; + + default: + error(Egreg); + } + return 0; +} + +static long +mousewrite(Chan *c, void *va, long n, vlong) +{ + char *p; + Point pt; + char buf[64]; + + p = va; + switch((ulong)c->qid.path){ + case Qdir: + error(Eisdir); + + 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); + } + mouse.redraw = 1; + mouseclock(); + cursoron(1); + return n; + + case Qmousepoint: + 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) + error(Eshort); + pt.y = strtoul(p, 0, 0); + /* + * this used to be qlocked here but not locked below. + */ + if(gscreen && ptinrect(pt, gscreen->r)){ + mouse.xy = pt; + mouse.redraw = 1; + mouseclock(); + } + return n; + } + + error(Egreg); + return -1; +} + +Dev nmousedevtab = { + 'm', + "mouse", + + mousereset, + mouseinit, + devshutdown, + mouseattach, + mousewalk, + mousestat, + mouseopen, + devcreate, + mouseclose, + mouseread, + devbread, + mousewrite, + devbwrite, + devremove, + devwstat, +}; + +void +Cursortocursor(Cursor *c) +{ + lock(&cursor); + memmove(&cursor.Cursor, c, sizeof(Cursor)); + setcursor(c); + unlock(&cursor); +} + +/* + * called by the clock routine to redraw the cursor + */ +static void +mouseclock(void) +{ + if(mouse.redraw && canlock(&cursor)){ + mouse.redraw = 0; + cursoroff(0); + mouse.redraw = cursoron(0); + unlock(&cursor); + } + drawactive(0); +} + +Point +mousexy(void) +{ + return mouse.xy; +} diff --git a/port/proc.c b/port/proc.c index a6df37b234c9f84cecf0a1e240a1ecc1ffd32ab0..519f6a8b1f206ad65e9f88a45e9e209ccd8ad7c1 100644 --- a/port/proc.c +++ b/port/proc.c @@ -1193,7 +1193,7 @@ killbig(void) if(s != 0) l += s->top - s->base; } - if(l > max) { + if(l > max && strcmp(p->text, "kfs") != 0){ kp = p; max = l; }