XWorkstation.st
changeset 1489 f264f7852a8d
parent 1486 638558d89c66
child 1491 1f526a662592
--- a/XWorkstation.st	Wed Mar 26 10:46:39 1997 +0100
+++ b/XWorkstation.st	Wed Mar 26 19:07:20 1997 +0100
@@ -3455,10 +3455,14 @@
      handled."
 
     (self getEventFor:aViewIdOrNil withMask:eventMask) ifTrue:[
-	AbortSignal catch:[
-	    self dispatchLastEvent.
-	]
+        AbortSignal handle:[:ex |
+            ex return
+        ] do:[
+            self dispatchLastEvent.
+        ]
     ].
+
+    "Modified: 26.3.1997 / 19:00:41 / cg"
 !
 
 dispatchExposeEventFor:aViewIdOrNil
@@ -3544,7 +3548,7 @@
     static struct inlineCache skrS = _ILC4;
 
     if (! ISCONNECTED) {
-	RETURN (false);
+        RETURN (false);
     }
 
     dpy = myDpy;
@@ -3552,10 +3556,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);
     }
 
     /*
@@ -3563,11 +3567,11 @@
      * avoid creation & lookup then.
      */
     if ((t = __INST(lastId)) != nil) {
-	if (__isExternalAddress(t)) {
-	    if (_WindowVal(t) == ae->window) {
-		theView = __INST(lastView);
-	    }
-	}
+        if (__isExternalAddress(t)) {
+            if (_WindowVal(t) == ae->window) {
+                theView = __INST(lastView);
+            }
+        }
     }
 
     if (theView == nil) {
@@ -3576,7 +3580,7 @@
     }
 
     if ((theView == nil) && (ev->type != MappingNotify)) {
-	RETURN (nil);
+        RETURN (nil);
     }
 
     /*
@@ -3596,458 +3600,458 @@
     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;
-
-	    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;
+
+            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, __context);
+                    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, __context);
 #else
-		    __PROTECT__(theView);
-		    arg = __MKSTRING(keySymString);
-		    __UNPROTECT__(theView);
+                    __PROTECT__(theView);
+                    arg = __MKSTRING(keySymString);
+                    __UNPROTECT__(theView);
 #endif
-		}
-	    }
-
-	    if (arg == nil) {
-		/* happens sometimes (alt-graph on sun has no keysym) */
-		break;
-	    }
-
-	    (*(*ipS).ilc_func)(self, symS, nil, ipS,
-			       arg, 
-			       __MKSMALLINT(ke->x), 
-			       __MKSMALLINT(ke->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);
-
-		    ipS = &bmpS;
-		    symS = @symbol(buttonMultiPress:x:y:view:);
-		    goto sendButtonEvent;
-		    break;
-		}
-	    }
-	    __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
+                }
+            }
+
+            if (arg == nil) {
+                /* happens sometimes (alt-graph on sun has no keysym) */
+                break;
+            }
+
+            (*(*ipS).ilc_func)(self, symS, nil, ipS,
+                               arg, 
+                               __MKSMALLINT(ke->x), 
+                               __MKSMALLINT(ke->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);
+
+                    ipS = &bmpS;
+                    symS = @symbol(buttonMultiPress:x:y:view:);
+                    goto sendButtonEvent;
+                    break;
+                }
+            }
+            __INST(multiClickTime) = t = __MKUINT(nextMultiClickTime); __STORE(self, t);
 
 #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);
