XWorkstation.st
changeset 2156 0cb3b353630f
parent 2146 1c13fdc62a9f
child 2176 80290576c9db
--- a/XWorkstation.st	Wed Jun 17 09:29:18 1998 +0200
+++ b/XWorkstation.st	Wed Jun 17 20:25:57 1998 +0200
@@ -4094,61 +4094,75 @@
     ]
 !
 
-selectionRequest:propertyID target:targetID selection:selectionID from:windowID view:aView
+selectionRequest:propertyID target:targetID selection:selectionID time:t from:windowID view:aView
     "sent by some other X-client to ask for the selection.
      This is a very X-specific mechanism."
 
     |o s stream|
 
     targetID == (self atomIDOfLENGTH) ifTrue:[
-	"/
-	"/ the other one wants to know the size of our selection ...
-	"/
-
-	s := self selectionAsString.
-	self
-	    setLengthProperty:propertyID 
-	    value:s size 
-	    for:windowID.
-	self
-	    sendSelectionNotifySelection:selectionID
-	    property:propertyID
-	    target:targetID
-	    from:aView id
-	    to:windowID.
-	^ self
+        "/
+        "/ the other one wants to know the size of our selection ...
+        "/
+        s := self selectionAsString.
+        self
+            setLengthProperty:propertyID 
+            value:s size 
+            for:windowID.
+        self
+            sendSelectionNotifySelection:selectionID
+            property:propertyID
+            target:targetID
+            time:t
+            from:aView id
+            to:windowID.
+        ^ self
     ].
 
     (targetID == self atomIDOfSTRING or:[
      targetID == (self atomIDOf:'COMPOUND_TEXT')]) ifTrue:[
-	"/
-	"/ the other view wants the selection as string
-	"/
-
-	s := self selectionAsString.
-	self
-	    sendSelection:s 
-	    property:propertyID 
-	    target:targetID
-	    from:aView id 
-	    to:windowID.
-	^ self
+        "/
+        "/ the other view wants the selection as string
+        "/
+        s := self selectionAsString.
+        self
+            sendSelection:s 
+            selection:primaryAtom
+            property:propertyID 
+            target:self atomIDOfSTRING "/ targetID
+            time:t
+            from:windowID
+            to:windowID.
+        ^ self
     ].
 
-    "/
-    "/ send the seletion in binaryStore format
-    "/ (assuming, that the other view knows how to handle it)
-    "/
-    o := self getCopyBuffer.
-    stream := WriteStream on:(ByteArray new:200).
-    o storeBinaryOn:stream.
-
-    self
-	sendSelection:(stream contents) 
-	property:propertyID 
-	target:(self atomIDOf:'ST_OBJECT' create:true) 
-	from:aView id 
-	to:windowID
+"/    (targetID == (self atomIDOf:'TARGETS')) ifTrue:[
+"/"/ TODO: implement this to avoid netscape paste-delay.
+"/"/
+"/        ^ self
+"/    ].
+
+    (targetID == (self atomIDOf:'ST_OBJECT')) ifTrue:[
+        "/
+        "/ send the selection in binaryStore format
+        "/ (assuming, that the other view knows how to handle it)
+        "/
+        o := self getCopyBuffer.
+        stream := WriteStream on:(ByteArray new:200).
+        o storeBinaryOn:stream.
+
+        ^ self
+            sendSelection:(stream contents) 
+            selection:primaryAtom
+            property:propertyID 
+            target:targetID 
+            time:t
+            from:windowID 
+            to:windowID
+    ].
+
+    "Created: / 17.6.1998 / 19:33:10 / cg"
+    "Modified: / 17.6.1998 / 20:24:40 / cg"
 ! !
 
 !XWorkstation methodsFor:'event handling'!
@@ -4187,7 +4201,9 @@
 !
 
 dispatchLastEvent
-    |theView symS arg butt sibling windowID siblingID propertyID selectionID targetID requestorID
+    |theView symS arg butt sibling 
+     windowID siblingID propertyID selectionID targetID requestorID
+     evTime
      eventType|
 
 %{  /* STACK: 8000 */
@@ -4253,7 +4269,7 @@
     static struct inlineCache gravNotify = _ILC1;
     static struct inlineCache prop = _ILC1;
     static struct inlineCache selClear = _ILC2;
-    static struct inlineCache selReq = _ILC5;
+    static struct inlineCache selReq = _ILC6;
     static struct inlineCache selNotify = _ILC5;
     static struct inlineCache colormap = _ILC1;
     static struct inlineCache mapping = _ILC2;
@@ -4263,7 +4279,7 @@
     static struct inlineCache skrS = _ILC4;
 
     if (! ISCONNECTED) {
-	RETURN (false);
+        RETURN (false);
     }
 
     dpy = myDpy;
@@ -4271,10 +4287,10 @@
     eB = __INST(eventBuffer);
 
     if (__isByteArray(eB)) {
-	ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+        ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
     } else {
-	printf("DISPLAY: no eventBuffer\n");
-	RETURN (false);
+        printf("DISPLAY: no eventBuffer\n");
+        RETURN (false);
     }
 
     /*
@@ -4282,30 +4298,30 @@
      * avoid creation & lookup then.
      */
     if ((t = __INST(lastId)) != nil) {
-	if (__isExternalAddress(t)) {
-	    if (_WindowVal(t) == ae->window) {
-		theView = __INST(lastView);
-		if (__isNonNilObject(theView)) {
-		    if (__qClass(theView) == nil) {
-			theView = nil;
-		    }
-		}
-	    }
-	}
+        if (__isExternalAddress(t)) {
+            if (_WindowVal(t) == ae->window) {
+                theView = __INST(lastView);
+                if (__isNonNilObject(theView)) {
+                    if (__qClass(theView) == nil) {
+                        theView = nil;
+                    }
+                }
+            }
+        }
     }
 
     if (theView == nil) {
-	windowID = __MKEXTERNALADDRESS(ae->window);
-	theView = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, windowID);
-	/*
-	 * MKEXTERNALADDRESS and/or #viewFromId: could lead to a GC - refetch event ptr
-	 */
-	eB = __INST(eventBuffer);
-	ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+        windowID = __MKEXTERNALADDRESS(ae->window);
+        theView = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, windowID);
+        /*
+         * MKEXTERNALADDRESS and/or #viewFromId: could lead to a GC - refetch event ptr
+         */
+        eB = __INST(eventBuffer);
+        ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
     }
 
     if ((theView == nil) && (ev->type != MappingNotify)) {
-	RETURN (nil);
+        RETURN (nil);
     }
 
     /*
@@ -4325,539 +4341,518 @@
     eventType = __MKSMALLINT(ev->type);
 #endif
     switch (ev->type) {
-	case KeyRelease:
-	    symS = @symbol(keyRelease:x:y:view:);
-	    ipS = &skrS;
-	    upDown = false;
-	    goto keyPressAndRelease;
-
-	case KeyPress:
-	    symS = @symbol(keyPress:x:y:view:);
-	    ipS = &skpS;
-	    upDown = true;
-	    /* FALL INTO */
-
-	keyPressAndRelease:
-	    __INST(eventRootX) = __MKSMALLINT(ke->x_root);
-	    __INST(eventRootY) = __MKSMALLINT(ke->y_root);
+        case KeyRelease:
+            symS = @symbol(keyRelease:x:y:view:);
+            ipS = &skrS;
+            upDown = false;
+            goto keyPressAndRelease;
+
+        case KeyPress:
+            symS = @symbol(keyPress:x:y:view:);
+            ipS = &skpS;
+            upDown = true;
+            /* FALL INTO */
+
+        keyPressAndRelease:
+            __INST(eventRootX) = __MKSMALLINT(ke->x_root);
+            __INST(eventRootY) = __MKSMALLINT(ke->y_root);
 #ifdef OLD
