tdevdraw: correct mouse event buffering on OS X - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1f74e1b758cabeb095c4325e890fad774196b10b
 (DIR) parent c752966bcb35f6149f8913ba3ea360d20cd19af3
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Thu, 10 Jul 2008 00:07:57 -0400
       
       devdraw: correct mouse event buffering on OS X
       
       Diffstat:
         M src/cmd/devdraw/osx-srv.c           |      37 ++++++++++++++++++-------------
       
       1 file changed, 22 insertions(+), 15 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/devdraw/osx-srv.c b/src/cmd/devdraw/osx-srv.c
       t@@ -45,6 +45,7 @@ struct Kbdbuf
        struct Mousebuf
        {
                Mouse m[32];
       +        Mouse last;
                int ri;
                int wi;
                int stall;
       t@@ -201,7 +202,6 @@ runmsg(Wsysmsg *m)
                                mousetags.wi = 0;
                        if(mousetags.wi == mousetags.ri)
                                sysfatal("too many queued mouse reads");
       -                /* fprint(2, "mouse unstall\n"); */
                        mouse.stall = 0;
                        matchmouse();
                        zunlock();
       t@@ -379,21 +379,28 @@ mousetrack(int x, int y, int b, int ms)
                        y = mouserect.max.y;
        
                zlock();
       -        m = &mouse.m[mouse.wi];
       -        m->xy.x = x;
       -        m->xy.y = y;
       -        m->buttons = b;
       -        m->msec = ms;
       -        mouse.wi++;
       -        if(mouse.wi == nelem(mouse.m))
       -                mouse.wi = 0;
       -        if(mouse.wi == mouse.ri){
       -                mouse.stall = 1;
       -                mouse.ri = 0;
       -                mouse.wi = 1;
       -                mouse.m[0] = *m;
       +        // If reader has stopped reading, don't bother.
       +        // If reader is completely caught up, definitely queue.
       +        // Otherwise, queue only button change events.
       +        if(!mouse.stall)
       +        if(mouse.wi == mouse.ri || mouse.last.buttons != b){
       +                m = &mouse.last;
       +                m->xy.x = x;
       +                m->xy.y = y;
       +                m->buttons = b;
       +                m->msec = ms;
       +
       +                mouse.m[mouse.wi] = *m;
       +                if(++mouse.wi == nelem(mouse.m))
       +                        mouse.wi = 0;
       +                if(mouse.wi == mouse.ri){
       +                        mouse.stall = 1;
       +                        mouse.ri = 0;
       +                        mouse.wi = 1;
       +                        mouse.m[0] = *m;
       +                }
       +                matchmouse();
                }
       -        matchmouse();
                zunlock();
        }