aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-02-08 17:56:35 +0000
committerrsc <devnull@localhost>2005-02-08 17:56:35 +0000
commitdd4afdf4eb411c2899f792cb11380877af065b1d (patch)
treef45b07dbbc37c874f6677b55209ccbf83714a443 /src/libdraw
parent46cfcf550f190fdef3496ae81d52c621862d01b1 (diff)
downloadplan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.tar.gz
plan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.tar.bz2
plan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.zip
Avoid yet another X11 stack overflow.
Diffstat (limited to 'src/libdraw')
-rw-r--r--src/libdraw/x11-mouse.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c
index 1e775758..44406395 100644
--- a/src/libdraw/x11-mouse.c
+++ b/src/libdraw/x11-mouse.c
@@ -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)
@@ -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);
}
/*