-	    __INST(altDown) = (ke->state & Mod2Mask) ? true : false;
-	    __INST(metaDown) = (ke->state & Mod1Mask) ? true : false;
+            __INST(altDown) = (ke->state & Mod2Mask) ? true : false;
+            __INST(metaDown) = (ke->state & Mod1Mask) ? true : false;
 #else
-	    __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
-	    __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
+            __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
+            __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
 #endif
-	    __INST(shiftDown) = (ke->state & ShiftMask) ? true : false;
-	    __INST(ctrlDown) = (ke->state & ControlMask) ? true : false;
-
-	    ev_x = ke->x;
-	    ev_y = ke->y;
-
-	    arg = nil;
-	    nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
-	    if (nchars 
-	     && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
-		 || (buffer[0] >= 0x80))) {
-		arg = _MKCHARACTER(buffer[0])/* *_CharacterTable[buffer[0]] */;
-		keySymString = NULL;
-	    } else {
+            __INST(shiftDown) = (ke->state & ShiftMask) ? true : false;
+            __INST(ctrlDown) = (ke->state & ControlMask) ? true : false;
+
+            ev_x = ke->x;
+            ev_y = ke->y;
+
+            arg = nil;
+            nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
+            if (nchars 
+             && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
+                 || (buffer[0] >= 0x80))) {
+                arg = _MKCHARACTER(buffer[0])/* *_CharacterTable[buffer[0]] */;
+                keySymString = NULL;
+            } else {
 #ifdef OLD
-		switch (keySym) {
-		    case XK_Control_L:
-		    case XK_Control_R:
-			__INST(ctrlDown) = upDown;
-			break;
-		    case XK_Shift_L:
-		    case XK_Shift_R:
-			__INST(shiftDown) = upDown;
-			break;
-		    case XK_Meta_L:
-		    case XK_Meta_R:
-			__INST(metaDown) = upDown;
-			break;
-		    case XK_Alt_L:
-		    case XK_Alt_R:
-			__INST(altDown) = upDown;
-			break;
-		}
+                switch (keySym) {
+                    case XK_Control_L:
+                    case XK_Control_R:
+                        __INST(ctrlDown) = upDown;
+                        break;
+                    case XK_Shift_L:
+                    case XK_Shift_R:
+                        __INST(shiftDown) = upDown;
+                        break;
+                    case XK_Meta_L:
+                    case XK_Meta_R:
+                        __INST(metaDown) = upDown;
+                        break;
+                    case XK_Alt_L:
+                    case XK_Alt_R:
+                        __INST(altDown) = upDown;
+                        break;
+                }
 #endif
 
-		keySymString = XKeysymToString(keySym);
-		if (keySymString) {
+                keySymString = XKeysymToString(keySym);
+                if (keySymString) {
 #ifdef OLD
-		    if (keySymString[0] == 'D') {
-			/*
-			 * remove underscore, dont want it in symbols
-			 */
-			if (strcmp(keySymString, "Delete_line") == 0) {
-			    keySymString = "DeleteLine";
-			} else if (strcmp(keySymString, "Delete_word") == 0) {
-			    keySymString = "DeleteWord";
-			}
-		    }
-		    /*
-		     * make names compatible
-		     */
-		    if (strcmp(keySymString, "Down") == 0) {
-			keySymString = "CursorDown";
-		    } else if (strcmp(keySymString, "Up") == 0) {
-			keySymString = "CursorUp";
-		    } else if (strcmp(keySymString, "Left") == 0) {
-			keySymString = "CursorLeft";
-		    } else if (strcmp(keySymString, "Right") == 0) {
-			keySymString = "CursorRight";
-		    }
-		    arg = __MKSYMBOL(keySymString, (OBJ *)0);
+                    if (keySymString[0] == 'D') {
+                        /*
+                         * remove underscore, dont want it in symbols
+                         */
+                        if (strcmp(keySymString, "Delete_line") == 0) {
+                            keySymString = "DeleteLine";
+                        } else if (strcmp(keySymString, "Delete_word") == 0) {
+                            keySymString = "DeleteWord";
+                        }
+                    }
+                    /*
+                     * make names compatible
+                     */
+                    if (strcmp(keySymString, "Down") == 0) {
+                        keySymString = "CursorDown";
+                    } else if (strcmp(keySymString, "Up") == 0) {
+                        keySymString = "CursorUp";
+                    } else if (strcmp(keySymString, "Left") == 0) {
+                        keySymString = "CursorLeft";
+                    } else if (strcmp(keySymString, "Right") == 0) {
+                        keySymString = "CursorRight";
+                    }
+                    arg = __MKSYMBOL(keySymString, (OBJ *)0);
 #else
-		    arg = __MKSTRING(keySymString);
+                    arg = __MKSTRING(keySymString);
 #endif
-		}
-	    }
-
-	    if (arg == nil) {
-		/* happens sometimes (alt-graph on sun has no keysym) */
-		break;
-	    }
-
-	    (*(*ipS).ilc_func)(self, symS, nil, ipS,
-			       arg, 
-			       __MKSMALLINT(ev_x), 
-			       __MKSMALLINT(ev_y),
-			       theView);
-	    break;
-
-	case ButtonPress:
-	    __INST(buttonsPressed) = __MKSMALLINT(__intVal(__INST(buttonsPressed)) | (1 << be->button));
-	    __INST(eventRootX) = __MKSMALLINT(be->x_root);
-	    __INST(eventRootY) = __MKSMALLINT(be->y_root);
-
-	    if (__isSmallInteger(__INST(multiClickTimeDelta)))
-		nextMultiClickTime = be->time + __intVal(__INST(multiClickTimeDelta));
-	    else
-		nextMultiClickTime = 0;
-
-
-	    if ((t = __INST(multiClickTime)) != nil) {
-		INT _multiClickTime;
-
-		_multiClickTime = __longIntVal(t);
-		if (be->time < _multiClickTime) {
-		    __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
-		    /*
-		     * MKUINT could lead to a GC - refetch event ptr
-		     */
-		    eB = __INST(eventBuffer);
-		    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-		    ipS = &bmpS;
-		    symS = @symbol(buttonMultiPress:x:y:view:);
-		    goto sendButtonEvent;
-		    break;
-		}
-	    }
-	    __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
-	    /*
-	     * MKUINT could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+                }
+            }
+
+            if (arg == nil) {
+                /* happens sometimes (alt-graph on sun has no keysym) */
+                break;
+            }
+
+            (*(*ipS).ilc_func)(self, symS, nil, ipS,
+                               arg, 
+                               __MKSMALLINT(ev_x), 
+                               __MKSMALLINT(ev_y),
+                               theView);
+            break;
+
+        case ButtonPress:
+            __INST(buttonsPressed) = __MKSMALLINT(__intVal(__INST(buttonsPressed)) | (1 << be->button));
+            __INST(eventRootX) = __MKSMALLINT(be->x_root);
+            __INST(eventRootY) = __MKSMALLINT(be->y_root);
+
+            if (__isSmallInteger(__INST(multiClickTimeDelta)))
+                nextMultiClickTime = be->time + __intVal(__INST(multiClickTimeDelta));
+            else
+                nextMultiClickTime = 0;
+
+
+            if ((t = __INST(multiClickTime)) != nil) {
+                INT _multiClickTime;
+
+                _multiClickTime = __longIntVal(t);
+                if (be->time < _multiClickTime) {
+                    __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
+                    /*
+                     * MKUINT could lead to a GC - refetch event ptr
+                     */
+                    eB = __INST(eventBuffer);
+                    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+
+                    ipS = &bmpS;
+                    symS = @symbol(buttonMultiPress:x:y:view:);
+                    goto sendButtonEvent;
+                    break;
+                }
+            }
+            __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
+            /*
+             * MKUINT could lead to a GC - refetch event ptr
+             */
+            eB = __INST(eventBuffer);
+            ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
 
 #ifdef NO_LONGER
