diff options
author | rsc <devnull@localhost> | 2004-02-29 22:10:26 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-02-29 22:10:26 +0000 |
commit | 5a8e63b2f016735364d17866d5e2bcb35d20c78b (patch) | |
tree | d5d0ce11e087efaf81c77311bac9d30aed41783d /src/libdraw | |
parent | d51419bf4397cf13d0c50bf84c125477c6bed307 (diff) | |
download | plan9port-5a8e63b2f016735364d17866d5e2bcb35d20c78b.tar.gz plan9port-5a8e63b2f016735364d17866d5e2bcb35d20c78b.tar.bz2 plan9port-5a8e63b2f016735364d17866d5e2bcb35d20c78b.zip |
Fighting the good fight.
Move libfmt, libutf into subdirectories of lib9.
Add poll-based socket i/o to libthread, so that we can
avoid using multiple procs when possible, thus removing
dependence on crappy pthreads implementations.
Convert samterm, acme to the single-proc libthread.
Bring libcomplete, acme up-to-date w.r.t. Plan 9 distribution.
Diffstat (limited to 'src/libdraw')
-rw-r--r-- | src/libdraw/x11-itrans.c | 2 | ||||
-rw-r--r-- | src/libdraw/x11-keyboard.c | 8 | ||||
-rw-r--r-- | src/libdraw/x11-mouse.c | 8 |
3 files changed, 13 insertions, 5 deletions
diff --git a/src/libdraw/x11-itrans.c b/src/libdraw/x11-itrans.c index 8e72b011..1b603902 100644 --- a/src/libdraw/x11-itrans.c +++ b/src/libdraw/x11-itrans.c @@ -454,7 +454,7 @@ _xselect(XEvent *e, XDisplay *xd) memset(&r, 0, sizeof r); xe = (XSelectionRequestEvent*)e; -if(0) fprint(2, "xselect target=%d requestor=%d property=%d selection=%d\n", +if(1) fprint(2, "xselect target=%d requestor=%d property=%d selection=%d\n", xe->target, xe->requestor, xe->property, xe->selection); r.xselection.property = xe->property; if(xe->target == _x.targets){ diff --git a/src/libdraw/x11-keyboard.c b/src/libdraw/x11-keyboard.c index 676027e3..83bbbfe8 100644 --- a/src/libdraw/x11-keyboard.c +++ b/src/libdraw/x11-keyboard.c @@ -34,6 +34,7 @@ void _ioproc(void *arg) { int i; + int fd; Keyboardctl *kc; Rune r; XEvent xevent; @@ -41,9 +42,11 @@ _ioproc(void *arg) kc = arg; threadsetname("kbdproc"); kc->pid = getpid(); + fd = XConnectionNumber(_x.kbdcon); XSelectInput(_x.kbdcon, _x.drawable, KeyPressMask); for(;;){ - XWindowEvent(_x.kbdcon, _x.drawable, KeyPressMask, &xevent); + while(XCheckWindowEvent(_x.kbdcon, _x.drawable, KeyPressMask, &xevent) == False) + threadfdwait(fd, 'r'); switch(xevent.type){ case KeyPress: i = _xtoplan9kbd(&xevent); @@ -65,11 +68,12 @@ initkeyboard(char *file) { Keyboardctl *kc; + threadfdwaitsetup(); kc = mallocz(sizeof(Keyboardctl), 1); if(kc == nil) return nil; kc->c = chancreate(sizeof(Rune), 20); - proccreate(_ioproc, kc, 4096); + threadcreate(_ioproc, kc, 4096); return kc; } diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c index 9e5143c6..6da045bb 100644 --- a/src/libdraw/x11-mouse.c +++ b/src/libdraw/x11-mouse.c @@ -47,7 +47,7 @@ static void _ioproc(void *arg) { - int one; + int fd, one; ulong mask; Mouse m; Mousectl *mc; @@ -60,7 +60,10 @@ _ioproc(void *arg) mc->pid = getpid(); mask = MouseMask|ExposureMask|StructureNotifyMask; XSelectInput(_x.mousecon, _x.drawable, mask); + fd = XConnectionNumber(_x.mousecon); for(;;){ + while(XPending(_x.mousecon) == False) + threadfdwait(fd, 'r'); XNextEvent(_x.mousecon, &xevent); switch(xevent.type){ case Expose: @@ -105,12 +108,13 @@ initmouse(char *file, Image *i) { Mousectl *mc; + threadfdwaitsetup(); mc = mallocz(sizeof(Mousectl), 1); if(i) mc->display = i->display; mc->c = chancreate(sizeof(Mouse), 0); mc->resizec = chancreate(sizeof(int), 2); - proccreate(_ioproc, mc, 16384); + threadcreate(_ioproc, mc, 16384); return mc; } |