URI: 
       tAvoid yet another X11 stack overflow. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit dd4afdf4eb411c2899f792cb11380877af065b1d
   DIR parent 46cfcf550f190fdef3496ae81d52c621862d01b1
  HTML Author: rsc <devnull@localhost>
       Date:   Tue,  8 Feb 2005 17:56:35 +0000
       
       Avoid yet another X11 stack overflow.
       
       Diffstat:
         M include/mouse.h                     |       5 +++++
         M src/libdraw/x11-mouse.c             |      32 ++++++++++++++++++++++++++++++-
       
       2 files changed, 36 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/include/mouse.h b/include/mouse.h
       t@@ -26,6 +26,11 @@ struct Mousectl
                int                pid;                /* of slave proc */
                Display                *display;
                /*Image*        image;        / * of associated window/display */
       +        
       +        /* clumsy hack for X11 */
       +        struct Channel *ccursor;
       +        struct Channel *ccursorwait;
       +        QLock cursorlock;
        };
        
        struct Menu
   DIR diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c
       t@@ -46,6 +46,28 @@ readmouse(Mousectl *mc)
                return 0;
        }
        
       +/*
       + * This is necessary because some X libraries (e.g., on FC3)
       + * use an inordinate amount of stack space to do _xsetcursor.
       + * Perhaps instead there should be a generic "run this X routine"
       + * stack that you send a function and argument to.
       + */
       +static
       +void
       +_cursorproc(void *arg)
       +{
       +        Mousectl *mc;
       +        Cursor *c;
       +        
       +        mc = arg;
       +        threadsetname("cursorproc (sigh)");
       +        for(;;){
       +                c = recvp(mc->ccursor);
       +                _xsetcursor(c);
       +                sendp(mc->ccursorwait, nil);
       +        }
       +}
       +
        static
        void
        _ioproc(void *arg)
       t@@ -141,14 +163,22 @@ initmouse(char *file, Image *i)
                chansetname(mc->c, "mousec");
                mc->resizec = chancreate(sizeof(int), 2);
                chansetname(mc->resizec, "resizec");
       +        mc->ccursor = chancreate(sizeof(void*), 0);
       +        chansetname(mc->ccursor, "ccursor");
       +        mc->ccursorwait = chancreate(sizeof(void*), 0);
       +        chansetname(mc->ccursor, "ccursorwait");
                proccreate(_ioproc, mc, 256*1024);
       +        proccreate(_cursorproc, mc, 256*1024);        /* sigh */
                return mc;
        }
        
        void
        setcursor(Mousectl *mc, Cursor *c)
        {
       -        _xsetcursor(c);
       +        qlock(&mc->cursorlock);
       +        sendp(mc->ccursor, c);
       +        recvp(mc->ccursorwait);
       +        qunlock(&mc->cursorlock);
        }
        
        /*