Blob
1 #include "x11-inc.h"3 #include <u.h>4 #include <libc.h>5 #include <draw.h>6 #include <cursor.h>7 #include <event.h>9 #include <memdraw.h>10 #include "x11-memdraw.h"12 ulong13 event(Event *e)14 {15 return eread(~0UL, e);16 }18 ulong19 eread(ulong keys, Event *e)20 {21 ulong xmask;22 XEvent xevent;24 xmask = ExposureMask;26 if(keys&Emouse)27 xmask |= MouseMask|StructureNotifyMask;28 if(keys&Ekeyboard)29 xmask |= KeyPressMask;31 XSelectInput(_x.display, _x.drawable, xmask);32 again:33 XWindowEvent(_x.display, _x.drawable, xmask, &xevent);35 switch(xevent.type){36 case Expose:37 xexpose(&xevent, _x.display);38 goto again;39 case ConfigureNotify:40 if(xconfigure(&xevent, _x.display))41 eresized(1);42 goto again;43 case ButtonPress:44 case ButtonRelease:45 case MotionNotify:46 if(xtoplan9mouse(&xevent, &e->mouse) < 0)47 goto again;48 return Emouse;49 case KeyPress:50 e->kbdc = xtoplan9kbd(&xevent);51 if(e->kbdc == -1)52 goto again;53 return Ekeyboard;54 default:55 return 0;56 }57 }59 void60 einit(ulong keys)61 {62 keys &= ~(Emouse|Ekeyboard);63 if(keys){64 fprint(2, "unknown keys in einit\n");65 abort();66 }67 }69 int70 ekbd(void)71 {72 Event e;74 eread(Ekeyboard, &e);75 return e.kbdc;76 }78 Mouse79 emouse(void)80 {81 Event e;83 eread(Emouse, &e);84 return e.mouse;85 }87 int88 ecanread(ulong keys)89 {90 int can;92 can = 0;93 if(keys&Emouse)94 can |= ecanmouse();95 if(keys&Ekeyboard)96 can |= ecankbd();97 return can;98 }100 int101 ecanmouse(void)102 {103 XEvent xe;104 Mouse m;106 again:107 if(XCheckWindowEvent(_x.display, _x.drawable, MouseMask, &xe)){108 if(xtoplan9mouse(&xe, &m) < 0)109 goto again;110 XPutBackEvent(_x.display, &xe);111 return 1;112 }113 return 0;114 }116 int117 ecankbd(void)118 {119 XEvent xe;121 again:122 if(XCheckWindowEvent(_x.display, _x.drawable, KeyPressMask, &xe)){123 if(xtoplan9kbd(&xe) == -1)124 goto again;125 XPutBackEvent(_x.display, &xe);126 return 1;127 }128 return 0;129 }131 void132 emoveto(Point p)133 {134 xmoveto(p);135 }