tAvoid yet another X11 stack overflow. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit dd4afdf4eb411c2899f792cb11380877af065b1d
parent 46cfcf550f190fdef3496ae81d52c621862d01b1
Author: rsc 
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(-)
---
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
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);
 }
 
 /*