-	    if (be->state & ShiftMask) {
-		ipS = &bspS;
-		symS = @symbol(buttonShiftPress:x:y:view:);
-		goto sendButtonEvent;
-	    }
+            if (be->state & ShiftMask) {
+                ipS = &bspS;
+                symS = @symbol(buttonShiftPress:x:y:view:);
+                goto sendButtonEvent;
+            }
 #endif
-	    ipS = &bpS;
-	    symS = @symbol(buttonPress:x:y:view:);
-	    goto sendButtonEvent;
-
-	    /* NOT REACHED */
-
-	case ButtonRelease:
-	    __INST(buttonsPressed) = __MKSMALLINT(__intVal(__INST(buttonsPressed)) & ~(1 << be->button));
-	    __INST(eventRootX) = __MKSMALLINT(be->x_root);
-	    __INST(eventRootY) = __MKSMALLINT(be->y_root);
-	    ipS = &brS;
-	    symS = @symbol(buttonRelease:x:y:view:);
-	    /* fall into */
-
-	sendButtonEvent:
-	    butt = __MKSMALLINT(be->button);
+            ipS = &bpS;
+            symS = @symbol(buttonPress:x:y:view:);
+            goto sendButtonEvent;
+
+            /* NOT REACHED */
+
+        case ButtonRelease:
+            __INST(buttonsPressed) = __MKSMALLINT(__intVal(__INST(buttonsPressed)) & ~(1 << be->button));
+            __INST(eventRootX) = __MKSMALLINT(be->x_root);
+            __INST(eventRootY) = __MKSMALLINT(be->y_root);
+            ipS = &brS;
+            symS = @symbol(buttonRelease:x:y:view:);
+            /* fall into */
+
+        sendButtonEvent:
+            butt = __MKSMALLINT(be->button);
 #ifdef NOTDEF
-	    /*
-	     * this allows operation with single button mouses: meta-click is always Button 2
-	     */
-	    if (__INST(metaDown) == true)
-		butt = __MKSMALLINT(2);
-	    else 
+            /*
+             * this allows operation with single button mouses: meta-click is always Button 2
+             */
+            if (__INST(metaDown) == true)
+                butt = __MKSMALLINT(2);
+            else 
 #endif
-		butt = __AT_(__INST(buttonTranslation), butt);
-	    /*
-	     * #at: could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-
-	    (*(*ipS).ilc_func)(self, 
-			       symS, nil, ipS,
-			       butt, 
-			       __MKSMALLINT(ke->x), 
-			       __MKSMALLINT(ke->y),
-			       theView);
-	    break;
-
-	case MotionNotify:
-	    if (__INST(motionEventCompression) != false) {
-		while (XCheckWindowEvent(dpy, me->window, ANYBUTTON, ev)) ;;
-	    }
-
-	    __INST(eventRootX) = __MKSMALLINT(me->x_root);
-	    __INST(eventRootY) = __MKSMALLINT(me->y_root);
+                butt = __AT_(__INST(buttonTranslation), butt);
+            /*
+             * #at: could lead to a GC - refetch event ptr
+             */
+            eB = __INST(eventBuffer);
+            ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+
+
+            (*(*ipS).ilc_func)(self, 
+                               symS, nil, ipS,
+                               butt, 
+                               __MKSMALLINT(ke->x), 
+                               __MKSMALLINT(ke->y),
+                               theView);
+            break;
+
+        case MotionNotify:
+            if (__INST(motionEventCompression) != false) {
+                while (XCheckWindowEvent(dpy, me->window, ANYBUTTON, ev)) ;;
+            }
+
+            __INST(eventRootX) = __MKSMALLINT(me->x_root);
+            __INST(eventRootY) = __MKSMALLINT(me->y_root);
 
 #ifdef OLD
-	    __INST(altDown) = (me->state & Mod2Mask) ? true : false;
-	    __INST(metaDown) = (me->state & Mod1Mask) ? true : false;
+            __INST(altDown) = (me->state & Mod2Mask) ? true : false;
+            __INST(metaDown) = (me->state & Mod1Mask) ? true : false;
 #else
-	    __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
-	    __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
+            __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
+            __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
 #endif
