XWorkstation.st
changeset 6570 6751a32c66ec
parent 6569 844102405f89
child 6571 ad1e51bf2c3b
--- a/XWorkstation.st	Sun Sep 21 13:26:23 2014 +0200
+++ b/XWorkstation.st	Mon Sep 22 11:03:58 2014 +0200
@@ -5048,7 +5048,6 @@
     "very low-level mapping of X11 event symbols to common ST/X event symbols"
     commonKey := rawKeySymTranslation at:key ifAbsent:key.
 
-view errorPrint. ' key:' errorPrint. commonKey errorPrintCR.
     self keyPress:commonKey x:x y:y view:view.
 !
 
@@ -7866,196 +7865,6 @@
     ^ 0
 ! !
 
-!XWorkstation methodsFor:'grabbing-keys'!
-
-grabKey:keySymCodeOrChar modifier:modifierMaskOrNil window:aWindowIdOrNil
-    "grab a single key either for an individual window
-     or the whole screen (if aWindowIdOrNil is nil).
-     The keySymCodeOrChar argument may be a keySym (name of a key) or an integer (the keySymCode)
-     or a character.
-     The modifierMaskOrNil is as mask as returned by altModifierMask, ctrlModifierMask, etc.
-     if nil, the key is grabbed with AnyModifier.
-     Only the key is passed to myself - no permanent grab is installed.
-     (GrabModeAsync)"
-
-    ^ self
-	grabKey:keySymCodeOrChar
-	modifier:modifierMaskOrNil
-	grabModeKeyboard:#GrabModeAsync
-	grabModePointer:#GrabModeAsync
-	window:aWindowIdOrNil
-!
-
-grabKey:keySymCodeOrChar modifier:modifierMaskOrNil grabModeKeyboard:modeKbd grabModePointer:modePtr window:aWindowIdOrNil
-    "internal basic entry to grab a single key either for an individual window
-     or the whole screen (if aWindowIdOrNil is nil).
-     The keySymCodeOrChar argument may be a keySym (name of a key) or an integer (the keySymCode)
-     or a character.
-     The modifierMaskOrNil is as mask as returned by altModifierMask, ctrlModifierMask, etc.
-     if nil, the key is grabbed with AnyModifier.
-     ModeKbd and modePtr are symbols GrabModeAsync or GrabModeSync.
-
-     After that, this key-event will no longer be sent to the window/screen.
-
-     Use with care: the only useful application is to define a special hotKey
-     to start/stop event recorders without a need for a click or focus change.
-     Once grabbed, those key events will be exclusively reported to me.
-
-     Use GrabModeSync with big care - you can easily lock up your Xserver,
-     and have to kill ST/X or force an ungrab from a remote login if you have.
-    "
-
-%{
-    int modifierMask = AnyModifier;
-    KeySym keySym, *syms;
-
-    if (__isStringLike(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 (modifierMaskOrNil != nil) {
-	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);
-    }
-  notOK: ;
-%}.
-    self primitiveFailedOrClosedConnection
-!
-
-ungrabKey:keySymCodeOrChar modifier:modifierMaskOrNil window:aWindowIdOrNil
-    "ungrab a single key as previously grabbed via grabKey:
-     Read the comment there."
-
-%{
-    int modifierMask = AnyModifier;
-    KeySym keySym, *syms;
-
-    if (__isStringLike(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 (modifierMaskOrNil != nil) {
-	if (__isSmallInteger(modifierMaskOrNil)) {
-	    modifierMask = __intVal(modifierMaskOrNil);
-	} else {
-	    goto notOK;
-	}
-    }
-
-    if (ISCONNECTED) {
-	Display *dpy;
-	Window window;
-	int keyCode;
-	int result;
-
-	dpy = myDpy;
-	if (__isExternalAddress(aWindowIdOrNil)) {
-	    window = __WindowVal(aWindowIdOrNil);
-	} else {
-	    int screen;
-
-	    screen = DefaultScreen(dpy);
-	    window = RootWindow(dpy, screen);
-	}
-	keyCode = XKeysymToKeycode(dpy, keySym);
-
-	ENTER_XLIB();
-
-	result = XUngrabKey (dpy, keyCode, modifierMask, window);
-
-	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
-! !
-
 !XWorkstation methodsFor:'grabbing'!
 
 allowEvents:mode
@@ -8323,6 +8132,196 @@
     ]
 ! !
 
+!XWorkstation methodsFor:'grabbing-keys'!
+
+grabKey:keySymCodeOrChar modifier:modifierMaskOrNil grabModeKeyboard:modeKbd grabModePointer:modePtr window:aWindowIdOrNil
+    "internal basic entry to grab a single key either for an individual window
+     or the whole screen (if aWindowIdOrNil is nil).
+     The keySymCodeOrChar argument may be a keySym (name of a key) or an integer (the keySymCode)
+     or a character.
+     The modifierMaskOrNil is as mask as returned by altModifierMask, ctrlModifierMask, etc.
+     if nil, the key is grabbed with AnyModifier.
+     ModeKbd and modePtr are symbols GrabModeAsync or GrabModeSync.
+
+     After that, this key-event will no longer be sent to the window/screen.
+
+     Use with care: the only useful application is to define a special hotKey
+     to start/stop event recorders without a need for a click or focus change.
+     Once grabbed, those key events will be exclusively reported to me.
+
+     Use GrabModeSync with big care - you can easily lock up your Xserver,
+     and have to kill ST/X or force an ungrab from a remote login if you have.
+    "
+
+%{
+    int modifierMask = AnyModifier;
+    KeySym keySym, *syms;
+
+    if (__isStringLike(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 (modifierMaskOrNil != nil) {
+	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);
+    }
+  notOK: ;
+%}.
+    self primitiveFailedOrClosedConnection
+!
+
+grabKey:keySymCodeOrChar modifier:modifierMaskOrNil window:aWindowIdOrNil
+    "grab a single key either for an individual window
+     or the whole screen (if aWindowIdOrNil is nil).
+     The keySymCodeOrChar argument may be a keySym (name of a key) or an integer (the keySymCode)
+     or a character.
+     The modifierMaskOrNil is as mask as returned by altModifierMask, ctrlModifierMask, etc.
+     if nil, the key is grabbed with AnyModifier.
+     Only the key is passed to myself - no permanent grab is installed.
+     (GrabModeAsync)"
+
+    ^ self
+	grabKey:keySymCodeOrChar
+	modifier:modifierMaskOrNil
+	grabModeKeyboard:#GrabModeAsync
+	grabModePointer:#GrabModeAsync
+	window:aWindowIdOrNil
+!
+
+ungrabKey:keySymCodeOrChar modifier:modifierMaskOrNil window:aWindowIdOrNil
+    "ungrab a single key as previously grabbed via grabKey:
+     Read the comment there."
+
+%{
+    int modifierMask = AnyModifier;
+    KeySym keySym, *syms;
+
+    if (__isStringLike(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 (modifierMaskOrNil != nil) {
+	if (__isSmallInteger(modifierMaskOrNil)) {
+	    modifierMask = __intVal(modifierMaskOrNil);
+	} else {
+	    goto notOK;
+	}
+    }
+
+    if (ISCONNECTED) {
+	Display *dpy;
+	Window window;
+	int keyCode;
+	int result;
+
+	dpy = myDpy;
+	if (__isExternalAddress(aWindowIdOrNil)) {
+	    window = __WindowVal(aWindowIdOrNil);
+	} else {
+	    int screen;
+
+	    screen = DefaultScreen(dpy);
+	    window = RootWindow(dpy, screen);
+	}
+	keyCode = XKeysymToKeycode(dpy, keySym);
+
+	ENTER_XLIB();
+
+	result = XUngrabKey (dpy, keyCode, modifierMask, window);
+
+	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
+! !
+
 !XWorkstation methodsFor:'graphic context stuff'!
 
 noClipIn:aDrawableId gc:aGCId
@@ -13558,11 +13557,11 @@
 !XWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.598 2014-09-21 11:26:23 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.599 2014-09-22 09:03:58 vrany Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.598 2014-09-21 11:26:23 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.599 2014-09-22 09:03:58 vrany Exp $'
 !
 
 version_SVN