--- a/XWorkstation.st Thu May 17 16:52:29 2018 +0200
+++ b/XWorkstation.st Thu May 17 19:10:33 2018 +0200
@@ -6096,11 +6096,11 @@
The event fields are placed into anEventArray (must be at least size 13):
the fields are:
- 1: windowID
- 2: eventType-ID
- 3: eventTypeSymbol
-
- 4.. args
+ 1: windowID
+ 2: eventType-ID
+ 3: eventTypeSymbol
+
+ 4.. args
Sorry I had to split dispatch into this fetch method and a separate
handler method to allow UNLIMITEDSTACK here.
@@ -6112,7 +6112,8 @@
Display *dpy;
Window win, wWanted;
- int evMask, returnValue;
+ long evMask;
+ int returnValue;
XEvent ev;
OBJ eB;
KeySym keySym;
@@ -6122,7 +6123,7 @@
OBJ arg, sym, t, windowID;
if (! ISCONNECTED) {
- RETURN (false);
+ RETURN (false);
}
dpy = myDpy;
@@ -6130,39 +6131,39 @@
ev.type = 0;
if (__isSmallInteger(eventMask)) {
- evMask = __intVal(eventMask);
+ evMask = __intVal(eventMask);
} else {
- evMask = ~0;
+ evMask = ~0;
}
if (__isExternalAddress(aViewIdOrNil)) {
- wWanted = __WindowVal(aViewIdOrNil);
- returnValue = XCheckWindowEvent(dpy, wWanted, evMask, &ev);
+ wWanted = __WindowVal(aViewIdOrNil);
+ returnValue = XCheckWindowEvent(dpy, wWanted, evMask, &ev);
} else {
- if (evMask == ~0) {
- XNextEvent(dpy, &ev);
- returnValue = 1;
- } else {
- returnValue = XCheckMaskEvent(dpy, evMask, &ev);
- }
+ if (evMask == ~0) {
+ XNextEvent(dpy, &ev);
+ returnValue = 1;
+ } else {
+ returnValue = XCheckMaskEvent(dpy, evMask, &ev);
+ }
}
if (!returnValue) {
- /* there is no event */
- RETURN (false);
+ /* there is no event */
+ RETURN (false);
}
if (anEventArray == nil) {
- /* sender is not interested in the event */
- RETURN(true);
+ /* sender is not interested in the event */
+ RETURN(true);
}
if (!__isArray(anEventArray)) {
- console_fprintf(stderr, "XWorkstation: bad argument [%d]\n", __LINE__);
- RETURN (false);
+ console_fprintf(stderr, "XWorkstation: bad argument [%d]\n", __LINE__);
+ RETURN (false);
}
if (__arraySize(anEventArray) < 11) {
- console_fprintf(stderr, "XWorkstation: bad argument [%d]\n", __LINE__);
- RETURN (false);
+ console_fprintf(stderr, "XWorkstation: bad argument [%d]\n", __LINE__);
+ RETURN (false);
}
# define ANYBUTTON (Button1MotionMask | Button2MotionMask | Button3MotionMask)
@@ -6189,374 +6190,374 @@
# define cme ((XColormapEvent *)&ev)
if (((t = __INST(lastId)) != nil)
- && __isExternalAddress(t)
- && (__WindowVal(t) == ae->window)) {
- windowID = t;
+ && __isExternalAddress(t)
+ && (__WindowVal(t) == ae->window)) {
+ windowID = t;
} else {
- windowID = __MKEXTERNALADDRESS(ae->window);
+ windowID = __MKEXTERNALADDRESS(ae->window);
}
__ArrayInstPtr(anEventArray)->a_element[0] = windowID; __STORE(anEventArray, windowID);
__ArrayInstPtr(anEventArray)->a_element[1] = __MKSMALLINT(ev.type);
switch (ev.type) {
- case KeyRelease:
- sym = @symbol(keyRelease:key:code:state:x:y:rootX:rootY:time:);
- goto keyPressAndRelease;
-
- case KeyPress:
- sym = @symbol(keyPress:key:code:state:x:y:rootX:rootY:time:);
- /* FALL INTO */
-
- keyPressAndRelease:
- arg = nil;
- nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
- if (nchars == 1 && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
- || (buffer[0] >= 0x80))) {
- arg = __MKCHARACTER(buffer[0]);
+ case KeyRelease:
+ sym = @symbol(keyRelease:key:code:state:x:y:rootX:rootY:time:);
+ goto keyPressAndRelease;
+
+ case KeyPress:
+ sym = @symbol(keyPress:key:code:state:x:y:rootX:rootY:time:);
+ /* FALL INTO */
+
+ keyPressAndRelease:
+ arg = nil;
+ nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
+ if (nchars == 1 && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
+ || (buffer[0] >= 0x80))) {
+ arg = __MKCHARACTER(buffer[0]);
// } else if (nchars > 2) {
// arg = __MKSTRING_L(buffer, nchars);
- } else {
- keySymString = XKeysymToString(keySym);
- if (keySymString) {
- arg = __MKSYMBOL(keySymString, 0);
- }
- }
+ } else {
+ keySymString = XKeysymToString(keySym);
+ if (keySymString) {
+ arg = __MKSYMBOL(keySymString, 0);
+ }
+ }
#ifdef IGNORE_UNKNOWN_KEYCODES
- if (arg == nil) {
- /* happens sometimes (alt-graph on sun has no keysym) */
- RETURN (false);
- }
-#endif
- __ArrayInstPtr(anEventArray)->a_element[2] = sym;
-
- __ArrayInstPtr(anEventArray)->a_element[3] = arg; __STORE(anEventArray, arg);
- t = __MKUINT(ke->keycode); __ArrayInstPtr(anEventArray)->a_element[4] = t; __STORE(anEventArray, t);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ke->state);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ke->x);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ke->y);
- __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ke->x_root);
- __ArrayInstPtr(anEventArray)->a_element[9] = __mkSmallInteger(ke->y_root);
- t = __MKUINT(ke->time); __ArrayInstPtr(anEventArray)->a_element[10] = t; __STORE(anEventArray, t);
- break;
-
- case ButtonPress:
- sym = @symbol(buttonPress:button:state:x:y:rootX:rootY:time:);
- goto buttonPressAndRelease;
-
- case ButtonRelease:
- sym = @symbol(buttonRelease:button:state:x:y:rootX:rootY:time:);
- /* fall into */
-
- buttonPressAndRelease:
- __ArrayInstPtr(anEventArray)->a_element[2] = sym;
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(be->button);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ke->state);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(be->x);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(be->y);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(be->x_root);
- __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(be->y_root);
- t = __MKUINT(be->time); __ArrayInstPtr(anEventArray)->a_element[9] = t; __STORE(anEventArray, t);
- break;
-
- case MotionNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(buttonMotion:state:x:y:rootX:rootY:time:);
-
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(me->state);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(me->x);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(me->y);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(me->x_root);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(me->y_root);
- t = __MKUINT(me->time); __ArrayInstPtr(anEventArray)->a_element[8] = t; __STORE(anEventArray, t);
- break;
-
- case FocusIn:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(focusIn:mode:detail:);
- goto focusInOut;
-
- case FocusOut:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(focusOut:mode:detail:);
- /* fall into */
-
- focusInOut:
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(fe->mode);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(fe->detail);
- break;
-
- case EnterNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(pointerEnter:x:y:rootX:rootY:state:mode:detail:time:);
- goto enterLeave;
-
- case LeaveNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(pointerLeave:x:y:rootX:rootY:state:mode:detail:time:);
- /* fall into */
-
- enterLeave:
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(ele->x);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ele->y);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ele->x_root);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ele->y_root);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ele->state);
- __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ele->mode);
- __ArrayInstPtr(anEventArray)->a_element[9] = __mkSmallInteger(ele->detail);
- t = __MKUINT(ele->time); __ArrayInstPtr(anEventArray)->a_element[10] = t; __STORE(anEventArray, t);
- break;
-
- case Expose:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(expose:x:y:width:height:count:);
- goto expose;
-
- case GraphicsExpose:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(graphicsExpose:x:y:width:height:count:);
- /* fall into */
-
- expose:
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(ee->x);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ee->y);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ee->width);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ee->height);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ee->count);
- break;
-
- case NoExpose:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(noExposeView:);
- break;
-
- case VisibilityNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(visibilityNotify:state:);
- switch (ve->state) {
- case VisibilityUnobscured:
- __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(unobscured);
- break;
- case VisibilityPartiallyObscured:
- __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(partiallyObscured);
- break;
- case VisibilityFullyObscured:
- __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(fullyObscured);
- break;
- default:
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKSMALLINT(ve->state);
- break;
- }
- break;
-
- case CreateNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(createWindow:x:y:width:height:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(cre->x);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(cre->y);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(cre->width);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(cre->height);
- break;
-
- case DestroyNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(destroyedView:);
- break;
-
- case UnmapNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(unmappedView:);
- break;
-
- case MapNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mappedView:);
- break;
-
- case ConfigureNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(configure:relativeTo:x:y:width:height:borderWidth:above:overrideRedirect:);
- __ArrayInstPtr(anEventArray)->a_element[3] = nil;
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ce->x);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ce->y);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ce->width);
- __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ce->height);
- __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ce->border_width);
- __ArrayInstPtr(anEventArray)->a_element[9] = nil;
- __ArrayInstPtr(anEventArray)->a_element[10] = ce->override_redirect ? true : false;
- if (ce->event != None) {
- t = __MKEXTERNALADDRESS(ce->event); __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
- }
- if (ce->above != None) {
- t = __MKEXTERNALADDRESS(ce->above); __ArrayInstPtr(anEventArray)->a_element[9] = t; __STORE(anEventArray, t);
- }
- break;
-
- case GravityNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(gravityNotify:x:y:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(gre->x);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(gre->y);
- break;
-
- case ResizeRequest:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(resizeRequest:width:height:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(rr->width);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(rr->height);
- break;
-
- case ConfigureRequest:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(configureRequest:x:y:width:height:above:detail:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(cr->x);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(cr->y);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(cr->width);
- __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(cr->height);
- __ArrayInstPtr(anEventArray)->a_element[7] = nil;
- if (cr->above != None) {
- t = __MKEXTERNALADDRESS(cr->above); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
- }
- switch (cr->detail) {
- case Above:
- __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(above);
- break;
- case Below:
- __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(below);
- break;
- case TopIf:
- __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(topIf);
- break;
- case BottomIf:
- __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(bottomIf);
- break;
- case Opposite:
- __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(opposite);
- break;
- default:
- __ArrayInstPtr(anEventArray)->a_element[8] = __MKSMALLINT(cr->detail);
- break;
- }
- break;
-
- case CirculateNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(circulateNotify:place:);
- goto circulate;
-
- case CirculateRequest:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(circulateRequest:place:);
- /* fall into */
- circulate:
- switch (cie->place) {
- case PlaceOnTop:
- __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(placeOnTop);
- break;
- case PlaceOnBottom:
- __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(placeOnBottom);
- break;
- default:
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKSMALLINT(cie->place);
- break;
- }
- break;
-
- case PropertyNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(propertyChange:property:state:time:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(pe->atom);
- switch (pe->state) {
- case PropertyNewValue:
- __ArrayInstPtr(anEventArray)->a_element[4] = @symbol(newValue);
- break;
- case PropertyDelete:
- __ArrayInstPtr(anEventArray)->a_element[4] = @symbol(deleted);
- break;
- default:
- __ArrayInstPtr(anEventArray)->a_element[4] = __MKSMALLINT(pe->state);
- break;
- }
- t = __MKUINT(pe->time); __ArrayInstPtr(anEventArray)->a_element[5] = t; __STORE(anEventArray, t);
- break;
-
- case SelectionClear:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionClear:selection:time:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(sce->selection);
- t = __MKUINT(sce->time); __ArrayInstPtr(anEventArray)->a_element[4] = t; __STORE(anEventArray, t);
- break;
-
- case SelectionRequest:
- /*
- * someone wants the selection
- */
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionRequest:requestor:selection:target:property:time:);
- t = __MKEXTERNALADDRESS(ev.xselectionrequest.requestor); __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
- __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselectionrequest.selection);
- __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselectionrequest.target);
- __ArrayInstPtr(anEventArray)->a_element[6] = __MKATOMOBJ(ev.xselectionrequest.property);
- t = __MKUINT(ev.xselectionrequest.time); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
- break;
-
- case SelectionNotify:
- /*
- * returned selection value (answer from SelectionRequest)
- */
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionNotify:selection:target:property:requestor:time:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xselection.selection);
- __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselection.target);
- __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselection.property);
- t = __MKEXTERNALADDRESS(ev.xselection.requestor); __ArrayInstPtr(anEventArray)->a_element[6] = t; __STORE(anEventArray, t);
- t = __MKUINT(ev.xselection.time); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
- break;
-
- case ColormapNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(colormapNotify:state:);
- __ArrayInstPtr(anEventArray)->a_element[3] = cme->state == ColormapInstalled ? true : false;
- break;
-
- case ClientMessage:
- if (ev.xclient.message_type == (int) __AtomVal(__INST(protocolsAtom))) {
- if ((ev.xclient.data.l[0] == (int) __AtomVal(__INST(quitAppAtom)))
- || (ev.xclient.data.l[0] == (int) __AtomVal(__INST(deleteWindowAtom)))) {
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(terminateView:);
- break;
- }
- if (ev.xclient.data.l[0] == (int) __AtomVal(__INST(saveYourselfAtom))) {
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(saveAndTerminateView:);
- break;
- }
- }
- /*
- * any other client message
- */
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(clientMessage:type:format:data:);
- __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xclient.message_type);
- __ArrayInstPtr(anEventArray)->a_element[4] = __MKSMALLINT(ev.xclient.format);
- t = __MKBYTEARRAY(&ev.xclient.data, sizeof(ev.xclient.data)); __ArrayInstPtr(anEventArray)->a_element[5] = t; __STORE(anEventArray, t);
- break;
-
- case MappingNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mappingNotify:request:event:);
- switch(mape->request) {
- case MappingModifier:
- arg = @symbol(mappingModifier);
- break;
- case MappingKeyboard:
- arg = @symbol(mappingKeyboard);
- break;
- case MappingPointer:
- arg = @symbol(mappingPointer);
- break;
- default:
- arg = __MKSMALLINT(mape->request);
- break;
- }
- __ArrayInstPtr(anEventArray)->a_element[3] = arg;
- t = __MKBYTEARRAY(&ev, sizeof(*mape)); __ArrayInstPtr(anEventArray)->a_element[4] = t;
- __STORE(anEventArray, t);
- break;
-
- case KeymapNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(keymapNotify:);
- break;
-
- case MapRequest:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mapRequest:);
- break;
-
- case ReparentNotify:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(reparentedView:parentId:x:y:);
- t = __MKEXTERNALADDRESS(rpe->parent);
- __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
- __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(rpe->x);
- __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(rpe->y);
- break;
-
- default:
- __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(unknownX11Event);
- break;
+ if (arg == nil) {
+ /* happens sometimes (alt-graph on sun has no keysym) */
+ RETURN (false);
+ }
+#endif
+ __ArrayInstPtr(anEventArray)->a_element[2] = sym;
+
+ __ArrayInstPtr(anEventArray)->a_element[3] = arg; __STORE(anEventArray, arg);
+ t = __MKUINT(ke->keycode); __ArrayInstPtr(anEventArray)->a_element[4] = t; __STORE(anEventArray, t);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ke->state);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ke->x);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ke->y);
+ __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ke->x_root);
+ __ArrayInstPtr(anEventArray)->a_element[9] = __mkSmallInteger(ke->y_root);
+ t = __MKUINT(ke->time); __ArrayInstPtr(anEventArray)->a_element[10] = t; __STORE(anEventArray, t);
+ break;
+
+ case ButtonPress:
+ sym = @symbol(buttonPress:button:state:x:y:rootX:rootY:time:);
+ goto buttonPressAndRelease;
+
+ case ButtonRelease:
+ sym = @symbol(buttonRelease:button:state:x:y:rootX:rootY:time:);
+ /* fall into */
+
+ buttonPressAndRelease:
+ __ArrayInstPtr(anEventArray)->a_element[2] = sym;
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(be->button);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ke->state);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(be->x);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(be->y);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(be->x_root);
+ __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(be->y_root);
+ t = __MKUINT(be->time); __ArrayInstPtr(anEventArray)->a_element[9] = t; __STORE(anEventArray, t);
+ break;
+
+ case MotionNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(buttonMotion:state:x:y:rootX:rootY:time:);
+
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(me->state);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(me->x);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(me->y);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(me->x_root);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(me->y_root);
+ t = __MKUINT(me->time); __ArrayInstPtr(anEventArray)->a_element[8] = t; __STORE(anEventArray, t);
+ break;
+
+ case FocusIn:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(focusIn:mode:detail:);
+ goto focusInOut;
+
+ case FocusOut:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(focusOut:mode:detail:);
+ /* fall into */
+
+ focusInOut:
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(fe->mode);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(fe->detail);
+ break;
+
+ case EnterNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(pointerEnter:x:y:rootX:rootY:state:mode:detail:time:);
+ goto enterLeave;
+
+ case LeaveNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(pointerLeave:x:y:rootX:rootY:state:mode:detail:time:);
+ /* fall into */
+
+ enterLeave:
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(ele->x);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ele->y);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ele->x_root);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ele->y_root);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ele->state);
+ __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ele->mode);
+ __ArrayInstPtr(anEventArray)->a_element[9] = __mkSmallInteger(ele->detail);
+ t = __MKUINT(ele->time); __ArrayInstPtr(anEventArray)->a_element[10] = t; __STORE(anEventArray, t);
+ break;
+
+ case Expose:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(expose:x:y:width:height:count:);
+ goto expose;
+
+ case GraphicsExpose:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(graphicsExpose:x:y:width:height:count:);
+ /* fall into */
+
+ expose:
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(ee->x);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ee->y);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ee->width);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ee->height);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ee->count);
+ break;
+
+ case NoExpose:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(noExposeView:);
+ break;
+
+ case VisibilityNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(visibilityNotify:state:);
+ switch (ve->state) {
+ case VisibilityUnobscured:
+ __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(unobscured);
+ break;
+ case VisibilityPartiallyObscured:
+ __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(partiallyObscured);
+ break;
+ case VisibilityFullyObscured:
+ __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(fullyObscured);
+ break;
+ default:
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKSMALLINT(ve->state);
+ break;
+ }
+ break;
+
+ case CreateNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(createWindow:x:y:width:height:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(cre->x);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(cre->y);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(cre->width);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(cre->height);
+ break;
+
+ case DestroyNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(destroyedView:);
+ break;
+
+ case UnmapNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(unmappedView:);
+ break;
+
+ case MapNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mappedView:);
+ break;
+
+ case ConfigureNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(configure:relativeTo:x:y:width:height:borderWidth:above:overrideRedirect:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = nil;
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(ce->x);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(ce->y);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(ce->width);
+ __ArrayInstPtr(anEventArray)->a_element[7] = __mkSmallInteger(ce->height);
+ __ArrayInstPtr(anEventArray)->a_element[8] = __mkSmallInteger(ce->border_width);
+ __ArrayInstPtr(anEventArray)->a_element[9] = nil;
+ __ArrayInstPtr(anEventArray)->a_element[10] = ce->override_redirect ? true : false;
+ if (ce->event != None) {
+ t = __MKEXTERNALADDRESS(ce->event); __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
+ }
+ if (ce->above != None) {
+ t = __MKEXTERNALADDRESS(ce->above); __ArrayInstPtr(anEventArray)->a_element[9] = t; __STORE(anEventArray, t);
+ }
+ break;
+
+ case GravityNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(gravityNotify:x:y:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(gre->x);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(gre->y);
+ break;
+
+ case ResizeRequest:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(resizeRequest:width:height:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(rr->width);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(rr->height);
+ break;
+
+ case ConfigureRequest:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(configureRequest:x:y:width:height:above:detail:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __mkSmallInteger(cr->x);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(cr->y);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(cr->width);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __mkSmallInteger(cr->height);
+ __ArrayInstPtr(anEventArray)->a_element[7] = nil;
+ if (cr->above != None) {
+ t = __MKEXTERNALADDRESS(cr->above); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
+ }
+ switch (cr->detail) {
+ case Above:
+ __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(above);
+ break;
+ case Below:
+ __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(below);
+ break;
+ case TopIf:
+ __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(topIf);
+ break;
+ case BottomIf:
+ __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(bottomIf);
+ break;
+ case Opposite:
+ __ArrayInstPtr(anEventArray)->a_element[8] = @symbol(opposite);
+ break;
+ default:
+ __ArrayInstPtr(anEventArray)->a_element[8] = __MKSMALLINT(cr->detail);
+ break;
+ }
+ break;
+
+ case CirculateNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(circulateNotify:place:);
+ goto circulate;
+
+ case CirculateRequest:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(circulateRequest:place:);
+ /* fall into */
+ circulate:
+ switch (cie->place) {
+ case PlaceOnTop:
+ __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(placeOnTop);
+ break;
+ case PlaceOnBottom:
+ __ArrayInstPtr(anEventArray)->a_element[3] = @symbol(placeOnBottom);
+ break;
+ default:
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKSMALLINT(cie->place);
+ break;
+ }
+ break;
+
+ case PropertyNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(propertyChange:property:state:time:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(pe->atom);
+ switch (pe->state) {
+ case PropertyNewValue:
+ __ArrayInstPtr(anEventArray)->a_element[4] = @symbol(newValue);
+ break;
+ case PropertyDelete:
+ __ArrayInstPtr(anEventArray)->a_element[4] = @symbol(deleted);
+ break;
+ default:
+ __ArrayInstPtr(anEventArray)->a_element[4] = __MKSMALLINT(pe->state);
+ break;
+ }
+ t = __MKUINT(pe->time); __ArrayInstPtr(anEventArray)->a_element[5] = t; __STORE(anEventArray, t);
+ break;
+
+ case SelectionClear:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionClear:selection:time:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(sce->selection);
+ t = __MKUINT(sce->time); __ArrayInstPtr(anEventArray)->a_element[4] = t; __STORE(anEventArray, t);
+ break;
+
+ case SelectionRequest:
+ /*
+ * someone wants the selection
+ */
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionRequest:requestor:selection:target:property:time:);
+ t = __MKEXTERNALADDRESS(ev.xselectionrequest.requestor); __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselectionrequest.selection);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselectionrequest.target);
+ __ArrayInstPtr(anEventArray)->a_element[6] = __MKATOMOBJ(ev.xselectionrequest.property);
+ t = __MKUINT(ev.xselectionrequest.time); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
+ break;
+
+ case SelectionNotify:
+ /*
+ * returned selection value (answer from SelectionRequest)
+ */
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionNotify:selection:target:property:requestor:time:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xselection.selection);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselection.target);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselection.property);
+ t = __MKEXTERNALADDRESS(ev.xselection.requestor); __ArrayInstPtr(anEventArray)->a_element[6] = t; __STORE(anEventArray, t);
+ t = __MKUINT(ev.xselection.time); __ArrayInstPtr(anEventArray)->a_element[7] = t; __STORE(anEventArray, t);
+ break;
+
+ case ColormapNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(colormapNotify:state:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = cme->state == ColormapInstalled ? true : false;
+ break;
+
+ case ClientMessage:
+ if (ev.xclient.message_type == (int) __AtomVal(__INST(protocolsAtom))) {
+ if ((ev.xclient.data.l[0] == (int) __AtomVal(__INST(quitAppAtom)))
+ || (ev.xclient.data.l[0] == (int) __AtomVal(__INST(deleteWindowAtom)))) {
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(terminateView:);
+ break;
+ }
+ if (ev.xclient.data.l[0] == (int) __AtomVal(__INST(saveYourselfAtom))) {
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(saveAndTerminateView:);
+ break;
+ }
+ }
+ /*
+ * any other client message
+ */
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(clientMessage:type:format:data:);
+ __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xclient.message_type);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __MKSMALLINT(ev.xclient.format);
+ t = __MKBYTEARRAY(&ev.xclient.data, sizeof(ev.xclient.data)); __ArrayInstPtr(anEventArray)->a_element[5] = t; __STORE(anEventArray, t);
+ break;
+
+ case MappingNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mappingNotify:request:event:);
+ switch(mape->request) {
+ case MappingModifier:
+ arg = @symbol(mappingModifier);
+ break;
+ case MappingKeyboard:
+ arg = @symbol(mappingKeyboard);
+ break;
+ case MappingPointer:
+ arg = @symbol(mappingPointer);
+ break;
+ default:
+ arg = __MKSMALLINT(mape->request);
+ break;
+ }
+ __ArrayInstPtr(anEventArray)->a_element[3] = arg;
+ t = __MKBYTEARRAY(&ev, sizeof(*mape)); __ArrayInstPtr(anEventArray)->a_element[4] = t;
+ __STORE(anEventArray, t);
+ break;
+
+ case KeymapNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(keymapNotify:);
+ break;
+
+ case MapRequest:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(mapRequest:);
+ break;
+
+ case ReparentNotify:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(reparentedView:parentId:x:y:);
+ t = __MKEXTERNALADDRESS(rpe->parent);
+ __ArrayInstPtr(anEventArray)->a_element[3] = t; __STORE(anEventArray, t);
+ __ArrayInstPtr(anEventArray)->a_element[4] = __mkSmallInteger(rpe->x);
+ __ArrayInstPtr(anEventArray)->a_element[5] = __mkSmallInteger(rpe->y);
+ break;
+
+ default:
+ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(unknownX11Event);
+ break;
}
#undef ae
#undef ee
@@ -6585,6 +6586,8 @@
%}.
^ true
+
+ "Modified: / 17-05-2018 / 18:26:09 / Stefan Vogel"
!
handleAllEvents
@@ -8355,98 +8358,101 @@
<context: #return>
%{
- int result, ok, evMask;
+ int result, ok;
+ unsigned int evMask;
Window confineWin;
Cursor curs;
int pointer_mode, keyboard_mode;
if (ISCONNECTED) {
- if (__isExternalAddress(aWindowId)) {
- if (__isExternalAddress(confineId))
- confineWin = __WindowVal(confineId);
- else
- confineWin = (Window) None;
-
- if (__isExternalAddress(aCursorId))
- curs = __CursorVal(aCursorId);
- else
- curs = (Cursor) None;
-
- if (pMode == @symbol(sync))
- pointer_mode = GrabModeSync;
- else
- pointer_mode = GrabModeAsync;
-
- if (kMode == @symbol(sync))
- keyboard_mode = GrabModeSync;
- else
- keyboard_mode = GrabModeAsync;
-
- if (__isSmallInteger(eventMask))
- evMask = __intVal(eventMask);
- else
- evMask = ButtonPressMask | ButtonMotionMask | PointerMotionMask | ButtonReleaseMask;
+ if (__isExternalAddress(aWindowId)) {
+ if (__isExternalAddress(confineId))
+ confineWin = __WindowVal(confineId);
+ else
+ confineWin = (Window) None;
+
+ if (__isExternalAddress(aCursorId))
+ curs = __CursorVal(aCursorId);
+ else
+ curs = (Cursor) None;
+
+ if (pMode == @symbol(sync))
+ pointer_mode = GrabModeSync;
+ else
+ pointer_mode = GrabModeAsync;
+
+ if (kMode == @symbol(sync))
+ keyboard_mode = GrabModeSync;
+ else
+ keyboard_mode = GrabModeAsync;
+
+ if (__isSmallInteger(eventMask))
+ evMask = __intVal(eventMask);
+ else
+ evMask = ButtonPressMask | ButtonMotionMask | PointerMotionMask | ButtonReleaseMask;
/*
- ENTER_XLIB();
+ ENTER_XLIB();
*/
- result = XGrabPointer(myDpy,
- __WindowVal(aWindowId),
- False,
- evMask,
- pointer_mode, keyboard_mode,
- confineWin,
- curs,
- CurrentTime);
+ result = XGrabPointer(myDpy,
+ __WindowVal(aWindowId),
+ False,
+ evMask,
+ pointer_mode, keyboard_mode,
+ confineWin,
+ curs,
+ CurrentTime);
/*
- LEAVE_XLIB();
+ LEAVE_XLIB();
*/
- ok = 0;
- switch (result) {
- case AlreadyGrabbed:
- if (@global(ErrorPrinting) == true) {
- console_fprintf(stderr, "XWorkstation [warning]: grab pointer: AlreadyGrabbed\n");
- }
- break;
- case GrabNotViewable:
- if (@global(ErrorPrinting) == true) {
- console_fprintf(stderr, "XWorkstation [warning]: grab pointer: GrabNotViewable\n");
- }
- break;
- case GrabInvalidTime:
- if (@global(ErrorPrinting) == true) {
- console_fprintf(stderr, "XWorkstation [warning]: grab pointer: InvalidTime\n");
- }
- break;
- case GrabFrozen:
- if (@global(ErrorPrinting) == true) {
- console_fprintf(stderr, "XWorkstation [warning]: grab pointer: Frozen\n");
- }
- break;
- default:
- ok = 1;
- break;
- }
-
- if (! ok) {
+ ok = 0;
+ switch (result) {
+ case AlreadyGrabbed:
+ if (@global(ErrorPrinting) == true) {
+ console_fprintf(stderr, "XWorkstation [warning]: grab pointer: AlreadyGrabbed\n");
+ }
+ break;
+ case GrabNotViewable:
+ if (@global(ErrorPrinting) == true) {
+ console_fprintf(stderr, "XWorkstation [warning]: grab pointer: GrabNotViewable\n");
+ }
+ break;
+ case GrabInvalidTime:
+ if (@global(ErrorPrinting) == true) {
+ console_fprintf(stderr, "XWorkstation [warning]: grab pointer: InvalidTime\n");
+ }
+ break;
+ case GrabFrozen:
+ if (@global(ErrorPrinting) == true) {
+ console_fprintf(stderr, "XWorkstation [warning]: grab pointer: Frozen\n");
+ }
+ break;
+ default:
+ ok = 1;
+ break;
+ }
+
+ if (! ok) {
/*
- ENTER_XLIB();
+ ENTER_XLIB();
*/
- XUngrabPointer(myDpy, CurrentTime);
+ XUngrabPointer(myDpy, CurrentTime);
/*
- LEAVE_XLIB();
+ LEAVE_XLIB();
*/
- RETURN (false);
- }
- RETURN ( true );
- }
+ RETURN (false);
+ }
+ RETURN ( true );
+ }
}
%}.
self primitiveFailedOrClosedConnection.
^ false
+
+ "Modified: / 17-05-2018 / 18:27:33 / Stefan Vogel"
!
grabPointerIn:aWindowId withCursor:aCursorId pointerMode:pMode keyboardMode:kMode confineTo:confineId
@@ -8541,81 +8547,82 @@
<context: #return>
%{
- int modifierMask = AnyModifier;
+ unsigned int modifierMask = AnyModifier;
KeySym keySym, *syms;
if (__isStringLike(keySymCodeOrChar)) {
- keySym = XStringToKeysym(__stringVal(keySymCodeOrChar));
+ keySym = XStringToKeysym(__stringVal(keySymCodeOrChar));
} else {
- if (__isCharacter(keySymCodeOrChar)) {
- char s[2];
-
- s[0] = __intVal(__characterVal(keySymCodeOrChar));
- s[1] = '\0';
- keySym = XStringToKeysym(s);
- } else {
- if (__isSmallInteger(keySymCodeOrChar)) {
- keySym = (KeySym) __intVal(keySymCodeOrChar);
- } else {
- goto notOK;
- }
- }
+ if (__isCharacter(keySymCodeOrChar)) {
+ char s[2];
+
+ s[0] = __intVal(__characterVal(keySymCodeOrChar));
+ s[1] = '\0';
+ keySym = XStringToKeysym(s);
+ } else {
+ if (__isSmallInteger(keySymCodeOrChar)) {
+ keySym = (KeySym) __intVal(keySymCodeOrChar);
+ } else {
+ goto notOK;
+ }
+ }
}
if (modifierMaskOrNil != nil) {
- if (__isSmallInteger(modifierMaskOrNil)) {
- modifierMask = __intVal(modifierMaskOrNil);
- } else {
- goto notOK;
- }
+ if (__isSmallInteger(modifierMaskOrNil)) {
+ modifierMask = __intVal(modifierMaskOrNil);
+ } else {
+ goto notOK;
+ }
}
if (ISCONNECTED) {
- Display *dpy;
- Window window;
- int keyCode;
- int result;
- int mKbd, mPtr;
-
- mKbd = modeKbd == @symbol(GrabModeAsync) ? GrabModeAsync :GrabModeSync;
- mPtr = modePtr == @symbol(GrabModeAsync) ? GrabModeAsync :GrabModeSync;
-
- dpy = myDpy;
- keyCode = XKeysymToKeycode(dpy, keySym);
- if (__isExternalAddress(aWindowIdOrNil)) {
- window = __WindowVal(aWindowIdOrNil);
- } else {
- int screen;
-
- screen = DefaultScreen(dpy);
- window = RootWindow(dpy, screen);
- }
- ENTER_XLIB();
-
- result = XGrabKey (dpy,
- keyCode, modifierMask, window,
- False, mKbd, mPtr );
-
- XSync(dpy, True);
- XFlush(dpy);
-
- LEAVE_XLIB();
-
- if (result != Success) {
- if (result == BadAccess) {
- __INST(lastError) = @symbol(badAccess);
- } else {
- __INST(lastError) = @symbol(other);
- }
- RETURN (false);
- }
- RETURN (true);
+ Display *dpy;
+ Window window;
+ int keyCode;
+ int result;
+ int mKbd, mPtr;
+
+ mKbd = modeKbd == @symbol(GrabModeAsync) ? GrabModeAsync :GrabModeSync;
+ mPtr = modePtr == @symbol(GrabModeAsync) ? GrabModeAsync :GrabModeSync;
+
+ dpy = myDpy;
+ keyCode = XKeysymToKeycode(dpy, keySym);
+ if (__isExternalAddress(aWindowIdOrNil)) {
+ window = __WindowVal(aWindowIdOrNil);
+ } else {
+ int screen;
+
+ screen = DefaultScreen(dpy);
+ window = RootWindow(dpy, screen);
+ }
+ ENTER_XLIB();
+
+ result = XGrabKey (dpy,
+ keyCode, modifierMask, window,
+ False, mKbd, mPtr );
+
+ XSync(dpy, True);
+ XFlush(dpy);
+
+ LEAVE_XLIB();
+
+ if (result != Success) {
+ if (result == BadAccess) {
+ __INST(lastError) = @symbol(badAccess);
+ } else {
+ __INST(lastError) = @symbol(other);
+ }
+ RETURN (false);
+ }
+ RETURN (true);
}
notOK: ;
%}.
self primitiveFailedOrClosedConnection
"Modified: / 03-05-2018 / 16:27:51 / stefan"
+ "Modified: / 17-05-2018 / 18:29:18 / Stefan Vogel"
!
grabKey:keySymCodeOrChar modifier:modifierMaskOrNil window:aWindowIdOrNil