662 lines
21 KiB
C
662 lines
21 KiB
C
#include "xlib.h"
|
|
#include "scheme48.h"
|
|
|
|
#define ECAST(name, type) type* name = (type*)e
|
|
#define sidx 5
|
|
#define SET(i, v) S48_VECTOR_SET(r, i, v)
|
|
#define SETSIZE(i) r = s48_make_vector(sidx+i, S48_FALSE)
|
|
|
|
s48_value scx_enter_event(XEvent* e) {
|
|
s48_value r = S48_FALSE;
|
|
s48_value temp = S48_FALSE;
|
|
int i;
|
|
S48_DECLARE_GC_PROTECT(2);
|
|
S48_GC_PROTECT_2(r, temp);
|
|
|
|
switch (e->type) {
|
|
|
|
case KeyPress : case KeyRelease :
|
|
case ButtonPress : case ButtonRelease :
|
|
case MotionNotify : {
|
|
ECAST(q, XKeyEvent);
|
|
SETSIZE(10);
|
|
// all equal in the beginning
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->root));
|
|
SET(sidx+1, SCX_ENTER_WINDOW(q->subwindow));
|
|
SET(sidx+2, SCX_ENTER_TIME(q->time));
|
|
SET(sidx+3, s48_enter_fixnum(q->x));
|
|
SET(sidx+4, s48_enter_fixnum(q->y));
|
|
SET(sidx+5, s48_enter_fixnum(q->x_root));
|
|
SET(sidx+6, s48_enter_fixnum(q->y_root));
|
|
SET(sidx+7, s48_enter_fixnum(q->state));
|
|
// now they are different
|
|
switch (e->type) {
|
|
case KeyPress : case KeyRelease : {
|
|
SET(sidx+8, s48_enter_fixnum(q->keycode));
|
|
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
|
|
} break;
|
|
case ButtonPress : case ButtonRelease : {
|
|
ECAST(q, XButtonEvent);
|
|
SET(sidx+8, s48_enter_integer(q->button));
|
|
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
|
|
} break;
|
|
case MotionNotify : {
|
|
ECAST(q, XMotionEvent);
|
|
SET(sidx+8, s48_enter_fixnum(q->is_hint));
|
|
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
|
|
} break;
|
|
}
|
|
} break;
|
|
|
|
case EnterNotify : case LeaveNotify : {
|
|
ECAST(q, XCrossingEvent);
|
|
SETSIZE(12);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->root));
|
|
SET(sidx+1, SCX_ENTER_WINDOW(q->subwindow));
|
|
SET(sidx+2, SCX_ENTER_TIME(q->time));
|
|
SET(sidx+3, s48_enter_fixnum(q->x));
|
|
SET(sidx+4, s48_enter_fixnum(q->y));
|
|
SET(sidx+5, s48_enter_fixnum(q->x_root));
|
|
SET(sidx+6, s48_enter_fixnum(q->y_root));
|
|
SET(sidx+7, s48_enter_integer(q->mode));
|
|
SET(sidx+8, s48_enter_integer(q->detail));
|
|
SET(sidx+9, S48_ENTER_BOOLEAN(q->same_screen));
|
|
SET(sidx+10, S48_ENTER_BOOLEAN(q->focus));
|
|
// Elk does this; but why not State_Syms??
|
|
SET(sidx+11, s48_enter_integer(q->state));
|
|
} break;
|
|
|
|
case FocusIn : case FocusOut : {
|
|
ECAST(q, XFocusChangeEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, s48_enter_integer(q->mode));
|
|
SET(sidx+1, s48_enter_integer(q->detail));
|
|
} break;
|
|
|
|
case KeymapNotify : {
|
|
ECAST(q, XKeymapEvent);
|
|
SETSIZE(1);
|
|
temp = s48_make_vector(32*8, s48_enter_integer(0));
|
|
for (i=0; i < 32; i++) {
|
|
int j;
|
|
char b = q->key_vector[i];
|
|
for (j = 0; j < 8; j++)
|
|
S48_VECTOR_SET(temp, i*8 + j, (b & (1 << j)) ? 1 : 0);
|
|
}
|
|
SET(sidx+0, temp);
|
|
} break;
|
|
|
|
case Expose : {
|
|
ECAST(q, XExposeEvent);
|
|
SETSIZE(5);
|
|
SET(sidx+0, s48_enter_fixnum(q->x));
|
|
SET(sidx+1, s48_enter_fixnum(q->y));
|
|
SET(sidx+2, s48_enter_fixnum(q->width));
|
|
SET(sidx+3, s48_enter_fixnum(q->height));
|
|
SET(sidx+4, s48_enter_fixnum(q->count));
|
|
} break;
|
|
|
|
case GraphicsExpose : {
|
|
ECAST(q, XGraphicsExposeEvent);
|
|
SETSIZE(7);
|
|
// the ->window member is only a drawable here! ??
|
|
SET(sidx+0, s48_enter_fixnum(q->x));
|
|
SET(sidx+1, s48_enter_fixnum(q->y));
|
|
SET(sidx+2, s48_enter_fixnum(q->width));
|
|
SET(sidx+3, s48_enter_fixnum(q->height));
|
|
SET(sidx+4, s48_enter_fixnum(q->count));
|
|
SET(sidx+5, s48_enter_integer(q->major_code));
|
|
SET(sidx+6, s48_enter_integer(q->minor_code));
|
|
} break;
|
|
|
|
case NoExpose : {
|
|
ECAST(q, XNoExposeEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, s48_enter_integer(q->major_code));
|
|
SET(sidx+1, s48_enter_integer(q->minor_code));
|
|
} break;
|
|
|
|
case VisibilityNotify : {
|
|
ECAST(q, XVisibilityEvent);
|
|
SETSIZE(1);
|
|
SET(sidx+0, s48_enter_integer(q->state));
|
|
} break;
|
|
|
|
case CreateNotify : {
|
|
ECAST(q, XCreateWindowEvent);
|
|
SETSIZE(7);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, s48_enter_fixnum(q->x));
|
|
SET(sidx+2, s48_enter_fixnum(q->y));
|
|
SET(sidx+3, s48_enter_fixnum(q->width));
|
|
SET(sidx+4, s48_enter_fixnum(q->height));
|
|
SET(sidx+5, s48_enter_fixnum(q->border_width));
|
|
SET(sidx+6, S48_ENTER_BOOLEAN(q->override_redirect));
|
|
} break;
|
|
|
|
case DestroyNotify : {
|
|
ECAST(q, XDestroyWindowEvent);
|
|
SETSIZE(1);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
} break;
|
|
|
|
case UnmapNotify : {
|
|
ECAST(q, XUnmapEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, S48_ENTER_BOOLEAN(q->from_configure));
|
|
} break;
|
|
|
|
case MapNotify : {
|
|
ECAST(q, XMapEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, S48_ENTER_BOOLEAN(q->override_redirect));
|
|
} break;
|
|
|
|
case MapRequest : {
|
|
ECAST(q, XMapRequestEvent);
|
|
SETSIZE(1);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
} break;
|
|
|
|
case ReparentNotify : {
|
|
ECAST(q, XReparentEvent);
|
|
SETSIZE(5);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, SCX_ENTER_WINDOW(q->parent));
|
|
SET(sidx+2, s48_enter_fixnum(q->x));
|
|
SET(sidx+3, s48_enter_fixnum(q->y));
|
|
SET(sidx+4, S48_ENTER_BOOLEAN(q->override_redirect));
|
|
} break;
|
|
|
|
case ConfigureNotify : {
|
|
ECAST(q, XConfigureEvent);
|
|
SETSIZE(8);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, s48_enter_fixnum(q->x));
|
|
SET(sidx+2, s48_enter_fixnum(q->y));
|
|
SET(sidx+3, s48_enter_fixnum(q->width));
|
|
SET(sidx+4, s48_enter_fixnum(q->height));
|
|
SET(sidx+5, s48_enter_fixnum(q->border_width));
|
|
SET(sidx+6, SCX_ENTER_WINDOW(q->above));
|
|
SET(sidx+7, S48_ENTER_BOOLEAN(q->override_redirect));
|
|
} break;
|
|
|
|
case ConfigureRequest : {
|
|
ECAST(q, XConfigureRequestEvent);
|
|
SETSIZE(9);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, s48_enter_fixnum(q->x));
|
|
SET(sidx+2, s48_enter_fixnum(q->y));
|
|
SET(sidx+3, s48_enter_fixnum(q->width));
|
|
SET(sidx+4, s48_enter_fixnum(q->height));
|
|
SET(sidx+5, s48_enter_fixnum(q->border_width));
|
|
SET(sidx+6, SCX_ENTER_WINDOW(q->above));
|
|
SET(sidx+7, s48_enter_integer(q->detail));
|
|
SET(sidx+8, s48_enter_integer(q->value_mask));
|
|
} break;
|
|
|
|
case GravityNotify : {
|
|
ECAST(q, XGravityEvent);
|
|
SETSIZE(3);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, s48_enter_fixnum(q->x));
|
|
SET(sidx+2, s48_enter_fixnum(q->y));
|
|
} break;
|
|
|
|
case ResizeRequest : {
|
|
ECAST(q, XResizeRequestEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, s48_enter_fixnum(q->width));
|
|
SET(sidx+1, s48_enter_fixnum(q->height));
|
|
} break;
|
|
|
|
case CirculateRequest : {
|
|
ECAST(q, XCirculateEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->window));
|
|
SET(sidx+1, s48_enter_integer(q->place));
|
|
} break;
|
|
|
|
case PropertyNotify : {
|
|
ECAST(q, XPropertyEvent);
|
|
SETSIZE(3);
|
|
SET(sidx+0, SCX_ENTER_ATOM(q->atom));
|
|
SET(sidx+1, SCX_ENTER_TIME(q->time));
|
|
SET(sidx+2, s48_enter_integer(q->state));
|
|
} break;
|
|
|
|
case SelectionClear : {
|
|
ECAST(q, XSelectionClearEvent);
|
|
SETSIZE(2);
|
|
SET(sidx+0, SCX_ENTER_ATOM(q->selection));
|
|
SET(sidx+1, SCX_ENTER_TIME(q->time));
|
|
} break;
|
|
|
|
case SelectionRequest : {
|
|
ECAST(q, XSelectionRequestEvent);
|
|
SETSIZE(5);
|
|
SET(sidx+0, SCX_ENTER_WINDOW(q->requestor));
|
|
SET(sidx+1, SCX_ENTER_ATOM(q->selection));
|
|
SET(sidx+2, SCX_ENTER_ATOM(q->target));
|
|
SET(sidx+3, SCX_ENTER_ATOM(q->property));
|
|
SET(sidx+4, SCX_ENTER_TIME(q->time));
|
|
} break;
|
|
|
|
case SelectionNotify : {
|
|
ECAST(q, XSelectionEvent);
|
|
SETSIZE(4);
|
|
SET(sidx+0, SCX_ENTER_ATOM(q->selection));
|
|
SET(sidx+1, SCX_ENTER_ATOM(q->target));
|
|
SET(sidx+2, SCX_ENTER_ATOM(q->property));
|
|
SET(sidx+3, SCX_ENTER_TIME(q->time));
|
|
} break;
|
|
|
|
case ColormapNotify : {
|
|
ECAST(q, XColormapEvent);
|
|
SETSIZE(3);
|
|
SET(sidx+0, SCX_ENTER_COLORMAP(q->colormap));
|
|
SET(sidx+1, S48_ENTER_BOOLEAN(q->new));
|
|
SET(sidx+2, s48_enter_integer(q->state));
|
|
} break;
|
|
|
|
case ClientMessage : {
|
|
ECAST(q, XClientMessageEvent);
|
|
SETSIZE(3);
|
|
SET(sidx+0, SCX_ENTER_ATOM(q->message_type));
|
|
SET(sidx+1, s48_enter_integer(q->format));
|
|
switch (q->format) {
|
|
case 8 : {
|
|
temp = s48_make_string(20, (char)0);
|
|
for (i=0; i < 20; i++)
|
|
S48_STRING_SET(temp, i, q->data.b[i]);
|
|
} break;
|
|
case 16 : {
|
|
temp = s48_make_vector(10, S48_FALSE);
|
|
for (i=0; i < 10; i++)
|
|
S48_VECTOR_SET(temp, i, s48_enter_fixnum(q->data.s[i]));
|
|
} break;
|
|
case 32 : {
|
|
temp = s48_make_vector(5, S48_FALSE);
|
|
for (i=0; i < 5; i++)
|
|
S48_VECTOR_SET(temp, i, s48_enter_integer(q->data.l[i]));
|
|
} break;
|
|
default : temp = s48_enter_integer(q->format); //??
|
|
}
|
|
|
|
SET(sidx+2, temp);
|
|
} break;
|
|
|
|
case MappingNotify : {
|
|
ECAST(q, XMappingEvent);
|
|
SETSIZE(3);
|
|
SET(sidx+0, s48_enter_integer(q->request));
|
|
SET(sidx+1, s48_enter_integer(q->first_keycode));
|
|
SET(sidx+2, s48_enter_fixnum(q->count));
|
|
} break;
|
|
|
|
default: {
|
|
SETSIZE(0);
|
|
} break;
|
|
|
|
} // switch end
|
|
|
|
// XAnyEvent entries
|
|
{
|
|
ECAST(q, XAnyEvent);
|
|
SET(0, s48_enter_integer(q->type));
|
|
SET(1, s48_enter_integer(q->serial));
|
|
SET(2, S48_ENTER_BOOLEAN(q->send_event));
|
|
SET(3, SCX_ENTER_DISPLAY(q->display));
|
|
SET(4, SCX_ENTER_WINDOW(q->window));
|
|
}
|
|
// more??
|
|
|
|
S48_GC_UNPROTECT();
|
|
return r;
|
|
}
|
|
|
|
#define REF(i) S48_VECTOR_REF(v, i)
|
|
|
|
XEvent scx_extract_event(s48_value type, s48_value v) {
|
|
XEvent e;
|
|
|
|
e.xany.type = s48_extract_integer(REF(0));
|
|
e.xany.serial = s48_extract_integer(REF(1));
|
|
e.xany.send_event = S48_EXTRACT_BOOLEAN(REF(2));
|
|
e.xany.display = SCX_EXTRACT_DISPLAY(REF(3));
|
|
|
|
switch (s48_extract_integer(type)) {
|
|
case KeyPress: case KeyRelease: {
|
|
e.xkey.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xkey.root = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xkey.subwindow = SCX_EXTRACT_WINDOW(REF(6));
|
|
e.xkey.time = SCX_EXTRACT_TIME(REF(7));
|
|
e.xkey.x = s48_extract_integer(REF(8));
|
|
e.xkey.y = s48_extract_integer(REF(9));
|
|
e.xkey.x_root = s48_extract_integer(REF(10));
|
|
e.xkey.y_root = s48_extract_integer(REF(11));
|
|
e.xkey.state = s48_extract_integer(REF(12));
|
|
e.xkey.keycode = s48_extract_integer(REF(13));
|
|
e.xkey.same_screen = S48_EXTRACT_BOOLEAN(REF(14));
|
|
} break;
|
|
case ButtonPress: case ButtonRelease: {
|
|
e.xbutton.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xbutton.root = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xbutton.subwindow = SCX_EXTRACT_WINDOW(REF(6));
|
|
e.xbutton.time = SCX_EXTRACT_TIME(REF(7));
|
|
e.xbutton.x = s48_extract_integer(REF(8));
|
|
e.xbutton.y = s48_extract_integer(REF(9));
|
|
e.xbutton.x_root = s48_extract_integer(REF(10));
|
|
e.xbutton.y_root = s48_extract_integer(REF(11));
|
|
e.xbutton.state = s48_extract_integer(REF(12));
|
|
e.xbutton.button = s48_extract_integer(REF(13));
|
|
e.xbutton.same_screen = S48_EXTRACT_BOOLEAN(REF(14));
|
|
} break;
|
|
case MotionNotify: {
|
|
e.xmotion.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xmotion.root = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xmotion.subwindow = SCX_EXTRACT_WINDOW(REF(6));
|
|
e.xmotion.time = SCX_EXTRACT_TIME(REF(7));
|
|
e.xmotion.x = s48_extract_integer(REF(8));
|
|
e.xmotion.y = s48_extract_integer(REF(9));
|
|
e.xmotion.x_root = s48_extract_integer(REF(10));
|
|
e.xmotion.y_root = s48_extract_integer(REF(11));
|
|
e.xmotion.state = s48_extract_integer(REF(12));
|
|
e.xmotion.is_hint = s48_extract_integer(REF(13));
|
|
e.xmotion.same_screen = S48_EXTRACT_BOOLEAN(REF(14));
|
|
} break;
|
|
case EnterNotify: case LeaveNotify: {
|
|
e.xcrossing.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xcrossing.root = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xcrossing.subwindow = SCX_EXTRACT_WINDOW(REF(6));
|
|
e.xcrossing.time = SCX_EXTRACT_TIME(REF(7));
|
|
e.xcrossing.x = s48_extract_integer(REF(8));
|
|
e.xcrossing.y = s48_extract_integer(REF(9));
|
|
e.xcrossing.x_root = s48_extract_integer(REF(10));
|
|
e.xcrossing.y_root = s48_extract_integer(REF(11));
|
|
e.xcrossing.mode = s48_extract_integer(REF(12));
|
|
e.xcrossing.detail = s48_extract_integer(REF(13));
|
|
e.xcrossing.same_screen = S48_EXTRACT_BOOLEAN(REF(14));
|
|
e.xcrossing.focus = S48_EXTRACT_BOOLEAN(REF(15));
|
|
e.xcrossing.state = s48_extract_integer(REF(16));
|
|
} break;
|
|
case Expose: {
|
|
e.xexpose.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xexpose.x = s48_extract_integer(REF(5));
|
|
e.xexpose.y = s48_extract_integer(REF(6));
|
|
e.xexpose.width = s48_extract_integer(REF(7));
|
|
e.xexpose.height = s48_extract_integer(REF(8));
|
|
e.xexpose.count = s48_extract_integer(REF(9));
|
|
} break;
|
|
case GraphicsExpose: {
|
|
e.xgraphicsexpose.drawable = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xgraphicsexpose.x = s48_extract_integer(REF(5));
|
|
e.xgraphicsexpose.y = s48_extract_integer(REF(6));
|
|
e.xgraphicsexpose.width = s48_extract_integer(REF(7));
|
|
e.xgraphicsexpose.height = s48_extract_integer(REF(8));
|
|
e.xgraphicsexpose.count = s48_extract_integer(REF(9));
|
|
e.xgraphicsexpose.major_code = s48_extract_integer(REF(10));
|
|
e.xgraphicsexpose.minor_code = s48_extract_integer(REF(11));
|
|
} break;
|
|
case NoExpose: {
|
|
e.xnoexpose.drawable = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xnoexpose.major_code = s48_extract_integer(REF(5));
|
|
e.xnoexpose.minor_code = s48_extract_integer(REF(6));
|
|
} break;
|
|
case VisibilityNotify: {
|
|
e.xvisibility.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xvisibility.state = s48_extract_integer(REF(5));
|
|
} break;
|
|
case CreateNotify: {
|
|
e.xcreatewindow.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xcreatewindow.x = s48_extract_integer(REF(5));
|
|
e.xcreatewindow.y = s48_extract_integer(REF(6));
|
|
e.xcreatewindow.width = s48_extract_integer(REF(7));
|
|
e.xcreatewindow.height = s48_extract_integer(REF(8));
|
|
e.xcreatewindow.border_width = s48_extract_integer(REF(9));
|
|
e.xcreatewindow.override_redirect = S48_EXTRACT_BOOLEAN(REF(10));
|
|
} break;
|
|
case DestroyNotify: {
|
|
e.xdestroywindow.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xdestroywindow.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
} break;
|
|
case UnmapNotify: {
|
|
e.xunmap.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xunmap.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xunmap.from_configure = S48_EXTRACT_BOOLEAN(REF(6));
|
|
} break;
|
|
case MapNotify: {
|
|
e.xmap.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xmap.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xmap.override_redirect = S48_EXTRACT_BOOLEAN(REF(6));
|
|
} break;
|
|
case MapRequest: {
|
|
e.xmaprequest.parent = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xmaprequest.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
} break;
|
|
case ReparentNotify: {
|
|
e.xreparent.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xreparent.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xreparent.parent = SCX_EXTRACT_WINDOW(REF(6));
|
|
e.xreparent.x = s48_extract_integer(REF(7));
|
|
e.xreparent.y = s48_extract_integer(REF(8));
|
|
e.xreparent.override_redirect = S48_EXTRACT_BOOLEAN(REF(9));
|
|
} break;
|
|
case ConfigureNotify: {
|
|
e.xconfigure.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xconfigure.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xconfigure.x = s48_extract_integer(REF(6));
|
|
e.xconfigure.y = s48_extract_integer(REF(7));
|
|
e.xconfigure.width = s48_extract_integer(REF(8));
|
|
e.xconfigure.height = s48_extract_integer(REF(9));
|
|
e.xconfigure.border_width = s48_extract_integer(REF(10));
|
|
e.xconfigure.above = SCX_EXTRACT_WINDOW(REF(11));
|
|
e.xconfigure.override_redirect = S48_EXTRACT_BOOLEAN(REF(12));
|
|
} break;
|
|
case GravityNotify: {
|
|
e.xgravity.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xgravity.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xgravity.x = s48_extract_integer(REF(6));
|
|
e.xgravity.y = s48_extract_integer(REF(7));
|
|
} break;
|
|
case ResizeRequest: {
|
|
e.xresizerequest.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xresizerequest.width = s48_extract_integer(REF(5));
|
|
e.xresizerequest.height = s48_extract_integer(REF(6));
|
|
} break;
|
|
case ConfigureRequest: {
|
|
e.xconfigurerequest.parent = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xconfigurerequest.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
{
|
|
XWindowChanges WC;
|
|
unsigned long mask = Changes_To_XWindowChanges(REF(6), &WC);
|
|
e.xconfigurerequest.x = WC.x;
|
|
e.xconfigurerequest.y = WC.y;
|
|
e.xconfigurerequest.width = WC.width;
|
|
e.xconfigurerequest.height = WC.height;
|
|
e.xconfigurerequest.border_width = WC.border_width;
|
|
e.xconfigurerequest.above = WC.sibling;
|
|
e.xconfigurerequest.detail = WC.stack_mode;
|
|
e.xconfigurerequest.value_mask = mask;
|
|
}
|
|
} break;
|
|
case CirculateNotify: {
|
|
e.xcirculate.event = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xcirculate.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xcirculate.place = s48_extract_integer(REF(6));
|
|
} break;
|
|
case CirculateRequest: {
|
|
e.xcirculaterequest.parent = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xcirculaterequest.window = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xcirculaterequest.place = s48_extract_integer(REF(6));
|
|
} break;
|
|
case PropertyNotify: {
|
|
e.xproperty.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xproperty.atom = SCX_EXTRACT_ATOM(REF(5));
|
|
e.xproperty.time = SCX_EXTRACT_TIME(REF(6));
|
|
e.xproperty.state = s48_extract_integer(REF(7));
|
|
} break;
|
|
case SelectionClear: {
|
|
e.xselectionclear.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xselectionclear.selection = SCX_EXTRACT_ATOM(REF(5));
|
|
e.xselectionclear.time = SCX_EXTRACT_TIME(REF(6));
|
|
} break;
|
|
case SelectionRequest: {
|
|
e.xselectionrequest.owner = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xselectionrequest.requestor = SCX_EXTRACT_WINDOW(REF(5));
|
|
e.xselectionrequest.selection = SCX_EXTRACT_ATOM(REF(6));
|
|
e.xselectionrequest.target = SCX_EXTRACT_ATOM(REF(7));
|
|
e.xselectionrequest.property = SCX_EXTRACT_ATOM(REF(8));
|
|
e.xselectionrequest.time = SCX_EXTRACT_TIME(REF(9));
|
|
} break;
|
|
case SelectionNotify: {
|
|
e.xselection.requestor = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xselection.selection = SCX_EXTRACT_ATOM(REF(5));
|
|
e.xselection.target = SCX_EXTRACT_ATOM(REF(6));
|
|
e.xselection.property = SCX_EXTRACT_ATOM(REF(7));
|
|
e.xselection.time = SCX_EXTRACT_TIME(REF(8));
|
|
} break;
|
|
case ColormapNotify: {
|
|
e.xcolormap.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xcolormap.colormap = SCX_EXTRACT_COLORMAP(REF(5));
|
|
e.xcolormap.new = S48_EXTRACT_BOOLEAN(REF(6));
|
|
e.xcolormap.state = s48_extract_integer(REF(7));
|
|
} break;
|
|
case ClientMessage: {
|
|
e.xclient.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xclient.message_type = SCX_EXTRACT_ATOM(REF(5));
|
|
e.xclient.format = s48_extract_integer(REF(6));
|
|
{
|
|
s48_value data = REF(7);
|
|
int i;
|
|
for (i = 0; i < S48_VECTOR_LENGTH(data); i++) {
|
|
switch (e.xclient.format) {
|
|
case 8:
|
|
if (i < 20)
|
|
e.xclient.data.b[i] =
|
|
(char)s48_extract_integer(S48_VECTOR_REF(data, i));
|
|
case 16:
|
|
if (i < 10)
|
|
e.xclient.data.s[i] =
|
|
(short)s48_extract_integer(S48_VECTOR_REF(data, i));
|
|
case 32:
|
|
if (i < 5)
|
|
e.xclient.data.l[i] =
|
|
(long)s48_extract_integer(S48_VECTOR_REF(data, i));
|
|
}
|
|
}
|
|
}
|
|
} break;
|
|
case MappingNotify: {
|
|
e.xmapping.window = SCX_EXTRACT_WINDOW(REF(4));
|
|
e.xmapping.request = s48_extract_integer(REF(5));
|
|
e.xmapping.first_keycode = s48_extract_integer(REF(6));
|
|
e.xmapping.count = s48_extract_integer(REF(7));
|
|
} break;
|
|
// Error Event...
|
|
case KeymapNotify: {
|
|
e.xkeymap.window = (Window)0; // not used.
|
|
{
|
|
s48_value bits = REF(4);
|
|
int j, bn;
|
|
char b;
|
|
for (bn = 0; bn < 32; bn++) {
|
|
b = 0;
|
|
for (j = 0; j < 8; j++)
|
|
b = b | ((char)S48_VECTOR_REF(bits, bn*8 + j) << j);
|
|
e.xkeymap.key_vector[bn] = b;
|
|
}
|
|
}
|
|
} break;
|
|
// default ??
|
|
} // switch.
|
|
|
|
return e;
|
|
}
|
|
|
|
s48_value scx_Send_Event(s48_value Xdisplay, s48_value Xwindow,
|
|
s48_value propagate,
|
|
s48_value event_mask, s48_value vector,
|
|
s48_value type) {
|
|
XEvent e = scx_extract_event(type, vector);
|
|
|
|
Status r = XSendEvent(SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
SCX_EXTRACT_WINDOW(Xwindow),
|
|
S48_EXTRACT_BOOLEAN(propagate),
|
|
s48_extract_integer(event_mask),
|
|
&e);
|
|
return r ? S48_TRUE : S48_FALSE;
|
|
}
|
|
|
|
|
|
s48_value scx_Next_Event(s48_value Xdisplay) {
|
|
XEvent e;
|
|
XNextEvent(SCX_EXTRACT_DISPLAY(Xdisplay), &e);
|
|
return scx_enter_event(&e);
|
|
}
|
|
|
|
s48_value scx_Peek_Event(s48_value Xdisplay) {
|
|
XEvent e;
|
|
XPeekEvent(SCX_EXTRACT_DISPLAY(Xdisplay), &e);
|
|
return scx_enter_event(&e);
|
|
}
|
|
|
|
s48_value scx_Events_Queued(s48_value Xdisplay, s48_value mode) {
|
|
int r = XEventsQueued(SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
s48_extract_integer(mode));
|
|
return s48_enter_integer(r);
|
|
}
|
|
|
|
s48_value scx_Events_Pending(s48_value Xdisplay) {
|
|
return s48_enter_integer(XPending(SCX_EXTRACT_DISPLAY(Xdisplay)));
|
|
}
|
|
|
|
s48_value scx_Get_Motion_Events(s48_value Xdisplay, s48_value Xwindow,
|
|
s48_value from, s48_value to) {
|
|
int n,i;
|
|
XTimeCoord *p = XGetMotionEvents(SCX_EXTRACT_DISPLAY(Xdisplay),
|
|
SCX_EXTRACT_WINDOW(Xwindow),
|
|
SCX_EXTRACT_TIME(from),
|
|
SCX_EXTRACT_TIME(to),
|
|
&n);
|
|
s48_value v = s48_make_vector(n, S48_FALSE);
|
|
s48_value l = S48_NULL; s48_value t = S48_FALSE;
|
|
S48_DECLARE_GC_PROTECT(3);
|
|
|
|
S48_GC_PROTECT_3(v, l, t);
|
|
for (i = 0; i < n; i++) {
|
|
t = s48_enter_fixnum(p[i].y); l = s48_cons(t, S48_NULL);
|
|
t = s48_enter_fixnum(p[i].x); l = s48_cons(t, l);
|
|
t = SCX_ENTER_TIME(p[i].time); l = s48_cons(t, l);
|
|
|
|
S48_VECTOR_SET(v, i, l);
|
|
}
|
|
XFree((char*)p);
|
|
S48_GC_UNPROTECT();
|
|
|
|
return v;
|
|
}
|
|
|
|
s48_value scx_add_pending_channel (channel){
|
|
int socket_fd;
|
|
S48_CHECK_CHANNEL(channel);
|
|
socket_fd = S48_UNSAFE_EXTRACT_FIXNUM(S48_UNSAFE_CHANNEL_OS_INDEX(channel));
|
|
|
|
if (! s48_add_pending_fd(socket_fd, 1)) // 1 for: yes, is input
|
|
s48_raise_out_of_memory_error();
|
|
|
|
return S48_UNSPECIFIC;
|
|
}
|
|
void scx_init_event(void) {
|
|
S48_EXPORT_FUNCTION(scx_Send_Event);
|
|
S48_EXPORT_FUNCTION(scx_Next_Event);
|
|
S48_EXPORT_FUNCTION(scx_Peek_Event);
|
|
S48_EXPORT_FUNCTION(scx_Events_Queued);
|
|
S48_EXPORT_FUNCTION(scx_Events_Pending);
|
|
S48_EXPORT_FUNCTION(scx_Get_Motion_Events);
|
|
S48_EXPORT_FUNCTION(scx_add_pending_channel);
|
|
}
|
|
|