-	    __INST(shiftDown) = (me->state & ShiftMask) ? true : false;
-	    __INST(ctrlDown) = (me->state & ControlMask) ? true : false;
-
-	    (*motS.ilc_func)(self, 
-			     @symbol(buttonMotion:x:y:view:), nil, &motS,
-			     __MKSMALLINT(me->state),
-			     __MKSMALLINT(me->x),
-			     __MKSMALLINT(me->y),
-			     theView);
-	    break;
-
-	case FocusIn:
-	    (*focInS.ilc_func)(self, 
-			       @symbol(focusInView:), nil, &focInS, 
-			       theView);
-	    break;
-
-	case FocusOut:
-	    (*focOutS.ilc_func)(self, 
-				@symbol(focusOutView:), nil, &focOutS, 
-				theView);
-	    break;
-
-	case EnterNotify:
+            __INST(shiftDown) = (me->state & ShiftMask) ? true : false;
+            __INST(ctrlDown) = (me->state & ControlMask) ? true : false;
+
+            (*motS.ilc_func)(self, 
+                             @symbol(buttonMotion:x:y:view:), nil, &motS,
+                             __MKSMALLINT(me->state),
+                             __MKSMALLINT(me->x),
+                             __MKSMALLINT(me->y),
+                             theView);
+            break;
+
+        case FocusIn:
+            (*focInS.ilc_func)(self, 
+                               @symbol(focusInView:), nil, &focInS, 
+                               theView);
+            break;
+
+        case FocusOut:
+            (*focOutS.ilc_func)(self, 
+                                @symbol(focusOutView:), nil, &focOutS, 
+                                theView);
+            break;
+
+        case EnterNotify:
 #ifdef OLD
-	    __INST(altDown) = (ewe->state & Mod2Mask) ? true : false;
-	    __INST(metaDown) = (ewe->state & Mod1Mask) ? true : false;
+            __INST(altDown) = (ewe->state & Mod2Mask) ? true : false;
+            __INST(metaDown) = (ewe->state & Mod1Mask) ? true : false;
 #else
-	    __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
-	    __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
+            __INST(altDown) = (ke->state & __intVal(__INST(altModifierMask))) ? true : false;
+            __INST(metaDown) = (ke->state & __intVal(__INST(metaModifierMask))) ? true : false;
 #endif
