M gnot/screen.h => gnot/screen.h +2 -1
@@ 9,7 9,8 @@ struct Mouseinfo{
int dy;
int track; /* update cursor on screen */
Mouse;
- int changed; /* mouse structure changed since last read */
+ ulong counter; /* increments every update */
+ ulong lastcounter; /* value when /dev/mouse read */
Rendez r;
int newbuttons; /* interrupt time access only */
int clock; /* check mouse.track on RTE */
M pc/screen.h => pc/screen.h +2 -1
@@ 9,7 9,8 @@ struct Mouseinfo{
int dy;
int track; /* update cursor on screen */
Mouse;
- int changed; /* mouse structure changed since last read */
+ ulong counter; /* increments every update */
+ ulong lastcounter; /* value when /dev/mouse read */
Rendez r;
int newbuttons; /* interrupt time access only */
int clock; /* check mouse.track on RTE */
M pc/trap.c => pc/trap.c +1 -1
@@ 242,9 242,9 @@ trap(Ureg *ur)
*/
c = v&~0x7;
if(c==Int0vec || c==Int1vec){
+ outb(Int0ctl, EOI);
if(c == Int1vec)
outb(Int1ctl, EOI);
- outb(Int0ctl, EOI);
}
if(v>=256 || (h = halloc.ivec[v]) == 0){
M port/devbit.c => port/devbit.c +4 -9
@@ 524,21 524,16 @@ bitread(Chan *c, void *va, long n, ulong offset)
*/
if(n < 14)
error(Ebadblt);
- Again:
- while(mouse.changed == 0)
+ while(mousechanged(0) == 0)
sleep(&mouse.r, mousechanged, 0);
lock(&cursor);
- if(mouse.changed == 0){
- unlock(&cursor);
- goto Again;
- }
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.changed = 0;
+ mouse.lastcounter = mouse.counter;
unlock(&cursor);
return 14;
}
@@ 2081,7 2076,7 @@ mouseupdate(int dolock)
mouse.clock = 0;
mouse.track = 0;
mouse.buttons = mouse.newbuttons;
- mouse.changed = 1;
+ mouse.counter++;
if(dolock){
unlock(&cursor);
@@ 2167,7 2162,7 @@ int
mousechanged(void *m)
{
USED(m);
- return mouse.changed;
+ return mouse.lastcounter != mouse.counter;
}
/*
M power/trap.c => power/trap.c +2 -1
@@ 423,7 423,8 @@ notify(Ureg *ur)
sp -= 3*BY2WD;
*(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */
u->svr1 = ur->r1; /* save away r1 */
- ur->r1 = (ulong)u->ureg; /* arg 1 is ureg* */
+ ur->r1 = (ulong)u->ureg; /* arg 1 (R1) is ureg* */
+ *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */
*(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */
ur->usp = sp;
ur->pc = (ulong)u->notify;
M ss/screen.h => ss/screen.h +2 -1
@@ 9,7 9,8 @@ struct Mouseinfo{
int dy;
int track; /* update cursor on screen */
Mouse;
- int changed; /* mouse structure changed since last read */
+ ulong counter; /* increments every update */
+ ulong lastcounter; /* value when /dev/mouse read */
Rendez r;
int newbuttons; /* interrupt time access only */
int clock; /* check mouse.track on RTE */
M ss/trap.c => ss/trap.c +1 -0
@@ 454,6 454,7 @@ notify(Ureg *ur)
*(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 is ureg* (compat) */
u->svr7 = ur->r7; /* save away r7 */
ur->r7 = (ulong)u->ureg; /* arg 1 is ureg* */
+ *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */
*(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */
ur->usp = sp;
ur->pc = (ulong)u->notify;