-
-
-	    (*(*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);
+
+
+            (*(*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 = __MKOBJ(ce->above);
-		sibling = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, siblingID);
-	    }
-
-	    (*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;
-		}
-	    }
-	    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);
-	    targetID = __MKATOMOBJ(ev->xselection.target);
-	    selectionID = __MKATOMOBJ(ev->xselection.selection);
-	    requestorID = __MKOBJ(ev->xselection.requestor);
-	    (*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);
-	    targetID = __MKATOMOBJ(ev->xselectionrequest.target);
-	    selectionID = __MKATOMOBJ(ev->xselectionrequest.selection);
-	    requestorID = __MKOBJ(ev->xselectionrequest.requestor);
-	    (*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 = __MKOBJ(ce->above);
+                sibling = (*vid.ilc_func)(self, @symbol(viewFromId:), nil, &vid, siblingID);
+            }
+
+            (*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;
+                }
+            }
+            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);
+            targetID = __MKATOMOBJ(ev->xselection.target);
+            selectionID = __MKATOMOBJ(ev->xselection.selection);
+            requestorID = __MKOBJ(ev->xselection.requestor);
+            (*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);
+            targetID = __MKATOMOBJ(ev->xselectionrequest.target);
+            selectionID = __MKATOMOBJ(ev->xselectionrequest.selection);
+            requestorID = __MKOBJ(ev->xselectionrequest.requestor);
+            (*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;
     }
 #undef ae
 #undef ee
@@ -4072,18 +4076,28 @@
      we only handle exposes until the graphicsExpose arrives.
      Other systems may not need such a kludge"
 
+    |dispatch|
+
     "interested in exposes only ?"
     dispatchingExpose notNil ifTrue:[
-	[self exposeEventPendingFor:dispatchingExpose withSync:false] whileTrue:[
-	    self dispatchExposeEventFor:dispatchingExpose
-	].
-	^ self
+        [self exposeEventPendingFor:dispatchingExpose withSync:false] whileTrue:[
+            self dispatchExposeEventFor:dispatchingExpose
+        ].
+        ^ self
     ].
 
     "no, general dispatch"
+    dispatch := [self dispatchLastEvent].
+
     [self eventPendingWithSync:false] whileTrue:[
-	self dispatchEventFor:nil withMask:nil
+        (self getEventFor:nil withMask:nil) ifTrue:[
+            AbortSignal handle:[:ex |
+                ex return
+            ] do:dispatch
+        ].
     ]
+
+    "Modified: 26.3.1997 / 19:04:17 / cg"
 !
 
 disposeEventsWithMask:aMask for:aWindowIdOrNil
@@ -4282,8 +4296,6 @@
      handle method to allow unlimitedstack here.
      (some Xlibs do a big alloca there ...) which cannot be done in 
      dispatchLastEvent, since it dispatches out into ST-methods.
-     BUG: uses a static buffer - has to be rewritten, to support multiple
-     display connections.
     "
 
 %{  /* UNLIMITEDSTACK */
@@ -4295,39 +4307,39 @@
     XEvent *ev;
 
     if (! ISCONNECTED) {
-	RETURN (false);
+        RETURN (false);
     }
 
     dpy = myDpy;
 
     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);
     }
     ev->type = 0;
 
     if (__isSmallInteger(eventMask)) {
-	evMask = __intVal(eventMask);
+        evMask = __intVal(eventMask);
     } else {
-	evMask = ~0;
+        evMask = ~0;
     }
 
     if (__isExternalAddress(aViewIdOrNil)) {
-	wWanted = _WindowVal(aViewIdOrNil);
-	if (XCheckWindowEvent(dpy, wWanted, evMask, ev)) {
-	    RETURN ( true );
-	}
+        wWanted = _WindowVal(aViewIdOrNil);
+        if (XCheckWindowEvent(dpy, wWanted, evMask, ev)) {
+            RETURN ( true );
+        }
     } else {
-	if (evMask == ~0) {
-	    XNextEvent(dpy, ev);
-	    RETURN (true);
-	}
-	if (XCheckMaskEvent(dpy, evMask, ev)) {
-	   RETURN (true);
-	}
+        if (evMask == ~0) {
+            XNextEvent(dpy, ev);
+            RETURN (true);
+        }
+        if (XCheckMaskEvent(dpy, evMask, ev)) {
+           RETURN (true);
+        }
     }
 %}.
     ^ false
@@ -8592,6 +8604,6 @@
 !XWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.217 1997-03-22 16:29:50 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.218 1997-03-26 18:07:20 cg Exp $'
 ! !
 XWorkstation initialize!