-	    __INST(shiftDown) = (ewe->state & ShiftMask) ? true : false;
-	    __INST(ctrlDown) = (ewe->state & ControlMask) ? true : false;
-
-	    (*peS.ilc_func)(self, 
-			    @symbol(pointerEnter:x:y:view:), nil, &peS,
-			    __MKSMALLINT(ewe->state),
-			    __MKSMALLINT(ewe->x), 
-			    __MKSMALLINT(ewe->y),
-			    theView);
-	    break;
-
-	case LeaveNotify:
-	    (*plS.ilc_func)(self, 
-			    @symbol(pointerLeave:view:), nil, &plS,
-			    __MKSMALLINT(lwe->state), 
-			    theView);
-	    break;
-
-	case GraphicsExpose:
-	    (*gexpS.ilc_func)(self, 
-			      @symbol(graphicsExposeX:y:width:height:final:view:), nil, &gexpS,
-			      __MKSMALLINT(ee->x),
-			      __MKSMALLINT(ee->y),
-			      __MKSMALLINT(ee->width),
-			      __MKSMALLINT(ee->height),
-			      ee->count == 0 ? true : false,
-			      theView);
-
-	    if (ee->count != 0) {
-		break;
-	    }
-	    /* fall into */
-
-	case NoExpose:
-	    (*nexpS.ilc_func)(self, 
-			      @symbol(noExposeView:), nil, &nexpS, 
-			      theView);
-	    break;
-
-	case Expose:
-	    (*expS.ilc_func)(self, 
-			     @symbol(exposeX:y:width:height:view:), nil, &expS,
-			     __MKSMALLINT(ee->x),
-			     __MKSMALLINT(ee->y),
-			     __MKSMALLINT(ee->width),
-			     __MKSMALLINT(ee->height),
-			     theView);
-	    break;
-
-	case ConfigureNotify:
-	    if (ce->above != None) {
-		siblingID = __MKEXTERNALADDRESS(ce->above);
-		sibling = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, siblingID);
-		/*
-		 * MKEXTERNALADDRESS or #viewFromId: could lead to a GC - refetch event ptr
-		 */
-		eB = __INST(eventBuffer);
-		ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-	    }
-
-	    (*confS.ilc_func)(self, 
-			     @symbol(configureX:y:width:height:view:), nil, &confS,
-			     __MKSMALLINT(ce->x),
-			     __MKSMALLINT(ce->y),
-			     __MKSMALLINT(ce->width),
-			     __MKSMALLINT(ce->height),
-			     theView);
-	    if (sibling != nil) {
-		(*coveredS.ilc_func)(self,
-				    @symbol(coveredBy:view:), nil, &coveredS,
-				    theView,
-				    sibling);
-	    }
-	    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)))) {
-		    (*termS.ilc_func)(self, 
-				      @symbol(terminateView:), nil, &termS, theView);
-		    break;
-		}
-		if (ev->xclient.data.l[0] == (int) _AtomVal(__INST(saveYourselfAtom))) {
-		    (*savtermS.ilc_func)(self, 
-					 @symbol(saveAndTerminateView:)
-					 , nil, &savtermS, theView);
-		    break;
-		}
-	    }
-	    /*
-	     * any other client message
-	     */
-	    i = (char *)(&(ev->xclient.data)) - (char *)ev;
-	    (*clientMsg.ilc_func)(self, 
-				 @symbol(clientMessage:type:format:dataOffset:view:)
-				 , nil, &clientMsg 
-				 , __INST(eventBuffer)
-				 ,__MKSMALLINT(ev->xclient.message_type)
-				 ,__MKSMALLINT(ev->xclient.format)
-				 ,__MKSMALLINT(i), 
-				 theView);
-	    break;
-
-	case DestroyNotify:
-	    (*destrS.ilc_func)(self, @symbol(destroyedView:)
-			       , nil, &destrS, theView);
-	    break;
-
-	case UnmapNotify:
-	    (*unmapS.ilc_func)(self, @symbol(unmappedView:) 
-			       , nil, &unmapS, theView);
-	    break;
-
-	case MapNotify:
-	    (*mapS.ilc_func)(self, 
-			     @symbol(mappedView:) 
-			     , nil, &mapS, theView);
-	    break;
-
-	case KeymapNotify:
-	    (*keymap.ilc_func)(theView, 
-			       @symbol(keyMapChange) 
-			       , nil, &keymap);
-	    break;
-
-	case VisibilityNotify:
-	    switch (ve->state) {
-		case VisibilityUnobscured:
-		    arg = @symbol(unobscured);
-		    break;
-		case VisibilityPartiallyObscured:
-		    arg = @symbol(partiallyObscured);
-		    break;
-		case VisibilityFullyObscured:
-		    arg = @symbol(fullyObscured);
-		    break;
-	    }
-	    (*vis.ilc_func)(theView, @symbol(visibilityChange:), nil, &vis, arg);
-	    break;
-
-	case CreateNotify:
-	    (*created.ilc_func)(self, @symbol(createdView:), nil, &created, theView);
-	    break;
-
-	case MapRequest:
-	    (*mapReq.ilc_func)(self, @symbol(mapRequestView:), nil, &mapReq, theView);
-	    break;
-
-	case ReparentNotify:
-	    (*repar.ilc_func)(self, @symbol(reparentedView:), nil, &repar, theView);
-	    break;
-
-	case ConfigureRequest:
-	    (*confReq.ilc_func)(self, @symbol(configureRequestView:), nil, &confReq, theView);
-	    break;
-
-	case GravityNotify:
-	    (*gravNotify.ilc_func)(self, @symbol(gravityNotifyView:), nil, &resReq, theView);
-	    break;
-
-	case ResizeRequest:
-	    (*resReq.ilc_func)(self, @symbol(resizeRequestView:), nil, &resReq, theView);
-	    break;
-
-	case CirculateNotify:
-	    (*circNotify.ilc_func)(self, @symbol(circulateNotifyView:), nil, &circNotify, theView);
-	    break;
-
-	case CirculateRequest:
-	    (*circReq.ilc_func)(self, @symbol(circulateRequestView:), nil, &circReq, theView);
-	    break;
-
-	case PropertyNotify:
-	    (*prop.ilc_func)(self, 
-			     @symbol(propertyChangeView) 
-			     , nil, &prop,
-			     theView);
-	    break;
-
-	case SelectionClear:
-	    selectionID = __MKATOMOBJ(ev->xselectionclear.selection);
-	    (*selClear.ilc_func)(self, 
-				 @symbol(selectionClear:view:) 
-				 , nil, &selClear,
-				 selectionID,
-				 theView);
-	    break;
-
-	case SelectionNotify:
-	    /*
-	     * returned selection value (answer from SelectionRequest)
-	     */
-	    DPRINTF(("SelectionNotify prop=%x target=%x selection= %x requestor=%x\n", 
-			ev->xselection.property, ev->xselection.target,
-			ev->xselection.selection, ev->xselection.requestor));
-
-	    propertyID = __MKATOMOBJ(ev->xselection.property);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    targetID = __MKATOMOBJ(ev->xselection.target);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    selectionID = __MKATOMOBJ(ev->xselection.selection);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    requestorID = __MKEXTERNALADDRESS(ev->xselection.requestor);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    (*selNotify.ilc_func)(self, 
-				  @symbol(selectionNotify:target:selection:from:view:) 
-				  , nil, &selNotify,
-				  propertyID, targetID, selectionID, requestorID,
-				  theView);
-	    break;
-
-	case SelectionRequest:
-	    /*
-	     * someone wants the selection
-	     */
-	    DPRINTF(("SelectionRequest prop=%x target=%x selection=%x requestor=%x\n", 
-			ev->xselectionrequest.property,
-			ev->xselectionrequest.target,
-			ev->xselectionrequest.selection,
-			ev->xselectionrequest.requestor));
-
-	    propertyID = __MKATOMOBJ(ev->xselectionrequest.property);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    targetID = __MKATOMOBJ(ev->xselectionrequest.target);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    selectionID = __MKATOMOBJ(ev->xselectionrequest.selection);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    requestorID = __MKEXTERNALADDRESS(ev->xselectionrequest.requestor);
-	    /*
-	     * MKATOMOBJ could lead to a GC - refetch event ptr
-	     */
-	    eB = __INST(eventBuffer);
-	    ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
-
-	    (*selReq.ilc_func)(self, 
-			       @symbol(selectionRequest:target:selection:from:view:) 
-			       , nil, &selReq,
-			       propertyID, targetID, selectionID, requestorID,
-			       theView);
-	    break;
-
-	case ColormapNotify:
-	    (*colormap.ilc_func)(self, 
-				 @symbol(colorMapChangeView:) 
-				 , nil, &colormap,
-				 theView);
-	    break;
-
-	case MappingNotify:
-	    switch(mape->request) {
-		case MappingModifier:
-		    arg = @symbol(mappingModifier);
-		    break;
-		case MappingKeyboard:
-		    arg = @symbol(mappingKeyboard);
-		    break;
-		case MappingPointer:
-		    arg = @symbol(mappingPointer);
-		    break;
-		default:
-		    arg = nil;
-		    break;
-	    }
-	    (*mapping.ilc_func)(self, 
-				@symbol(mappingChanged:event:) 
-				, nil, &mapping, arg, eB);
-	    break;
+            __INST(shiftDown) = (ewe->state & ShiftMask) ? true : false;
+            __INST(ctrlDown) = (ewe->state & ControlMask) ? true : false;
+
+            (*peS.ilc_func)(self, 
+                            @symbol(pointerEnter:x:y:view:), nil, &peS,
+                            __MKSMALLINT(ewe->state),
+                            __MKSMALLINT(ewe->x), 
+                            __MKSMALLINT(ewe->y),
+                            theView);
+            break;
+
+        case LeaveNotify:
+            (*plS.ilc_func)(self, 
+                            @symbol(pointerLeave:view:), nil, &plS,
+                            __MKSMALLINT(lwe->state), 
+                            theView);
+            break;
+
+        case GraphicsExpose:
+            (*gexpS.ilc_func)(self, 
+                              @symbol(graphicsExposeX:y:width:height:final:view:), nil, &gexpS,
+                              __MKSMALLINT(ee->x),
+                              __MKSMALLINT(ee->y),
+                              __MKSMALLINT(ee->width),
+                              __MKSMALLINT(ee->height),
+                              ee->count == 0 ? true : false,
+                              theView);
+
+            if (ee->count != 0) {
+                break;
+            }
+            /* fall into */
+
+        case NoExpose:
+            (*nexpS.ilc_func)(self, 
+                              @symbol(noExposeView:), nil, &nexpS, 
+                              theView);
+            break;
+
+        case Expose:
+            (*expS.ilc_func)(self, 
+                             @symbol(exposeX:y:width:height:view:), nil, &expS,
+                             __MKSMALLINT(ee->x),
+                             __MKSMALLINT(ee->y),
+                             __MKSMALLINT(ee->width),
+                             __MKSMALLINT(ee->height),
+                             theView);
+            break;
+
+        case ConfigureNotify:
+            if (ce->above != None) {
+                siblingID = __MKEXTERNALADDRESS(ce->above);
+                sibling = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, siblingID);
+                /*
+                 * MKEXTERNALADDRESS or #viewFromId: could lead to a GC - refetch event ptr
+                 */
+                eB = __INST(eventBuffer);
+                ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+            }
+
+            (*confS.ilc_func)(self, 
+                             @symbol(configureX:y:width:height:view:), nil, &confS,
+                             __MKSMALLINT(ce->x),
+                             __MKSMALLINT(ce->y),
+                             __MKSMALLINT(ce->width),
+                             __MKSMALLINT(ce->height),
+                             theView);
+            if (sibling != nil) {
+                (*coveredS.ilc_func)(self,
+                                    @symbol(coveredBy:view:), nil, &coveredS,
+                                    theView,
+                                    sibling);
+            }
+            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)))) {
+                    (*termS.ilc_func)(self, 
+                                      @symbol(terminateView:), nil, &termS, theView);
+                    break;
+                }
+                if (ev->xclient.data.l[0] == (int) _AtomVal(__INST(saveYourselfAtom))) {
+                    (*savtermS.ilc_func)(self, 
+                                         @symbol(saveAndTerminateView:)
+                                         , nil, &savtermS, theView);
+                    break;
+                }
+            }
+            /*
+             * any other client message
+             */
+            i = (char *)(&(ev->xclient.data)) - (char *)ev;
+            (*clientMsg.ilc_func)(self, 
+                                 @symbol(clientMessage:type:format:dataOffset:view:)
+                                 , nil, &clientMsg 
+                                 , __INST(eventBuffer)
+                                 ,__MKSMALLINT(ev->xclient.message_type)
+                                 ,__MKSMALLINT(ev->xclient.format)
+                                 ,__MKSMALLINT(i), 
+                                 theView);
+            break;
+
+        case DestroyNotify:
+            (*destrS.ilc_func)(self, @symbol(destroyedView:)
+                               , nil, &destrS, theView);
+            break;
+
+        case UnmapNotify:
+            (*unmapS.ilc_func)(self, @symbol(unmappedView:) 
+                               , nil, &unmapS, theView);
+            break;
+
+        case MapNotify:
+            (*mapS.ilc_func)(self, 
+                             @symbol(mappedView:) 
+                             , nil, &mapS, theView);
+            break;
+
+        case KeymapNotify:
+            (*keymap.ilc_func)(theView, 
+                               @symbol(keyMapChange) 
+                               , nil, &keymap);
+            break;
+
+        case VisibilityNotify:
+            switch (ve->state) {
+                case VisibilityUnobscured:
+                    arg = @symbol(unobscured);
+                    break;
+                case VisibilityPartiallyObscured:
+                    arg = @symbol(partiallyObscured);
+                    break;
+                case VisibilityFullyObscured:
+                    arg = @symbol(fullyObscured);
+                    break;
+            }
+            (*vis.ilc_func)(theView, @symbol(visibilityChange:), nil, &vis, arg);
+            break;
+
+        case CreateNotify:
+            (*created.ilc_func)(self, @symbol(createdView:), nil, &created, theView);
+            break;
+
+        case MapRequest:
+            (*mapReq.ilc_func)(self, @symbol(mapRequestView:), nil, &mapReq, theView);
+            break;
+
+        case ReparentNotify:
+            (*repar.ilc_func)(self, @symbol(reparentedView:), nil, &repar, theView);
+            break;
+
+        case ConfigureRequest:
+            (*confReq.ilc_func)(self, @symbol(configureRequestView:), nil, &confReq, theView);
+            break;
+
+        case GravityNotify:
+            (*gravNotify.ilc_func)(self, @symbol(gravityNotifyView:), nil, &resReq, theView);
+            break;
+
+        case ResizeRequest:
+            (*resReq.ilc_func)(self, @symbol(resizeRequestView:), nil, &resReq, theView);
+            break;
+
+        case CirculateNotify:
+            (*circNotify.ilc_func)(self, @symbol(circulateNotifyView:), nil, &circNotify, theView);
+            break;
+
+        case CirculateRequest:
+            (*circReq.ilc_func)(self, @symbol(circulateRequestView:), nil, &circReq, theView);
+            break;
+
+        case PropertyNotify:
+            (*prop.ilc_func)(self, 
+                             @symbol(propertyChangeView) 
+                             , nil, &prop,
+                             theView);
+            break;
+
+        case SelectionClear:
+            selectionID = __MKATOMOBJ(ev->xselectionclear.selection);
+            (*selClear.ilc_func)(self, 
+                                 @symbol(selectionClear:view:) 
+                                 , nil, &selClear,
+                                 selectionID,
+                                 theView);
+            break;
+
+        case SelectionNotify:
+            /*
+             * returned selection value (answer from SelectionRequest)
+             */
+            DPRINTF(("SelectionNotify prop=%x target=%x selection= %x requestor=%x\n", 
+                        ev->xselection.property, ev->xselection.target,
+                        ev->xselection.selection, ev->xselection.requestor));
+
+            {
+                INT _property = ev->xselection.property;
+                INT _target = ev->xselection.target;
+                INT _selection = ev->xselection.selection;
+                INT _requestor = ev->xselection.requestor;
+
+                propertyID = __MKATOMOBJ(_property);
+                targetID = __MKATOMOBJ(_target);
+                selectionID = __MKATOMOBJ(_selection);
+                requestorID = __MKEXTERNALADDRESS(_requestor);
+            }
+            /*
+             * MKATOMOBJ/MKEXTERNALADDRESS could lead to a GC - refetch event ptr
+             */
+            eB = __INST(eventBuffer);
+            ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+
+            (*selNotify.ilc_func)(self, 
+                                  @symbol(selectionNotify:target:selection:from:view:) 
+                                  , nil, &selNotify,
+                                  propertyID, targetID, selectionID, requestorID,
+                                  theView);
+            break;
+
+        case SelectionRequest:
+            /*
+             * someone wants the selection
+             */
+            DPRINTF(("SelectionRequest prop=%x target=%x selection=%x requestor=%x\n", 
+                        ev->xselectionrequest.property,
+                        ev->xselectionrequest.target,
+                        ev->xselectionrequest.selection,
+                        ev->xselectionrequest.requestor));
+            {
+                INT _property = ev->xselectionrequest.property;
+                INT _target = ev->xselectionrequest.target;
+                INT _selection = ev->xselectionrequest.selection;
+                INT _requestor = ev->xselectionrequest.requestor;
+                INT _t = ev->xselectionrequest.time;
+
+                propertyID = __MKATOMOBJ(_property);
+                targetID = __MKATOMOBJ(_target);
+                selectionID = __MKATOMOBJ(_selection);
+                requestorID = __MKEXTERNALADDRESS(_requestor);
+                evTime = __MKEXTERNALADDRESS(_t);
+            }
+            /*
+             * MKATOMOBJ/MKEXTERNALADDR could lead to a GC - refetch event ptr
+             */
+            eB = __INST(eventBuffer);
+            ev = (XEvent *)(__ByteArrayInstPtr(eB)->ba_element);
+
+            (*selReq.ilc_func)(self, 
+                               @symbol(selectionRequest:target:selection:time:from:view:) 
+                               , nil, &selReq,
+                               propertyID, targetID, selectionID, evTime, requestorID,
+                               theView);
+            break;
+
+        case ColormapNotify:
+            (*colormap.ilc_func)(self, 
+                                 @symbol(colorMapChangeView:) 
+                                 , nil, &colormap,
+                                 theView);
+            break;
+
+        case MappingNotify:
+            switch(mape->request) {
+                case MappingModifier:
+                    arg = @symbol(mappingModifier);
+                    break;
+                case MappingKeyboard:
+                    arg = @symbol(mappingKeyboard);
+                    break;
+                case MappingPointer:
+                    arg = @symbol(mappingPointer);
+                    break;
+                default:
+                    arg = nil;
+                    break;
+            }
+            (*mapping.ilc_func)(self, 
+                                @symbol(mappingChanged:event:) 
+                                , nil, &mapping, arg, eB);
+            break;
     }
 #undef ae
 #undef ee
