| #include "x11-inc.h" |
| |
| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <cursor.h> |
| #include <event.h> |
| |
| #include <memdraw.h> |
| #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); |
| } |
| |