diff -r 27862eea4474 -r 0cb3b353630f XWorkstation.st --- 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!