--- 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