plan9port/src/libdraw/x11-event.c

137 lines
1.8 KiB
C
Raw Normal View History

2003-09-30 17:47:42 +00:00
#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);
}