@@ -8373,80 +8368,79 @@
 
 setObjectProperty:propertyID value:anObject for:aWindowID
     "set a property to a smalltalk object in the XServer.
-     Can only be retrieved by another ST/X smalltalk"
+     Non-strings can only be retrieved by another ST/X smalltalk"
 
     |s|
 
     (anObject isMemberOf:String) ifTrue:[
-	^ self setTextProperty:propertyID value:anObject for:aWindowID
+        ^ self setTextProperty:propertyID value:anObject for:aWindowID
     ].
     s := WriteStream on:(ByteArray new:200).
     anObject storeBinaryOn:s.
     ^ self 
-	setProperty:propertyID 
-	type:(self atomIDOf:'ST_OBJECT' create:true) 
-	value:(s contents) 
-	for:aWindowID
-
-    "Modified: 6.4.1997 / 13:27:57 / cg"
+        setProperty:propertyID 
+        type:(self atomIDOf:'ST_OBJECT' create:true) 
+        value:(s contents) 
+        for:aWindowID
+
+    "Modified: / 17.6.1998 / 17:23:49 / cg"
 !
 
 setProperty:propertyID type:typeID value:anObject for:aWindowID
     "set a property in the XServer"
 
 %{  /* UNLIMITEDSTACK */
-
-    Atom prop, type;
-    Window window;
-    unsigned INT value;
-
     if (__isAtomID(propertyID)
      && __isAtomID(typeID) 
      && ISCONNECTED
      && (__isString(anObject) 
-	 || __isSmallInteger(anObject) 
-	 || __isSymbol(anObject) 
-	 || __isByteArray(anObject)
-	 || __isWords(anObject))) { 
-
-	Display *dpy = myDpy;
-
-	prop = _AtomVal(propertyID);
-	type = _AtomVal(typeID);
-
-	if (__isExternalAddress(aWindowID)) {
-	    window = _WindowVal(aWindowID);
-	} else {
-	    window = DefaultRootWindow(dpy);
-	}
-	if (__isSmallInteger(anObject)) {
-	    value = __intVal(anObject);
-	    XChangeProperty(dpy, window, prop, type, 32,
-			    PropModeReplace,
-			    (unsigned char *)(&value), sizeof(unsigned int));
-	} else {
-	    if (__isByteArray(anObject)) {
-		XChangeProperty(dpy, window, prop, type, 8,
-				PropModeReplace,
-				__ByteArrayInstPtr(anObject)->ba_element,
-				__byteArraySize(anObject));
-	    } else {
-		/* string or symbol or wordArray-like (16bit-string) object */
-		type = _AtomVal(typeID);
-		if (__isWords(__qClass(anObject))) {
-		    XChangeProperty(dpy, window, prop, type, 16,
-				    PropModeReplace,
-				    __stringVal(anObject),
-				    __wordArraySize(anObject));
-		} else {
-		    XChangeProperty(dpy, window, prop, type, 8,
-				    PropModeReplace,
-				    __stringVal(anObject),
-				    __stringSize(anObject));
-		}
-	    }
-	}
-	RETURN (true);
+         || __isSmallInteger(anObject) 
+         || __isSymbol(anObject) 
+         || __isByteArray(anObject)
+         || __isWords(anObject))) { 
+
+        Display *dpy = myDpy;
+        Atom prop, type;
+        Window window;
+        unsigned INT value;
+
+        prop = _AtomVal(propertyID);
+        type = _AtomVal(typeID);
+
+        if (__isExternalAddress(aWindowID)) {
+            window = _WindowVal(aWindowID);
+        } else {
+            window = DefaultRootWindow(dpy);
+        }
+
+        if (__isSmallInteger(anObject)) {
+            value = __intVal(anObject);
+            XChangeProperty(dpy, window, prop, type, 32,
+                            PropModeReplace,
+                            (unsigned char *)(&value), sizeof(unsigned int));
+        } else {
+            if (__isByteArray(anObject)) {
+                XChangeProperty(dpy, window, prop, type, 8,
+                                PropModeReplace,
+                                __ByteArrayInstPtr(anObject)->ba_element,
+                                __byteArraySize(anObject));
+            } else {
+                /* string or symbol or wordArray-like (16bit-string) object */
+                if (__isWords(__qClass(anObject))) {
+                    XChangeProperty(dpy, window, prop, type, 16,
+                                    PropModeReplace,
+                                    __stringVal(anObject),
+                                    __wordArraySize(anObject));
+                } else {
+                    XChangeProperty(dpy, window, prop, type, 8,
+                                    PropModeReplace,
+                                    __stringVal(anObject),
+                                    __stringSize(anObject));
+                }
+            }
+        }
+        DPRINTF(("changeProp win=%x prop=%x type=%x\n", window, prop, type));
+        RETURN (true);
     }
 %}.
     ^ false
