merged sendKey/ButtonEvent into one method;
authorClaus Gittinger <cg@exept.de>
Thu, 01 Feb 1996 20:48:22 +0100
changeset 392 caf4452ec3dd
parent 391 d3cad7c15ae2
child 393 3504a0adbb2d
merged sendKey/ButtonEvent into one method; dont sync (just flush) in eventPending;
XWorkstat.st
XWorkstation.st
--- 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!