merged sendKey/ButtonEvent into one method;
dont sync (just flush) in eventPending;
--- a/XWorkstat.st Wed Jan 31 02:56:55 1996 +0100
+++ b/XWorkstat.st Thu Feb 01 20:48:22 1996 +0100
@@ -2929,8 +2929,8 @@
state := state bitOr:(self controlMask)
].
- self sendKeyEvent:#keyPress x:0 y:0 key:code state:state toViewId:viewId.
- self sendKeyEvent:#keyRelease x:0 y:0 key:code state:state toViewId:viewId
+ self sendKeyOrButtonEvent:#keyPress x:0 y:0 keyOrButton:code state:state toViewId:viewId.
+ self sendKeyOrButtonEvent:#keyRelease x:0 y:0 keyOrButton:code state:state toViewId:viewId
"
sending input to some (possibly alien) view:
@@ -2943,10 +2943,12 @@
"
!
-sendKeyEvent:typeSymbol x:xPos y:yPos key:keySymCode state:stateMask toViewId:targetId
- "send a keyPress/keyRelease event to some (possibly alien) view.
- TypeSymbol must be one of: #keyPress / #keyRelease.
- keySymCode can be either a symbol (as listen in X's keySyms or a numeric keysym)
+sendKeyOrButtonEvent:typeSymbol x:xPos y:yPos keyOrButton:keySymCodeOrButtonNr state:stateMask toViewId:targetId
+ "send a keyPress/Release or buttonPress/Release event to some (possibly alien) view.
+ TypeSymbol must be one of: #keyPress, #keyRelease, #buttonPress , #buttonRelease.
+ For buttonEvents, the keySymCodeOrButtonNr must be the buttons number (1, 2 ...);
+ for key events, it can be either a symbol (as listen in X's keySyms)
+ or a numeric keysym code.
This is the lowlevel entry, where state must include any shift/ctrl information
(not very user friendly)"
@@ -2956,33 +2958,52 @@
if (ISCONNECTED
&& __isSmallInteger(xPos) && __isSmallInteger(yPos)
- && __isSmallInteger(keySymCode) && __isSmallInteger(stateMask)
+ && (__isSmallInteger(keySymCodeOrButtonNr) || __isSymbol(keySymCodeOrButtonNr) || __isString(keySymCodeOrButtonNr))
+ && __isSmallInteger(stateMask)
&& (__isExternalAddress(targetId) || __isInteger(targetId))) {
XEvent ev;
Window target;
Status result;
KeySym keySym;
int screen = _intVal(_INST(screen));
-
- ev.xkey.x = __intVal(xPos);
- ev.xkey.y = __intVal(yPos);
- if (__isSymbol(keySymCode)) {
- keySym = XStringToKeysym(__stringVal(keySymCode));
+ char s[2];
+
+ if ((typeSymbol == @symbol(keyPress))
+ || (typeSymbol == @symbol(keyRelease))) {
+ if (__isSymbol(keySymCodeOrButtonNr) || __isString(keySymCodeOrButtonNr)) {
+ keySym = XStringToKeysym(__stringVal(keySymCodeOrButtonNr));
+ } else {
+ if (__isCharacter(keySymCodeOrButtonNr)) {
+ s[0] = __intVal(__characterVal(keySymCodeOrButtonNr));
+ s[1] = '\0';
+ keySym = XStringToKeysym(s);
+ } else {
+ keySym = (KeySym) __intVal(keySymCodeOrButtonNr);
+ }
+ }
+ ev.xkey.keycode = XKeysymToKeycode(dpy, keySym);
} else {
- keySym = (KeySym) __intVal(keySymCode);
+ if ((typeSymbol == @symbol(buttonPress))
+ || (typeSymbol == @symbol(buttonRelease))) {
+ if (__isSmallInteger(keySymCodeOrButtonNr)) {
+ ev.xbutton.button = __intVal(keySymCodeOrButtonNr);
+ } else {
+ ev.xbutton.button = 1;
+ }
+ } else {
+ DPRINTF(("invalid sendEvent typeSymbol\n"));
+ RETURN (false);
+ }
}
- ev.xkey.keycode = XKeysymToKeycode(dpy, keySym);
- ev.xkey.state = __intVal(stateMask);
- ev.xkey.time = CurrentTime;
if (typeSymbol == @symbol(keyPress))
- ev.xkey.type = KeyPress;
+ ev.xany.type = KeyPress;
else if (typeSymbol == @symbol(keyRelease))
- ev.xkey.type = KeyRelease;
- else {
- DPRINTF(("invalid sendEvent typeSymbol\n"));
- RETURN (false);
- }
+ ev.xany.type = KeyRelease;
+ else if (typeSymbol == @symbol(buttonPress))
+ ev.xany.type = ButtonPress;
+ else if (typeSymbol == @symbol(buttonRelease))
+ ev.xany.type = ButtonRelease;
if (__isExternalAddress(targetId)) {
target = _WindowVal(targetId);
@@ -2993,62 +3014,10 @@
ev.xkey.same_screen = 1;
ev.xkey.subwindow = 0;
ev.xkey.root = RootWindow(myDpy, screen);
-
- result = XSendEvent(dpy, target, False, 0 , &ev);
- if ((result == BadValue) || (result == BadWindow)) {
- DPRINTF(("bad status\n"));
- RETURN ( false )
- }
- RETURN (true)
- }
-%}.
- self primitiveFailed.
- ^ false
-!
-
-sendButtonEvent:typeSymbol x:xPos y:yPos button:buttonNr state:stateMask toViewId:targetId
- "send a buttonPress/buttonRelease event to some (possibly alien) view.
- TypeSymbol must be one of: #buttonPress / #buttonRelease.
- This is the lowlevel entry, where state must include any shift/ctrl information
- (not very user friendly)"
-
-%{ /* NOCONTEXT */
- Display *dpy = myDpy;
- int type;
-
- if (ISCONNECTED
- && __isSmallInteger(xPos) && __isSmallInteger(yPos)
- && __isSmallInteger(buttonNr) && __isSmallInteger(stateMask)
- && (__isExternalAddress(targetId) || __isInteger(targetId))) {
- XEvent ev;
- Window target;
- Status result;
- int screen = _intVal(_INST(screen));
-
- ev.xbutton.x = __intVal(xPos);
- ev.xbutton.y = __intVal(yPos);
- ev.xbutton.button = __intVal(buttonNr);
- ev.xbutton.state = __intVal(stateMask);
- ev.xbutton.time = CurrentTime;
-
- if (typeSymbol == @symbol(buttonPress))
- ev.xbutton.type = ButtonPress;
- else if (typeSymbol == @symbol(buttonRelease))
- ev.xbutton.type = ButtonRelease;
- else {
- DPRINTF(("invalid sendEvent typeSymbol\n"));
- RETURN (false);
- }
-
- if (__isExternalAddress(targetId)) {
- target = _WindowVal(targetId);
- } else {
- target = (Window) __longIntVal(targetId);
- }
- ev.xbutton.window = target;
- ev.xbutton.same_screen = 1;
- ev.xbutton.subwindow = 0;
- ev.xbutton.root = RootWindow(myDpy, screen);
+ ev.xkey.x = __intVal(xPos);
+ ev.xkey.y = __intVal(yPos);
+ ev.xkey.state = __intVal(stateMask);
+ ev.xkey.time = CurrentTime;
result = XSendEvent(dpy, target, False, 0 , &ev);
if ((result == BadValue) || (result == BadWindow)) {
@@ -3073,7 +3042,7 @@
handled."
(self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
- Object abortSignal catch:[
+ AbortSignal catch:[
self dispatchLastEvent.
]
].
@@ -3658,6 +3627,8 @@
we only handle exposes until the graphicsExpose arrives.
Other systems may not need such a kludge"
+ self flush.
+
"interested in exposes only ?"
dispatchingExpose notNil ifTrue:[
[self exposeEventPendingFor:dispatchingExpose] whileTrue:[
@@ -3729,11 +3700,12 @@
"return true, if any event is pending.
This looks for both the internal queue and the display connection."
+ self flush.
dispatchingExpose notNil ifTrue:[
^ self exposeEventPendingFor:dispatchingExpose
].
- ^ self eventPendingWithSync
-"/ ^ self eventPendingWithoutSync
+"/ ^ self eventPendingWithSync
+ ^ self eventPendingWithoutSync
!
eventPending:anEventSymbol for:aWindowIdOrNil
@@ -4225,7 +4197,7 @@
as family and the other parameters as nil. For example, the cursor font
can be aquired that way."
- |theSize theName theId xlatedStyle enc|
+ |theName theId xlatedStyle "theSize enc" |
"special: if face is nil, allow access to X-fonts"
faceString isNil ifTrue:[
@@ -4385,7 +4357,7 @@
next time. The elements of the returned collection are instances of
FontDescription."
- |stream names aName fntDescr|
+ |"stream aName fntDescr" names|
listOfXFonts isNil ifTrue:[
"/
@@ -7297,6 +7269,6 @@
!XWorkstation class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview/Attic/XWorkstat.st,v 1.104 1996-01-31 01:56:55 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/Attic/XWorkstat.st,v 1.105 1996-02-01 19:48:22 cg Exp $'
! !
XWorkstation initialize!
--- a/XWorkstation.st Wed Jan 31 02:56:55 1996 +0100
+++ b/XWorkstation.st Thu Feb 01 20:48:22 1996 +0100
@@ -2929,8 +2929,8 @@
state := state bitOr:(self controlMask)
].
- self sendKeyEvent:#keyPress x:0 y:0 key:code state:state toViewId:viewId.
- self sendKeyEvent:#keyRelease x:0 y:0 key:code state:state toViewId:viewId
+ self sendKeyOrButtonEvent:#keyPress x:0 y:0 keyOrButton:code state:state toViewId:viewId.
+ self sendKeyOrButtonEvent:#keyRelease x:0 y:0 keyOrButton:code state:state toViewId:viewId
"
sending input to some (possibly alien) view:
@@ -2943,10 +2943,12 @@
"
!
-sendKeyEvent:typeSymbol x:xPos y:yPos key:keySymCode state:stateMask toViewId:targetId
- "send a keyPress/keyRelease event to some (possibly alien) view.
- TypeSymbol must be one of: #keyPress / #keyRelease.
- keySymCode can be either a symbol (as listen in X's keySyms or a numeric keysym)
+sendKeyOrButtonEvent:typeSymbol x:xPos y:yPos keyOrButton:keySymCodeOrButtonNr state:stateMask toViewId:targetId
+ "send a keyPress/Release or buttonPress/Release event to some (possibly alien) view.
+ TypeSymbol must be one of: #keyPress, #keyRelease, #buttonPress , #buttonRelease.
+ For buttonEvents, the keySymCodeOrButtonNr must be the buttons number (1, 2 ...);
+ for key events, it can be either a symbol (as listen in X's keySyms)
+ or a numeric keysym code.
This is the lowlevel entry, where state must include any shift/ctrl information
(not very user friendly)"
@@ -2956,33 +2958,52 @@
if (ISCONNECTED
&& __isSmallInteger(xPos) && __isSmallInteger(yPos)
- && __isSmallInteger(keySymCode) && __isSmallInteger(stateMask)
+ && (__isSmallInteger(keySymCodeOrButtonNr) || __isSymbol(keySymCodeOrButtonNr) || __isString(keySymCodeOrButtonNr))
+ && __isSmallInteger(stateMask)
&& (__isExternalAddress(targetId) || __isInteger(targetId))) {
XEvent ev;
Window target;
Status result;
KeySym keySym;
int screen = _intVal(_INST(screen));
-
- ev.xkey.x = __intVal(xPos);
- ev.xkey.y = __intVal(yPos);
- if (__isSymbol(keySymCode)) {
- keySym = XStringToKeysym(__stringVal(keySymCode));
+ char s[2];
+
+ if ((typeSymbol == @symbol(keyPress))
+ || (typeSymbol == @symbol(keyRelease))) {
+ if (__isSymbol(keySymCodeOrButtonNr) || __isString(keySymCodeOrButtonNr)) {
+ keySym = XStringToKeysym(__stringVal(keySymCodeOrButtonNr));
+ } else {
+ if (__isCharacter(keySymCodeOrButtonNr)) {
+ s[0] = __intVal(__characterVal(keySymCodeOrButtonNr));
+ s[1] = '\0';
+ keySym = XStringToKeysym(s);
+ } else {
+ keySym = (KeySym) __intVal(keySymCodeOrButtonNr);
+ }
+ }
+ ev.xkey.keycode = XKeysymToKeycode(dpy, keySym);
} else {
- keySym = (KeySym) __intVal(keySymCode);
+ if ((typeSymbol == @symbol(buttonPress))
+ || (typeSymbol == @symbol(buttonRelease))) {
+ if (__isSmallInteger(keySymCodeOrButtonNr)) {
+ ev.xbutton.button = __intVal(keySymCodeOrButtonNr);
+ } else {
+ ev.xbutton.button = 1;
+ }
+ } else {
+ DPRINTF(("invalid sendEvent typeSymbol\n"));
+ RETURN (false);
+ }
}
- ev.xkey.keycode = XKeysymToKeycode(dpy, keySym);
- ev.xkey.state = __intVal(stateMask);
- ev.xkey.time = CurrentTime;
if (typeSymbol == @symbol(keyPress))
- ev.xkey.type = KeyPress;
+ ev.xany.type = KeyPress;
else if (typeSymbol == @symbol(keyRelease))
- ev.xkey.type = KeyRelease;
- else {
- DPRINTF(("invalid sendEvent typeSymbol\n"));
- RETURN (false);
- }
+ ev.xany.type = KeyRelease;
+ else if (typeSymbol == @symbol(buttonPress))
+ ev.xany.type = ButtonPress;
+ else if (typeSymbol == @symbol(buttonRelease))
+ ev.xany.type = ButtonRelease;
if (__isExternalAddress(targetId)) {
target = _WindowVal(targetId);
@@ -2993,62 +3014,10 @@
ev.xkey.same_screen = 1;
ev.xkey.subwindow = 0;
ev.xkey.root = RootWindow(myDpy, screen);
-
- result = XSendEvent(dpy, target, False, 0 , &ev);
- if ((result == BadValue) || (result == BadWindow)) {
- DPRINTF(("bad status\n"));
- RETURN ( false )
- }
- RETURN (true)
- }
-%}.
- self primitiveFailed.
- ^ false
-!
-
-sendButtonEvent:typeSymbol x:xPos y:yPos button:buttonNr state:stateMask toViewId:targetId
- "send a buttonPress/buttonRelease event to some (possibly alien) view.
- TypeSymbol must be one of: #buttonPress / #buttonRelease.
- This is the lowlevel entry, where state must include any shift/ctrl information
- (not very user friendly)"
-
-%{ /* NOCONTEXT */
- Display *dpy = myDpy;
- int type;
-
- if (ISCONNECTED
- && __isSmallInteger(xPos) && __isSmallInteger(yPos)
- && __isSmallInteger(buttonNr) && __isSmallInteger(stateMask)
- && (__isExternalAddress(targetId) || __isInteger(targetId))) {
- XEvent ev;
- Window target;
- Status result;
- int screen = _intVal(_INST(screen));
-
- ev.xbutton.x = __intVal(xPos);
- ev.xbutton.y = __intVal(yPos);
- ev.xbutton.button = __intVal(buttonNr);
- ev.xbutton.state = __intVal(stateMask);
- ev.xbutton.time = CurrentTime;
-
- if (typeSymbol == @symbol(buttonPress))
- ev.xbutton.type = ButtonPress;
- else if (typeSymbol == @symbol(buttonRelease))
- ev.xbutton.type = ButtonRelease;
- else {
- DPRINTF(("invalid sendEvent typeSymbol\n"));
- RETURN (false);
- }
-
- if (__isExternalAddress(targetId)) {
- target = _WindowVal(targetId);
- } else {
- target = (Window) __longIntVal(targetId);
- }
- ev.xbutton.window = target;
- ev.xbutton.same_screen = 1;
- ev.xbutton.subwindow = 0;
- ev.xbutton.root = RootWindow(myDpy, screen);
+ ev.xkey.x = __intVal(xPos);
+ ev.xkey.y = __intVal(yPos);
+ ev.xkey.state = __intVal(stateMask);
+ ev.xkey.time = CurrentTime;
result = XSendEvent(dpy, target, False, 0 , &ev);
if ((result == BadValue) || (result == BadWindow)) {
@@ -3073,7 +3042,7 @@
handled."
(self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
- Object abortSignal catch:[
+ AbortSignal catch:[
self dispatchLastEvent.
]
].
@@ -3658,6 +3627,8 @@
we only handle exposes until the graphicsExpose arrives.
Other systems may not need such a kludge"
+ self flush.
+
"interested in exposes only ?"
dispatchingExpose notNil ifTrue:[
[self exposeEventPendingFor:dispatchingExpose] whileTrue:[
@@ -3729,11 +3700,12 @@
"return true, if any event is pending.
This looks for both the internal queue and the display connection."
+ self flush.
dispatchingExpose notNil ifTrue:[
^ self exposeEventPendingFor:dispatchingExpose
].
- ^ self eventPendingWithSync
-"/ ^ self eventPendingWithoutSync
+"/ ^ self eventPendingWithSync
+ ^ self eventPendingWithoutSync
!
eventPending:anEventSymbol for:aWindowIdOrNil
@@ -4225,7 +4197,7 @@
as family and the other parameters as nil. For example, the cursor font
can be aquired that way."
- |theSize theName theId xlatedStyle enc|
+ |theName theId xlatedStyle "theSize enc" |
"special: if face is nil, allow access to X-fonts"
faceString isNil ifTrue:[
@@ -4385,7 +4357,7 @@
next time. The elements of the returned collection are instances of
FontDescription."
- |stream names aName fntDescr|
+ |"stream aName fntDescr" names|
listOfXFonts isNil ifTrue:[
"/
@@ -7297,6 +7269,6 @@
!XWorkstation class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.104 1996-01-31 01:56:55 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.105 1996-02-01 19:48:22 cg Exp $'
! !
XWorkstation initialize!