@@ -8819,19 +8813,21 @@
 !XWorkstation methodsFor:'selections'!
 
 getSelectionFor:drawableId
-    "get the object selection -  either immediate, or asynchronous.
+    "get the object selection - either immediate, or asynchronous.
      Returns nil, if async request is on its way"
 
     |selProp sel|
 
     (self getSelectionOwnerOf:primaryAtom) isNil ifTrue:[
-	"no primary selection - use cut buffer"
-	sel := self getObjectProperty:cutBuffer0Atom from:nil.
-	^ sel
+        "no primary selection - use cut buffer"
+        sel := self getObjectProperty:cutBuffer0Atom from:nil.
+        ^ sel
     ].
     selProp := self atomIDOf:'ST_SELECTION' create:true.
     self requestObjectSelection:primaryAtom property:selProp for:drawableId.
     ^ nil
+
+    "Modified: / 17.6.1998 / 17:11:15 / cg"
 !
 
 getSelectionOwnerOf:selectionAtomID
@@ -8859,13 +8855,15 @@
     |selProp sel|
 
     (self getSelectionOwnerOf:primaryAtom) isNil ifTrue:[
-	"no primary selection - use cut buffer"
-	sel := self getTextProperty:cutBuffer0Atom from:nil.
-	^ sel
+        "no primary selection - use cut buffer"
+        sel := self getTextProperty:cutBuffer0Atom from:nil.
+        ^ sel
     ].
     selProp := self atomIDOf:'VT_SELECTION' create:true.
     self requestTextSelection:primaryAtom property:selProp for:drawableId.
     ^ nil
