From 76193d7cb0457807b2f0b95f909ab5de19480cd7 Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 30 Sep 2003 17:47:42 +0000 Subject: Initial revision --- src/libdraw/x11-event.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/libdraw/x11-event.c (limited to 'src/libdraw/x11-event.c') diff --git a/src/libdraw/x11-event.c b/src/libdraw/x11-event.c new file mode 100644 index 00000000..9a23547a --- /dev/null +++ b/src/libdraw/x11-event.c @@ -0,0 +1,136 @@ +#include "x11-inc.h" + +#include +#include +#include +#include +#include + +#include +#include "x11-memdraw.h" + +ulong +event(Event *e) +{ + return eread(~0UL, e); +} + +ulong +eread(ulong keys, Event *e) +{ + ulong xmask; + XEvent xevent; + + xmask = ExposureMask; + + if(keys&Emouse) + xmask |= MouseMask|StructureNotifyMask; + if(keys&Ekeyboard) + xmask |= KeyPressMask; + + XSelectInput(_x.display, _x.drawable, xmask); +again: + XWindowEvent(_x.display, _x.drawable, xmask, &xevent); + + switch(xevent.type){ + case Expose: + xexpose(&xevent, _x.display); + goto again; + case ConfigureNotify: + if(xconfigure(&xevent, _x.display)) + eresized(1); + goto again; + case ButtonPress: + case ButtonRelease: + case MotionNotify: + if(xtoplan9mouse(&xevent, &e->mouse) < 0) + goto again; + return Emouse; + case KeyPress: + e->kbdc = xtoplan9kbd(&xevent); + if(e->kbdc == -1) + goto again; + return Ekeyboard; + default: + return 0; + } +} + +void +einit(ulong keys) +{ + keys &= ~(Emouse|Ekeyboard); + if(keys){ + fprint(2, "unknown keys in einit\n"); + abort(); + } +} + +int +ekbd(void) +{ + Event e; + + eread(Ekeyboard, &e); + return e.kbdc; +} + +Mouse +emouse(void) +{ + Event e; + + eread(Emouse, &e); + return e.mouse; +} + +int +ecanread(ulong keys) +{ + int can; + + can = 0; + if(keys&Emouse) + can |= ecanmouse(); + if(keys&Ekeyboard) + can |= ecankbd(); + return can; +} + +int +ecanmouse(void) +{ + XEvent xe; + Mouse m; + +again: + if(XCheckWindowEvent(_x.display, _x.drawable, MouseMask, &xe)){ + if(xtoplan9mouse(&xe, &m) < 0) + goto again; + XPutBackEvent(_x.display, &xe); + return 1; + } + return 0; +} + +int +ecankbd(void) +{ + XEvent xe; + +again: + if(XCheckWindowEvent(_x.display, _x.drawable, KeyPressMask, &xe)){ + if(xtoplan9kbd(&xe) == -1) + goto again; + XPutBackEvent(_x.display, &xe); + return 1; + } + return 0; +} + +void +emoveto(Point p) +{ + xmoveto(p); +} + -- cgit v1.2.3