diff options
author | rsc <devnull@localhost> | 2005-02-08 17:56:35 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-02-08 17:56:35 +0000 |
commit | dd4afdf4eb411c2899f792cb11380877af065b1d (patch) | |
tree | f45b07dbbc37c874f6677b55209ccbf83714a443 | |
parent | 46cfcf550f190fdef3496ae81d52c621862d01b1 (diff) | |
download | plan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.tar.gz plan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.tar.bz2 plan9port-dd4afdf4eb411c2899f792cb11380877af065b1d.zip |
Avoid yet another X11 stack overflow.
-rw-r--r-- | include/mouse.h | 5 | ||||
-rw-r--r-- | src/libdraw/x11-mouse.c | 32 |
2 files changed, 36 insertions, 1 deletions
diff --git a/include/mouse.h b/include/mouse.h index 9b563faf..ce69c8ea 100644 --- a/include/mouse.h +++ b/include/mouse.h @@ -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 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); } /* |