+
+    "Modified: / 17.6.1998 / 17:12:05 / cg"
 !
 
 requestObjectSelection:selectionID property:propertyID for:aWindowId
@@ -8927,39 +8925,30 @@
 			for:aWindowId
 !
 
-sendSelection:something property:propertyID target:targetID from:windowID to:requestorID
-    "send aString back from a SelectionRequest"
-
-    self 
-	sendSelection:something 
-	selection:primaryAtom
-	property:propertyID 
-	target:targetID 
-	from:windowID 
-	to:requestorID
-!
-
-sendSelection:something selection:selectionID property:propertyID target:targetID from:windowID to:requestorID
+sendSelection:something selection:selectionID property:propertyID target:targetID time:t from:windowID to:requestorID
     "send aString back from a SelectionRequest"
 
     self 
-	setProperty:propertyID 
-	type:targetID 
-	value:something 
-	for:requestorID.
+        setProperty:propertyID 
+        type:targetID 
+        value:something 
+        for:requestorID.
     self 
-	sendSelectionNotifySelection:selectionID 
-	property:propertyID 
-	target:targetID 
-	from:requestorID 
-	to:requestorID.
-!
-
-sendSelectionNotifySelection:selectionID property:propertyID target:targetID from:windowID to:requestorID
+        sendSelectionNotifySelection:selectionID 
+        property:propertyID 
+        target:targetID
+        time:t 
+        from:windowID 
+        to:requestorID.
+
+    "Modified: / 17.6.1998 / 17:03:20 / cg"
+    "Created: / 17.6.1998 / 19:44:03 / cg"
+!
+
+sendSelectionNotifySelection:selectionID property:propertyID target:targetID time:t from:windowID to:requestorID
     "send a selectionNotify back from a SelectionRequest"
 
 %{  /* NOCONTEXT */
-
     if (__isAtomID(propertyID)
      && __isExternalAddress(requestorID)
      && ISCONNECTED
@@ -8981,7 +8970,11 @@
             ev.xselection.requestor = _WindowVal(windowID);
         else
             ev.xselection.requestor = DefaultRootWindow(dpy);
-        ev.xselection.time = CurrentTime;
+        if (__isExternalAddress(t)) {
+            ev.xselection.time = (INT)(__externalAddressVal(t));
+        } else {
+            ev.xselection.time = CurrentTime;
+        }
         if (property == None)
             ev.xselection.property = target;
         else
@@ -8994,22 +8987,24 @@
                 ev.xselection.requestor,
                 requestor));
 
-	ENTER_XLIB();
+        ENTER_XLIB();
         result = XSendEvent(dpy, requestor, False, 0 , &ev);
-	LEAVE_XLIB();
+        LEAVE_XLIB();
 
         if ((result == BadValue) || (result == BadWindow)) {
             DPRINTF(("bad status\n"));
             RETURN (false);
         }
-	ENTER_XLIB();
+        ENTER_XLIB();
         XFlush(dpy);
-	LEAVE_XLIB();
+        LEAVE_XLIB();
         RETURN (true)
     }
 %}.
     self primitiveFailed.
     ^ false
+
+    "Modified: / 17.6.1998 / 20:23:20 / cg"
 !
 
 setSelection:anObject owner:aWindowId
@@ -9032,17 +9027,17 @@
     if (__isExternalAddress(aWindowId)
      && __isAtomID(selectionID)
      && ISCONNECTED) {
-	Display *dpy = myDpy;
-
-	win = _WindowVal(aWindowId);
-	XSetSelectionOwner(dpy, _AtomVal(selectionID), win, CurrentTime);
-	if (XGetSelectionOwner(dpy, _AtomVal(selectionID)) != win) {
-	    RETURN (false);
-	}
-	RETURN (true);
-    }
-%}
-.
+        Display *dpy = myDpy;
+
+        win = _WindowVal(aWindowId);
+        XSetSelectionOwner(dpy, _AtomVal(selectionID), win, CurrentTime);
+        DPRINTF(("setOwner prop=%x win=%x\n", _AtomVal(selectionID), win));
+        if (XGetSelectionOwner(dpy, _AtomVal(selectionID)) != win) {
+            RETURN (false);
+        }
+        RETURN (true);
+    }
+%}.
     self primitiveFailed.
     ^ nil
 !
@@ -9052,11 +9047,11 @@
      This can be used by any other X application."
 
     (self setSelectionOwner:aWindowId of:primaryAtom) ifFalse:[
-	'XWorkstation [warning]: selection ownerchange failed' errorPrintCR.
+        'XWorkstation [warning]: selection ownerchange failed' errorPrintCR.
     ].
-    ^ self setTextProperty:cutBuffer0Atom value:aString for:nil
-
-    "Modified: 10.1.1997 / 18:18:00 / cg"
+    ^ self setTextProperty:cutBuffer0Atom value:aString for:rootId.
+
+    "Modified: / 17.6.1998 / 19:48:54 / cg"
 ! !
 
 !XWorkstation methodsFor:'window stuff'!
@@ -9910,6 +9905,6 @@
 !XWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.283 1998-06-13 11:55:14 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.284 1998-06-17 18:25:57 cg Exp $'
 ! !
 XWorkstation initialize!