--- 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!