# HG changeset patch # User Claus Gittinger # Date 1095165034 -7200 # Node ID d28b613dfc06058f2f9e394e3b559dea98481f97 # Parent f1bdf99773bd62d54fcd72994b18535f12ac808f timeout handling changed diff -r f1bdf99773bd -r d28b613dfc06 XWorkstation.st --- a/XWorkstation.st Tue Sep 14 14:07:24 2004 +0200 +++ b/XWorkstation.st Tue Sep 14 14:30:34 2004 +0200 @@ -22,9 +22,9 @@ eventRootY displayName eventTrace dispatchingExpose rgbVisual virtualRootId rootId altModifierMask metaModifierMask multiClickTime deviceIOTimeoutErrorSignal activateOnClick - rawKeySymTranslation selectionOwner' + rawKeySymTranslation selectionOwner xlibTimeout xlibTimeoutForWindowCreation' classVariableNames:'RawKeySymTranslation ConservativeSync MaxStringLength - SelectionHandlers' + SelectionHandlers DefaultXLibTimeout DefaultXLibTimeoutForWindowCreation' poolDictionaries:'' category:'Interface-Graphics' ! @@ -194,20 +194,29 @@ int __XErrorHandler__(); int __XIOErrorHandler__(); -#define DEFAULT_XLIB_TIMEOUT 600 /* in 50ms ticks (30 seconds) */ - static __xlibTimeout__ = DEFAULT_XLIB_TIMEOUT; - -#define ENTER_XLIB() \ +/* + * these two macros should be placed around X-lib calls, + * which may block due to a broken connection. + * They setup/remove a VM-timeout which raises an exception + * after xlibTimeout seconds. + * This exception will shutDown the connection. + * Q: is this a good idea for the local display ? + */ +#define __ENTER_XLIB(whichTimeout) \ { \ __blockingPrimitiveTimoutHandler__ = (VOIDFUNC)__XTimeoutErrorHandler; \ __blockingPrimitiveTimeoutArg__ = (INT)self; \ - __blockingPrimitiveTimeout__ = __xlibTimeout__; \ + __blockingPrimitiveTimeout__ = __intVal(__INST(whichTimeout)) * 50; \ } { + #define LEAVE_XLIB() \ { \ __blockingPrimitiveTimeout__ = 0; \ } } +#define ENTER_XLIB() __ENTER_XLIB(xlibTimeout) +#define ENTER_XLIB2() __ENTER_XLIB(xlibTimeoutForWindowCreation) + #ifdef SUPPORT_MOTIF_WM_HINTS # ifdef SOME_MACHINE # include @@ -292,7 +301,7 @@ #ifndef ELF # ifdef __GNUC__ -VOLATILE +VOLATILE # endif static dummyToForceLoading() { @@ -335,7 +344,7 @@ lastMinorCode = event->minor_code; lastResource = event->resourceid; if ((event->error_code == BadWindow) && (lastRequestCode == 4) && (lastMinorCode == 0)) { - /* + /* * this is a BadWindow error for X_DestroyWindow. * ignore it here, since it results from the GC freeing windows * in non bottom-up window order. @@ -345,9 +354,9 @@ if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [error]: x-error caught maj=%d (0x%x) min=%d (0x%x) resource=%x\n", - event->request_code, event->request_code, + event->request_code, event->request_code, event->minor_code, event->minor_code, event->resourceid); - fprintf(stderr, "XWorkstation [error]: x-error message is [%d] '%s'\n", + fprintf(stderr, "XWorkstation [error]: x-error message is [%d] '%s'\n", event->error_code, lastErrorMsg); } @@ -402,17 +411,20 @@ __XTimeoutErrorHandler(displayDeviceInst) OBJ displayDeviceInst; { + extern OBJ __GLOBAL_GET_BY_NAME(); + if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [error]: I/O request timeout dpy=%x\n", displayDeviceInst); } - if (displayDeviceInst == @global(MainDisplay)) { + if ((displayDeviceInst == @global(MainDisplay)) + || (displayDeviceInst == __GLOBAL_GET_BY_NAME("Display"))) { /* cannot use global(Display), because Display is a typedef in Xlib */ fprintf(stderr, "XWorkstation [error]: keep display connection for master display (no shutdown)\n"); return; } #if 0 -This is litter: +This is litter: 1. How should I ever close the display without a displayId? 2. This may loop for ever, if there is some data in the socket, but #eventPending returns @@ -514,13 +526,28 @@ documentation " this class provides the interface to X11. It redefines all required methods - from DeviceWorkstation. Notice, that in Smalltalk/X you are not technically - limited to one display - in theory, you can create Views on many displays + from DeviceWorkstation. + Notice, that in Smalltalk/X you are not technically limited to one display; + in theory (and in our practice), you can create Views on many displays simultanously. However, the default setup is for one display only. To support multiple displays, you will have to start another event dispatcher process for the other display(s) and create the other views with a slightly - different protocol. However, 'normal' applications do not have to care for - all of this ... + different protocol (ApplicationModel openOnDevice:) or by temporarily answering + the other device to the currentScreen query. + Therefore, 'normal' applications do not have to care for all of this, as the currentScreen + query is answered by the launcher when opening its applications. + + Timeouts: + sometimes, X-connections are lost and, as the Xlib is blocking and synchronous by + default, this would lead to a locked ST/X system. + Therefore, this class defines a timeOut, whenever doing an Xlib call. + The default for this timeout is 30seconds. + This may be a problem with windowmanagers which show a rubber-band rectangle + when creating windows. + If the user does not specify the rectangle within 30 seconds, the device assumes + a timeout and closes the connection. + As a (kludgy) workaround, a second timeout value is used for window-creation. + This secondary timeout value defaults to 60*5 seconds (5 minutes). See more documentation in my superclass, DeviceWorkstation. @@ -540,9 +567,13 @@ "/ the following is an adjustable soft-limit. MaxStringLength := 4096. + "/ shutdown the X-connection, when no response is received after that many seconds. + DefaultXLibTimeout := 30. + DefaultXLibTimeoutForWindowCreation := 5*60. + RawKeySymTranslation isNil ifTrue:[ "/ the following table maps X-keyevents to ST/X - "/ device independend events. + "/ device independend events. "/ It is NOT meant as a keyboardMap replacement. RawKeySymTranslation := d := Dictionary new. @@ -587,13 +618,19 @@ ! getConnectionTimeOut -%{ - RETURN (__MKSMALLINT(__xlibTimeout__ / 50)); -%} + "returns the default connectionTimeOut (seconds)" + + ^ DefaultXLibTimeout +! + +getConnectionTimeOutForWindowCreation + "returns the default connectionTimeOut (seconds)" + + ^ DefaultXLibTimeoutForWindowCreation ! lastErrorString - "return the last X-error string - + "return the last X-error string - when buffering is on, this may be an error for a long-ago operation" @@ -634,23 +671,29 @@ resourceIdOfLastError %{ /* NOCONTEXT */ - if (lastResource != 0) { - RETURN ( __MKEXTERNALADDRESS(lastResource) ); - } + if (lastResource != 0) { + RETURN ( __MKEXTERNALADDRESS(lastResource) ); + } %}. ^ nil " - Screen resourceIdOfLastError + Screen resourceIdOfLastError " ! setConnectionTimeOut:seconds -%{ - __xlibTimeout__ = __intVal(seconds) * 50; -%} + "set the default connection timeout (seconds)" + + DefaultXLibTimeout := seconds +! + +setConnectionTimeOutForWindowCreation:seconds + "set the default connection timeout (seconds)" + + DefaultXLibTimeoutForWindowCreation := seconds ! ! !XWorkstation class methodsFor:'queries'! @@ -788,7 +831,7 @@ displayName "return the X-connections display name. - This is (currently) nil for the default display, + This is (currently) nil for the default display, something like foo:0 for any other remote display. Future versions may return non-nil strings for the default display as well." @@ -866,7 +909,7 @@ w1 = __WindowVal(windowId1); w2 = __WindowVal(windowId2); -#ifdef VIRTUAL_ROOT +#ifdef VIRTUAL_ROOT rootWin = RootWindow(dpy, screen); if (w1 == rootWin) { ENTER_XLIB(); @@ -882,7 +925,7 @@ ENTER_XLIB(); XTranslateCoordinates(dpy, w1, w2, - __intVal(x1), __intVal(y1), + __intVal(x1), __intVal(y1), &xpos, &ypos, &child_ret); LEAVE_XLIB(); @@ -938,7 +981,7 @@ XTranslateCoordinates(dpy, RootWindow(dpy, screen), __WindowVal(windowId), - __intVal(xp), __intVal(yp), + __intVal(xp), __intVal(yp), &xpos, &ypos, &child_ret); LEAVE_XLIB(); @@ -970,7 +1013,7 @@ %{ if (ISCONNECTED - && (__INST(rootId) != __INST(virtualRootId)) + && (__INST(rootId) != __INST(virtualRootId)) && __isExternalAddress(__INST(virtualRootId))) { Window vRootWin; Window root; @@ -996,6 +1039,22 @@ "return the colornumber of white" ^ whitepixel +! + +xlibTimeout + ^ xlibTimeout +! + +xlibTimeout:seconds + xlibTimeout := seconds +! + +xlibTimeoutForWindowCreation + ^ xlibTimeoutForWindowCreation +! + +xlibTimeoutForWindowCreation:seconds + xlibTimeoutForWindowCreation := seconds ! ! !XWorkstation methodsFor:'accessing-display capabilities'! @@ -1008,7 +1067,7 @@ ^ hasDPSExtension " - Display hasDPS + Display hasDPS " ! @@ -1036,14 +1095,14 @@ %} " - Display hasExtension:'XVideo' - Display hasExtension:'Input' - Display hasExtension:'GLX' - Display hasExtension:'X3D-PEX' - Display hasExtension:'XInputExtension' - Display hasExtension:'SHAPE' - Display hasExtension:'MIT-SHM' - Display hasExtension:'SGIFullScreenStereo' + Display hasExtension:'XVideo' + Display hasExtension:'Input' + Display hasExtension:'GLX' + Display hasExtension:'X3D-PEX' + Display hasExtension:'XInputExtension' + Display hasExtension:'SHAPE' + Display hasExtension:'MIT-SHM' + Display hasExtension:'SGIFullScreenStereo' " ! @@ -1055,7 +1114,7 @@ ^ hasImageExtension " - Display hasImageExtension + Display hasImageExtension " ! @@ -1067,7 +1126,7 @@ ^ hasInputExtension " - Display hasInputExtension + Display hasInputExtension " ! @@ -1079,7 +1138,7 @@ ^ hasMbufExtension " - Display hasMultibuffer + Display hasMultibuffer " ! @@ -1091,7 +1150,7 @@ ^ hasPEXExtension " - Display hasPEX + Display hasPEX " ! @@ -1103,7 +1162,7 @@ ^ hasShmExtension " - Display hasShm + Display hasShm " ! @@ -1115,7 +1174,7 @@ ^ hasXVideoExtension " - Display hasXVideo + Display hasXVideo " ! @@ -1210,8 +1269,8 @@ ! supportedImageFormats - "return an array with supported image formats; - each array entry is an attribute dictionary, consisting of + "return an array with supported image formats; + each array entry is an attribute dictionary, consisting of depth, bitsPerPixel and padding values." |nFormats "{ Class: SmallInteger }" @@ -1260,7 +1319,7 @@ ^ formatArray " - Display supportedImageFormats + Display supportedImageFormats " ! @@ -1275,14 +1334,14 @@ supportsArbitraryShapedViews "return true, if this workstation supports arbitrary shaped windows. - Both the server must support it (the shape-extension), - and the feature must have been enabled in the smalltalk system, + Both the server must support it (the shape-extension), + and the feature must have been enabled in the smalltalk system, for true to be returned." ^ hasShapeExtension " - Display supportsArbitraryShapedViews + Display supportsArbitraryShapedViews " ! @@ -1293,7 +1352,7 @@ ^ true " - Display supportsIconViews + Display supportsIconViews " "Modified: 10.6.1996 / 20:11:48 / cg" @@ -1302,7 +1361,7 @@ supportsMaskedDrawingWith:aForm "return true, if the device allows the given form pixmap - to be used as paint color. + to be used as paint color. True returned here - X has no trouble with any mask." ^ true @@ -1312,7 +1371,7 @@ supportsViewBackgroundPixmap:aForm "return true, if the device allows the given pixmap as - viewBackground. + viewBackground. True returned here - X support any size." ^ true @@ -1394,7 +1453,7 @@ -%{ +%{ int screen = __intVal(__INST(screen)); Pixmap newBitmap; @@ -1423,7 +1482,7 @@ (i.e. random). Return a bitmap id or nil" -%{ +%{ int screen = __intVal(__INST(screen)); Pixmap newBitmap; @@ -1451,7 +1510,7 @@ createWindowFor:aView type:typeSymbol origin:origin extent:extent - minExtent:minExt + minExtent:minExt maxExtent:maxExt borderWidth:bWidth subViewOf:wsuperView @@ -1464,7 +1523,7 @@ - |xpos ypos wwidth wheight minWidth minHeight maxWidth maxHeight + |xpos ypos wwidth wheight minWidth minHeight maxWidth maxHeight bColorId wsuperViewId wiconId wiconMaskId windowId weventMask wiconViewId bitGravity viewGravity vBgColor vBgForm deepForm preferredVisual preferredDepth| @@ -1525,7 +1584,7 @@ Window newWindow, parentWindow; char *windowName; XFontStruct *f; - Pixmap backPixmap = (Pixmap)0, + Pixmap backPixmap = (Pixmap)0, iconBitmap = (Pixmap)0, iconMask = (Pixmap)0; int flags = 0, depth, ioClass; @@ -1581,12 +1640,12 @@ if (wStyle == @symbol(popUp)) xswa.override_redirect = 1; - else + else xswa.override_redirect = 0; - if (winputOnly == true) + if (winputOnly == true) ioClass = InputOnly; - else + else ioClass = InputOutput; if (__isSmallInteger(weventMask)) { @@ -1625,15 +1684,15 @@ if (preferredVisual == @symbol(StaticGray)) cls = StaticGray; - else if (preferredVisual == @symbol(GrayScale)) + else if (preferredVisual == @symbol(GrayScale)) cls = GrayScale; - else if (preferredVisual == @symbol(StaticColor)) + else if (preferredVisual == @symbol(StaticColor)) cls = StaticColor; - else if (preferredVisual == @symbol(PseudoColor)) + else if (preferredVisual == @symbol(PseudoColor)) cls = PseudoColor; - else if (preferredVisual == @symbol(TrueColor)) + else if (preferredVisual == @symbol(TrueColor)) cls = TrueColor; - else if (preferredVisual == @symbol(DirectColor)) + else if (preferredVisual == @symbol(DirectColor)) cls = DirectColor; else cls = PseudoColor; @@ -1648,7 +1707,7 @@ LEAVE_XLIB(); } - ENTER_XLIB(); + ENTER_XLIB2(); newWindow = XCreateWindow(dpy, parentWindow, sizehints.x, sizehints.y, sizehints.width, sizehints.height, @@ -1832,7 +1891,7 @@ destroyGC:aGCId -%{ +%{ if (! ISCONNECTED) { RETURN ( self ); @@ -1894,7 +1953,7 @@ -%{ +%{ #ifdef XXDPS int screen = __intVal(__INST(screen)); DPSContext dps; @@ -1924,7 +1983,7 @@ gcFor:aDrawableId -%{ +%{ int screen = __intVal(__INST(screen)); GC gc; @@ -2040,7 +2099,7 @@ ENTER_XLIB(); newBitmap = XCreateBitmapFromData(dpy, RootWindow(dpy, screen), - (char *)b_bits, + (char *)b_bits, b_width, b_height); LEAVE_XLIB(); #ifdef COUNT_RESOURCES @@ -2121,7 +2180,7 @@ rootWindowId "return the id of the root window. - This is the window you see as background, + This is the window you see as background, however, it may or may not be the real physical root window, since some window managers install a virtual root window on top of the real one. If this is the case, that views id is returned here." @@ -2171,10 +2230,10 @@ unsigned long nitems, bytesafter; unsigned char *retVal = 0; - ignoreVRoot = XGetWindowProperty(dpy, rootWin, kwinAtom, + ignoreVRoot = XGetWindowProperty(dpy, rootWin, kwinAtom, 0L, 1L, False, kwinAtom, - &actual_type, &actual_format, - &nitems, &bytesafter, &retVal) == Success + &actual_type, &actual_format, + &nitems, &bytesafter, &retVal) == Success && actual_type != 0; if (retVal) XFree(retVal); @@ -2183,8 +2242,8 @@ if (!ignoreVRoot) { vRootAtom = XInternAtom(dpy, "__SWM_VROOT", True); if (vRootAtom != None) { - if (XQueryTree(dpy, rootWin, - &rootReturn, &parentReturn, + if (XQueryTree(dpy, rootWin, + &rootReturn, &parentReturn, &children, &numChildren)) { for (i=0; i < numChildren; i++) { Atom actual_type; @@ -2193,15 +2252,15 @@ Window* newRoot = (Window*) 0; if (children[i]) { - if (XGetWindowProperty(dpy, children[i], vRootAtom, + if (XGetWindowProperty(dpy, children[i], vRootAtom, 0L, 1L, False, XA_WINDOW, - &actual_type, &actual_format, + &actual_type, &actual_format, &nitems, &bytesafter, (unsigned char**) &newRoot ) == Success && newRoot) { vRootWin = *newRoot; XFree(newRoot); /* XXX */ - break; + break; } } } @@ -2268,7 +2327,7 @@ Dont use this method, colornames are mostly X specific" -%{ +%{ char *colorname; XColor scolor, ecolor; @@ -2324,7 +2383,7 @@ Status ok; int id; - if (__bothSmallInteger(r, g) + if (__bothSmallInteger(r, g) && __isSmallInteger(b) && ISCONNECTED) { ecolor.red = __intVal(r); @@ -2363,8 +2422,8 @@ ^ (100.0 * aDeviceValue / 16rFFFF) " - Display deviceColorValueToPercent:0 - Display deviceColorValueToPercent:16r8000 + Display deviceColorValueToPercent:0 + Display deviceColorValueToPercent:16r8000 Display deviceColorValueToPercent:16rFFFF " ! @@ -2429,7 +2488,7 @@ LEAVE_XLIB(); - /* + /* * have to compensate for an error in X ?, which does not scale * colors correctly if lesser than 16bits are valid in a color, * (for example, color white on a 4bitsPerRGB server will Return @@ -2463,11 +2522,11 @@ && __isNonNilObject(colorName) && (__qIsString(colorName) || __qIsSymbol(colorName))) { Display *dpy = myDpy; - - - if (XParseColor(dpy, DefaultColormap(dpy, screen), + + + if (XParseColor(dpy, DefaultColormap(dpy, screen), (char *) __stringVal(colorName), &color)) { - /* + /* * have to compensate for an error in X ?, which does not scale * colors correctly if lesser than 16bits are valid in a color, * (for example, color white on a 4bitsPerRGB server will Return @@ -2548,7 +2607,7 @@ This method is a noop for StaticGrey, StaticGrey and TrueColor displays." -%{ +%{ char *colorname; XColor color; @@ -2604,26 +2663,26 @@ #upRightHand "/ XC_hand1 #upDownArrow "/ XC_sb_v_double_arrow #leftRightArrow "/ XC_sb_h_double_arrow - #upLimitArrow "/ XC_top_side - #downLimitArrow "/ XC_bottom_side + #upLimitArrow "/ XC_top_side + #downLimitArrow "/ XC_bottom_side #leftLimitArrow "/ XC_left_side #rightLimitArrow "/ XC_right_side - #text "/ XC_xterm + #text "/ XC_xterm #upRightArrow "/ XC_draft_large - #leftHand "/ XC_hand2 + #leftHand "/ XC_hand2 #questionMark "/ XC_question_arrow - #cross "/ XC_X_cursor - #wait "/ XC_watch - #crossHair "/ XC_tcross + #cross "/ XC_X_cursor + #wait "/ XC_watch + #crossHair "/ XC_tcross #origin "/ XC_ul_angle - #topLeft "/ XC_ul_angle + #topLeft "/ XC_ul_angle #corner "/ XC_lr_angle - #bottomRight "/ XC_lr_angle - #topRight "/ XC_ur_angle - #bottomLeft "/ XC_ll_angle - #square "/ XC_dotbox - #fourWay "/ XC_fleur - #crossCursor "/ XC_X_cursor + #bottomRight "/ XC_lr_angle + #topRight "/ XC_ur_angle + #bottomLeft "/ XC_ll_angle + #square "/ XC_dotbox + #fourWay "/ XC_fleur + #crossCursor "/ XC_X_cursor ) "Created: 8.4.1997 / 10:12:30 / cg" @@ -2649,7 +2708,7 @@ if (ISCONNECTED && __isExternalAddress(aCursorId) && __bothSmallInteger(fgG, fgB) - && __bothSmallInteger(bgR, bgG) + && __bothSmallInteger(bgR, bgG) && __bothSmallInteger(bgB, fgR)) { fgcolor.red = __intVal(fgR); @@ -2685,9 +2744,9 @@ "create a cursor given 2 bitmaps (source, mask) and a hotspot" ^ self - primCreateCursorSourceFormId:sourceForm id + primCreateCursorSourceFormId:sourceForm id maskFormId:maskForm id - hotX:hx hotY:hy + hotX:hx hotY:hy width:w height:h ! @@ -2945,14 +3004,14 @@ self setProperty:(self atomIDOf:#DndSelection) - type:(self atomIDOf:#STRING) - value:val + type:(self atomIDOf:#STRING) + value:val for:rootId. ^ self - sendClientEvent:msgType - format:32 - to:destinationId + sendClientEvent:msgType + format:32 + to:destinationId data1:dropTypeCode data2:0 data3:destinationId @@ -2969,7 +3028,7 @@ dndDropTypes "return the dropTypes as supported by DND" - ^ #( + ^ #( DndUnknown "/ 0 DndRawData "/ 1 DndFile "/ 2 @@ -2993,10 +3052,10 @@ "/ (self atomIDOf:#DndProtocol) notNil ifTrue:[ ^ self - dndDrop:aCollectionOfDropObjects - inWindowID:destinationId - position:destinationPoint - rootPosition:rootPoint + dndDrop:aCollectionOfDropObjects + inWindowID:destinationId + position:destinationPoint + rootPosition:rootPoint ]. "/ add more drag&drop protocols here. @@ -3059,7 +3118,7 @@ This is basically the same as copyFromId:..., but does not generate expose events." -%{ +%{ GC gc; Drawable source, dest; @@ -3094,14 +3153,14 @@ ! copyPlaneFromId:sourceId x:srcX y:srcY gc:srcGCId to:destId x:dstX y:dstY gc:dstGCId width:w height:h - "do a bit-blt, but only copy the low-bit plane; + "do a bit-blt, but only copy the low-bit plane; copy bits from the rectangle defined by srcX/srcY and w/h from the sourceId drawable to the rectangle below dstX/dstY in the destId drawable. Trigger an error if any argument is not integer." -%{ +%{ GC gc; Drawable source, dest; @@ -3132,7 +3191,7 @@ ! copyPlaneFromPixmapId:sourceId x:srcX y:srcY gc:srcGCId to:destId x:dstX y:dstY gc:dstGCId width:w height:h - "do a bit-blt from a pix- or bitmap, but only copy the low-bit plane; + "do a bit-blt from a pix- or bitmap, but only copy the low-bit plane; copy bits from the rectangle defined by srcX/srcY and w/h from the sourceId drawable to the rectangle below dstX/dstY in the destId drawable. Trigger an error if any @@ -3140,7 +3199,7 @@ This is the same as copyPlaneFromId:..., but does not generate graphics exposes" -%{ +%{ GC gc; Drawable source, dest; @@ -3179,7 +3238,7 @@ The angles may be floats or integer - they are given in degrees." -%{ +%{ GC gc; Window win; @@ -3235,7 +3294,7 @@ ! displayLineFromX:x0 y:y0 toX:x1 y:y1 in:aDrawableId with:aGCId - "draw a line. If the coordinates are not integers, an error is triggered." + "draw a line. If the coordinates are not integers, an error is triggered." %{ @@ -3313,11 +3372,11 @@ gc = __GCVal(aGCId); win = __WindowVal(aDrawableId); - if( __isSmallInteger(scaleY) ) + if( __isSmallInteger(scaleY) ) sY = (float) __intVal( scaleY ); - else if (__isFloat(scaleY)) + else if (__isFloat(scaleY)) sY = __floatVal( scaleY ); - else if (__isShortFloat(scaleY)) + else if (__isShortFloat(scaleY)) sY = __shortFloatVal( scaleY ); else { t = __SSEND0(scaleY, @symbol(asFloat), 0); @@ -3325,11 +3384,11 @@ sY = __floatVal( t ); } - if( __isSmallInteger(transY) ) + if( __isSmallInteger(transY) ) tY = (float) __intVal( transY ); - else if (__isFloat(transY)) + else if (__isFloat(transY)) tY = __floatVal( transY ); - else if (__isShortFloat(transY)) + else if (__isShortFloat(transY)) tY = __shortFloatVal( transY ); else { t = __SSEND0(transY, @symbol(asFloat), 0); @@ -3337,11 +3396,11 @@ tY = __floatVal( t ); } - if( __isSmallInteger(startX) ) + if( __isSmallInteger(startX) ) x = (float) __intVal( startX ); - else if (__isFloat(startX)) + else if (__isFloat(startX)) x = __floatVal( startX ); - else if (__isShortFloat(startX)) + else if (__isShortFloat(startX)) x = __shortFloatVal( startX ); else { t = __SSEND0(startX, @symbol(asFloat), 0); @@ -3349,11 +3408,11 @@ x = __floatVal( t ); } - if( __isSmallInteger(stepX) ) + if( __isSmallInteger(stepX) ) step = (float) __intVal( stepX ); - else if (__isFloat(stepX)) + else if (__isFloat(stepX)) step = __floatVal( stepX ); - else if (__isShortFloat(stepX)) + else if (__isShortFloat(stepX)) step = __shortFloatVal( stepX ); else { t = __SSEND0(stepX, @symbol(asFloat), 0); @@ -3421,10 +3480,10 @@ ! displayPointX:x y:y in:aDrawableId with:aGCId - "draw a point. If x/y are not integers, an error is triggered." - - -%{ + "draw a point. If x/y are not integers, an error is triggered." + + +%{ GC gc; Window win; @@ -3532,10 +3591,10 @@ ! displayRectangleX:x y:y width:width height:height in:aDrawableId with:aGCId - "draw a rectangle. If the coordinates are not integers, an error is triggered." - - -%{ + "draw a rectangle. If the coordinates are not integers, an error is triggered." + + +%{ GC gc; Window win; @@ -3577,13 +3636,13 @@ self primitiveFailedOrClosedConnection ! -displayString:aString from:index1 to:index2 x:x y:y in:aDrawableId with:aGCId opaque:opaque +displayString:aString from:index1 to:index2 x:x y:y in:aDrawableId with:aGCId opaque:opaque "draw a sub-string - if opaque is false, draw foreground only; otherwise, draw both foreground and background characters. If the coordinates are not integers, an error is triggered." -%{ +%{ GC gc; Window win; @@ -3677,7 +3736,7 @@ * convert as required */ u.s = 0x1234; - if (u.b[0] != 0x12) + if (u.b[0] != 0x12) # endif { if (l <= NLOCALBUFFER) { @@ -3693,12 +3752,12 @@ cp = (char *) cp2; } #endif - ENTER_XLIB(); + ENTER_XLIB(); if (opaque == true) XDrawImageString16(dpy, win, gc, __intVal(x), __intVal(y), (XChar2b *)cp, l); else XDrawString16(dpy, win, gc, __intVal(x), __intVal(y), (XChar2b *)cp, l); - LEAVE_XLIB(); + LEAVE_XLIB(); if (mustFree) { free(cp2); @@ -3744,12 +3803,12 @@ } cp = (char *) cp2; - ENTER_XLIB(); + ENTER_XLIB(); if (opaque == true) XDrawImageString16(dpy, win, gc, __intVal(x), __intVal(y), (XChar2b *)cp, l); else XDrawString16(dpy, win, gc, __intVal(x), __intVal(y), (XChar2b *)cp, l); - LEAVE_XLIB(); + LEAVE_XLIB(); if (mustFree) { free(cp2); @@ -3772,13 +3831,13 @@ self primitiveFailedOrClosedConnection ! -displayString:aString x:x y:y in:aDrawableId with:aGCId opaque:opaque +displayString:aString x:x y:y in:aDrawableId with:aGCId opaque:opaque "draw a string - if opaque is false, draw foreground only; otherwise, draw both foreground and background characters. If the coordinates are not integers, an error is triggered." -%{ +%{ GC gc; Window win; @@ -3855,7 +3914,7 @@ * convert as required */ u.s = 0x1234; - if (u.b[0] != 0x12) + if (u.b[0] != 0x12) # endif { if (n <= NLOCALBUFFER) { @@ -3889,15 +3948,15 @@ } #undef NLOCALBUFFER %}. - ^ super displayString:aString x:x y:y in:aDrawableId with:aGCId opaque:opaque + ^ super displayString:aString x:x y:y in:aDrawableId with:aGCId opaque:opaque ! drawBits:givenBits bitsPerPixel:bitsPerPixel depth:imageDepth padding:givenPadding - width:imageWidth height:imageHeight + width:imageWidth height:imageHeight x:srcx y:srcy - into:aDrawableId - x:dstx y:dsty - width:w height:h + into:aDrawableId + x:dstx y:dsty + width:w height:h with:aGCId "draw a bitImage which has depth id, width iw and height ih into @@ -3927,9 +3986,9 @@ ]. wantedPadding := fmt at:#padding. wantedPadding > givenPadding ifTrue:[ - bits := self - repadBits:givenBits - width:imageWidth + bits := self + repadBits:givenBits + width:imageWidth height:imageHeight depth:imageDepth from:givenPadding @@ -3942,21 +4001,21 @@ sorry; I had to separate it into 2 methods, since XPutImage needs an unlimited stack, and thus cannot send primitiveFailed " - (self - primDrawBits:bits - bitsPerPixel:bitsPerPixel - depth:imageDepth - msb:true + (self + primDrawBits:bits + bitsPerPixel:bitsPerPixel + depth:imageDepth + msb:true padding:padding - width:imageWidth height:imageHeight + width:imageWidth height:imageHeight x:srcx y:srcy - into:aDrawableId - x:dstx y:dsty - width:w height:h + into:aDrawableId + x:dstx y:dsty + width:w height:h with:aGCId) ifFalse:[ " - also happens, if a segmentation violation occurs in the + also happens, if a segmentation violation occurs in the XPutImage ... " self primitiveFailedOrClosedConnection @@ -3969,7 +4028,7 @@ The angles may be floats or integer - they are given in degrees." -%{ +%{ GC gc; Window win; @@ -4025,7 +4084,7 @@ ! fillPolygon:aPolygon in:aDrawableId with:aGCId - "fill a polygon given by its points. + "fill a polygon given by its points. If any coordinate is not integer, an error is triggered." @@ -4091,7 +4150,7 @@ "fill a rectangle. If any coordinate is not integer, an error is triggered." -%{ +%{ int w, h; @@ -4121,8 +4180,8 @@ primDrawBits:imageBits bitsPerPixel:bitsPerPixel depth:imageDepth msb:msb masks:maskArray padding:bitPadding extent:imageExtent sourceOrigin:srcOrg - into:aDrawableId - destinationOrigin:dstOrg extent:dstExtent + into:aDrawableId + destinationOrigin:dstOrg extent:dstExtent with:aGCId @@ -4141,7 +4200,7 @@ w := dstExtent x. h := dstExtent y. - "since XPutImage may allocate huge amount of stack space + "since XPutImage may allocate huge amount of stack space (some implementations use alloca), this must run with unlimited stack." %{ /* UNLIMITEDSTACK */ @@ -4172,7 +4231,7 @@ gc = __GCVal(aGCId); win = __WindowVal(aDrawableId); - if (! gc || !win) + if (! gc || !win) goto fail; #ifdef ARGDEBUG printf("args ok\n"); @@ -4242,16 +4301,16 @@ ! primDrawBits:imageBits bitsPerPixel:bitsPerPixel depth:imageDepth msb:msb padding:bitPadding - width:imageWidth height:imageHeight + width:imageWidth height:imageHeight x:srcx y:srcy - into:aDrawableId - x:dstx y:dsty - width:w height:h + into:aDrawableId + x:dstx y:dsty + width:w height:h with:aGCId - "since XPutImage may allocate huge amount of stack space + "since XPutImage may allocate huge amount of stack space (some implementations use alloca), this must run with unlimited stack." %{ /* UNLIMITEDSTACK */ @@ -4280,7 +4339,7 @@ gc = __GCVal(aGCId); win = __WindowVal(aDrawableId); - if (! gc || !win) + if (! gc || !win) goto fail; #ifdef ARGDEBUG printf("args ok\n"); @@ -4487,7 +4546,7 @@ "/ see def's in DragAndDropTypes.h dropType := (self dndDropTypes) at:dropType+1 ifAbsent:#DndNotDnd. - self + self getProperty:(self atomIDOf:#DndSelection) from:rootId delete:false @@ -4570,7 +4629,7 @@ dropType := #rawData. ] ifFalse:[ 'XWorkstation [info]: unsupported dropType: ' infoPrint. dropType infoPrintCR. - 'XWorkstation [info]: data: ' infoPrint. dropValue infoPrintCR. + 'XWorkstation [info]: data: ' infoPrint. dropValue infoPrintCR. dropValue := dropValue. dropType := #unknown. @@ -4630,7 +4689,7 @@ key isNil ifTrue:[ "/ happens sometimes on some systems - "/ (alt-graph on sun has no keysym) + "/ (alt-graph on sun has no keysym) ^ self ]. eventRootX := rX. @@ -4650,7 +4709,7 @@ key isNil ifTrue:[ "/ happens sometimes on some systems - "/ (alt-graph on sun has no keysym) + "/ (alt-graph on sun has no keysym) ^ self ]. eventRootX := rX. @@ -4734,7 +4793,7 @@ |clipBoardContents| "/ Transcript show:'seletionNotify selID:'. -"/ Transcript show:selectionID; show:' ('; show:(self atomName:selectionID); show:') '. +"/ Transcript show:selectionID; show:' ('; show:(self atomName:selectionID); show:') '. "/ Transcript show:' targetID:'. "/ Transcript show:targetID; show:' ('; show:(self atomName:targetID); show:') '. "/ Transcript show:' propertyID:'. @@ -4762,9 +4821,9 @@ "/ ('XWorkstation: unsupported selection target ', (self atomName:targetID)) errorPrintCR. "sending property None tells client, that i cannot convert" - self - sendSelectionNotifySelection:selectionID - property:nil + self + sendSelectionNotifySelection:selectionID + property:nil target:targetID time:time "/ from:aView id BAD: nobody understands this @@ -4779,13 +4838,13 @@ targetIdOut := self atomIDOf:#STRING. ]. - self sendSelection:selection - selection:selectionID - property:propertyID - target:targetIdOut - time:time + self sendSelection:selection + selection:selectionID + property:propertyID + target:targetIdOut + time:time "/ from:aView id BAD: nobody understands this - from:requestorID + from:requestorID to:requestorID. ! @@ -4911,7 +4970,7 @@ otherwise only events for the view with given id are processed. If the argument aMask is nonNil, only events for this eventMask are handled. - WARNING: this may block to wait for an event - you better check for a + WARNING: this may block to wait for an event - you better check for a pending event before calling this." |eventArray| @@ -4933,7 +4992,7 @@ "get next expose event and send appropriate message to the sensor or view. If the argument aViewIdOrNil is nil, events for any view are processed, otherwise only events for the view with given id are processed. - WARNING: this may block to wait for an event - you better check for a + WARNING: this may block to wait for an event - you better check for a pending event before calling this." self dispatchEventFor:aViewIdOrNil withMask:(self eventMaskFor:#expose) @@ -4992,7 +5051,7 @@ disposeEventsWithMask:aMask for:aWindowIdOrNil "dispose (throw away) specific events. If aWindowId is nil, events matching the mask are thrown away regardless of which - view they are for. Otherwise, only matching events for that + view they are for. Otherwise, only matching events for that view are flushed." @@ -5047,7 +5106,7 @@ ! eventPending - "return true, if any event is pending. + "return true, if any event is pending. This looks for both the internal queue and the display connection." "/ ConservativeSync is required for some Xlib implementation, @@ -5105,7 +5164,7 @@ ! eventPendingWithSync:doSync - "return true, if any event is pending. + "return true, if any event is pending. If doSync is true, do a sync output buffer (i.e. send all to the display and wait until its processed) before checking." @@ -5203,8 +5262,8 @@ ! getEventFor:aViewIdOrNil withMask:eventMask into:anEventArray - "read next event if there is one and put events data into anEventArray. - If aViewIdOrNil is nil, events for any view are fetched; + "read next event if there is one and put events data into anEventArray. + If aViewIdOrNil is nil, events for any view are fetched; otherwise only events for that specific view will be fetched. Returns true, if there was an event, false otherwise. This method may block - so you better check for pending events @@ -5220,7 +5279,7 @@ Sorry I had to split dispatch into this fetch method and a separate handler method to allow UNLIMITEDSTACK here. - (some Xlibs do a big alloca there which cannot be done in + (some Xlibs do a big alloca there which cannot be done in #dispatchEvent:, since it dispatches out into ST-methods). " @@ -5232,7 +5291,7 @@ XEvent ev; OBJ eB; KeySym keySym; - unsigned char buffer[10]; + unsigned char buffer[10]; int i, nchars; char *keySymString; char keySymStringBuffer[32]; @@ -5328,7 +5387,7 @@ keyPressAndRelease: arg = nil; nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL); - if (nchars + if (nchars && (((buffer[0] >= ' ') && (buffer[0] <= '~')) || (buffer[0] >= 0x80))) { arg = __MKCHARACTER(buffer[0])/* *_CharacterTable[buffer[0]] */; @@ -5576,7 +5635,7 @@ case SelectionClear: __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionClear:atom:time:); - __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(sce->selection); + __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(sce->selection); __ArrayInstPtr(anEventArray)->a_element[4] = t = __MKUINT(sce->time); __STORE(anEventArray, t); break; @@ -5586,9 +5645,9 @@ */ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionRequest:requestor:selection:target:property:time:); __ArrayInstPtr(anEventArray)->a_element[3] = t = __MKEXTERNALADDRESS(ev.xselectionrequest.requestor); __STORE(anEventArray, t); - __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselectionrequest.selection); - __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselectionrequest.target); - __ArrayInstPtr(anEventArray)->a_element[6] = __MKATOMOBJ(ev.xselectionrequest.property); + __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselectionrequest.selection); + __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselectionrequest.target); + __ArrayInstPtr(anEventArray)->a_element[6] = __MKATOMOBJ(ev.xselectionrequest.property); __ArrayInstPtr(anEventArray)->a_element[7] = t = __MKUINT(ev.xselectionrequest.time); __STORE(anEventArray, t); break; @@ -5597,9 +5656,9 @@ * returned selection value (answer from SelectionRequest) */ __ArrayInstPtr(anEventArray)->a_element[2] = @symbol(selectionNotify:selection:target:property:requestor:time:); - __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xselection.selection); - __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselection.target); - __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselection.property); + __ArrayInstPtr(anEventArray)->a_element[3] = __MKATOMOBJ(ev.xselection.selection); + __ArrayInstPtr(anEventArray)->a_element[4] = __MKATOMOBJ(ev.xselection.target); + __ArrayInstPtr(anEventArray)->a_element[5] = __MKATOMOBJ(ev.xselection.property); __ArrayInstPtr(anEventArray)->a_element[6] = t = __MKEXTERNALADDRESS(ev.xselection.requestor); __STORE(anEventArray, t); __ArrayInstPtr(anEventArray)->a_element[7] = t = __MKUINT(ev.xselection.time); __STORE(anEventArray, t); break; @@ -5713,7 +5772,7 @@ is the bitwise or of the eventMask bits (see 'eventMaskFor:')" -%{ +%{ int mask; @@ -5797,7 +5856,7 @@ "/ XSendEvent(dpy,DispatchWindow,True,NoEventMask,&Event); -%{ +%{ int type; int state; @@ -5892,7 +5951,7 @@ (not very user friendly)" -%{ +%{ int type; int state; @@ -6039,7 +6098,7 @@ "extract family, face, style and size from an X-font name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - -brand-family-face-style-moreStyle- -height-size-resX-resY-??-??-registry-encoding; + -brand-family-face-style-moreStyle- -height-size-resX-resY-??-??-registry-encoding; evaluate aBlock with these" |family face style moreStyle fheight size @@ -6103,7 +6162,7 @@ ^ self extractEncodingFromRegistry:reg encoding:enc charSetCollections:coll " - Screen current encodingOf:Screen current getDefaultFont + Screen current encodingOf:Screen current getDefaultFont " ! @@ -6125,7 +6184,7 @@ (encoding size ~~ 0) ifTrue:[ enc := encoding asLowercase asSymbol ] ifFalse:[ - charSets := charSetCollections. + charSets := charSetCollections. (charSets notNil and:[charSets notEmpty]) ifTrue:[ charSets := charSets asUppercase asCollectionOfWords. (charSets includes:'ISO8859-1') ifTrue:[ @@ -6143,7 +6202,7 @@ ] ] ] - ] + ] ] ]. ^ enc @@ -6171,7 +6230,7 @@ "extract family, face, style and size from an X-font name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - -brand-family-face-style-moreStyle- -height-size-resX-resY-??-??-registry-encoding; + -brand-family-face-style-moreStyle- -height-size-resX-resY-??-??-registry-encoding; evaluate aBlock with these" |family face style moreStyle fheight size @@ -6233,7 +6292,7 @@ " ! -fontMetricsOf:fontId +fontMetricsOf:fontId "return a fonts metrics info object" @@ -6251,10 +6310,10 @@ if (f) { minCode = __MKUINT((f->min_byte1<<8) + f->min_char_or_byte2); maxCode = __MKUINT((f->max_byte1<<8) + f->max_char_or_byte2); - + if (f->direction == FontLeftToRight) { dir = @symbol(LeftToRight); - } else if (f->direction == FontRightToLeft) { + } else if (f->direction == FontRightToLeft) { dir = @symbol(RightToLeft); } avgDescent = __MKSMALLINT(f->descent); @@ -6318,8 +6377,8 @@ ^ propertyNames collect:[:propName | props at:propName ifAbsent:nil]. " - Screen current - fontProperties:#(#'PIXEL_SIZE' #'POINT_SIZE' #'RESOLUTION' notExistant) + Screen current + fontProperties:#(#'PIXEL_SIZE' #'POINT_SIZE' #'RESOLUTION' notExistant) of:Screen current getDefaultFont " ! @@ -6334,7 +6393,7 @@ |propsArray result| -%{ +%{ XFontStruct *f; XFontProp *prop; int n, i; @@ -6367,7 +6426,7 @@ (Screen current fontPropertiesOf:Screen current getDefaultFont) pairWiseDo:[:name :value| d at:((Screen current atomName:name) ? name) put:value ]. - d + d " ! @@ -6418,7 +6477,7 @@ ^ nil. " - Screen current fullFontNameOf:(Screen current getDefaultFont) + Screen current fullFontNameOf:(Screen current getDefaultFont) " ! @@ -6494,7 +6553,7 @@ as family and the other parameters as nil. For example, the cursor font can be aquired that way." - |styleString theName theId xlatedStyle + |styleString theName theId xlatedStyle id spacing encodingMatch idx roundedSize| styleString := styleArgString. @@ -6527,7 +6586,7 @@ "/ in style (styleString notNil - and:[(styleString endsWith:'-narrow') + and:[(styleString endsWith:'-narrow') or:[styleString endsWith:'-semicondensed']]) ifTrue:[ |i| i := styleString lastIndexOf:$-. @@ -6553,14 +6612,14 @@ ]. ]. - id := self + id := self getFontWithFoundry:'*' family:familyString asLowercase weight:faceString slant:xlatedStyle spacing:spacing pixelSize:nil - size:roundedSize + size:roundedSize encoding:encodingMatch. id isNil ifTrue:[ @@ -6568,24 +6627,24 @@ "/ too stupid: registries come in both cases "/ and X does not ignore case "/ - id := self + id := self getFontWithFoundry:'*' family:familyString asLowercase weight:faceString slant:xlatedStyle spacing:spacing pixelSize:nil - size:roundedSize + size:roundedSize encoding:encodingMatch asUppercase. id isNil ifTrue:[ - id := self + id := self getFontWithFoundry:'*' family:familyString asLowercase weight:faceString slant:xlatedStyle spacing:spacing pixelSize:nil - size:roundedSize + size:roundedSize encoding:encodingMatch asLowercase. ] ] @@ -6597,7 +6656,7 @@ ! getFontWithFoundry:foundry family:family weight:weight - slant:slant spacing:spc pixelSize:pSize size:size + slant:slant spacing:spc pixelSize:pSize size:size encoding:encoding "get the specified font, if not available, return nil. @@ -6615,7 +6674,7 @@ encoding: iso8859-*, iso8859-1, iso10646-1 ... '*' " - |theName sizeMatch + |theName sizeMatch foundryMatch familyMatch weightMatch slantMatch spcMatch pSizeMatch encodingMatch| @@ -6672,7 +6731,7 @@ theName := ('-' , foundryMatch, '-' , familyMatch, '-' , weightMatch , - '-' , slantMatch , + '-' , slantMatch , '-' , spcMatch , '-*' , '-' , pSizeMatch , @@ -6683,10 +6742,10 @@ "/ Transcript showCR:theName; endEntry. ^ self createFontFor:theName. - - - " - Display + + + " + Display getFontWithFoundry:'*' family:'courier' weight:'medium' @@ -6734,7 +6793,7 @@ releaseFont:aFontId -%{ +%{ XFontStruct *f; @@ -6799,166 +6858,166 @@ XCharStruct overAllReturn; if (ISCONNECTED) { - if (__bothSmallInteger(index1, index2) - && __isExternalAddress(aFontId) - && __isNonNilObject(aString)) { - int lMax = __intVal(@global(MaxStringLength)); - f = __FontVal(aFontId); - if (! f) goto fail; - - i1 = __intVal(index1) - 1; - cls = __qClass(aString); - - if (i1 >= 0) { - i2 = __intVal(index2) - 1; - if (i2 < i1) { - RETURN ( __MKSMALLINT(0) ); - } - - cp = (char *) __stringVal(aString); - l = i2 - i1 + 1; - - if ((cls == @global(String)) || (cls == @global(Symbol))) { - n = __stringSize(aString); - if (i2 < n) { - cp += i1; + if (__bothSmallInteger(index1, index2) + && __isExternalAddress(aFontId) + && __isNonNilObject(aString)) { + int lMax = __intVal(@global(MaxStringLength)); + f = __FontVal(aFontId); + if (! f) goto fail; + + i1 = __intVal(index1) - 1; + cls = __qClass(aString); + + if (i1 >= 0) { + i2 = __intVal(index2) - 1; + if (i2 < i1) { + RETURN ( __MKSMALLINT(0) ); + } + + cp = (char *) __stringVal(aString); + l = i2 - i1 + 1; + + if ((cls == @global(String)) || (cls == @global(Symbol))) { + n = __stringSize(aString); + if (i2 < n) { + cp += i1; #if 0 - ENTER_XLIB(); - len = XQueryTextExtents(myDpy, f->fid, cp, l, - &directionReturn, &fontAscentReturn, &fontDescentReturn, - &overAllReturn); - LEAVE_XLIB(); - printf("lBear:%d rBear:%d width:%d\n", overAllReturn.lbearing, overAllReturn.rbearing, overAllReturn.width); -#endif - ENTER_XLIB(); - len = XTextWidth(f, cp, l); - LEAVE_XLIB(); - - RETURN ( __MKSMALLINT(len) ); - } - } - - nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); - cp += nInstBytes; - - if (__isBytes(aString)) { - n = __byteArraySize(aString) - nInstBytes; - if (i2 < n) { - cp += i1; - - ENTER_XLIB(); - len = XTextWidth(f, cp, l); - LEAVE_XLIB(); - - RETURN ( __MKSMALLINT(len) ); - } - } - - /* TWOBYTESTRINGS */ - if (__isWords(aString)) { - n = (__byteArraySize(aString) - nInstBytes) / 2; - - if (i2 < n) { - union { - char b[2]; - unsigned short s; - } u; - int i; - XChar2b *cp2 = (XChar2b *)0; - int mustFree = 0; - - cp += (i1 * 2); - if (l > lMax) l = lMax; - - /* - * ST/X TwoByteStrings store the asciiValue in native byteOrder; - * X expects them MSB first - * convert as required - */ - - u.s = 0x1234; - if (u.b[0] != 0x12) { - if (l <= NLOCALBUFFER) { - cp2 = xlatebuffer; - } else { - cp2 = (XChar2b *)(malloc(l * 2)); - mustFree = 1; - } - for (i=0; i lMax) l = lMax; - - /* - * For now: X does not support 32bit characters without the new 32Unicode extensions. - * For now, treat chars above 0xFFFF as 0xFFFF (should we use default-char ?). - */ - if (l <= NLOCALBUFFER) { - cp2 = xlatebuffer; - } else { - cp2 = (XChar2b *)(malloc(l * 2)); - mustFree = 1; - } - for (i=0; i 0xFFFF) { - codePoint = 0xFFFF; - } - cp2[i].byte1 = codePoint & 0xFF; - cp2[i].byte2 = (codePoint >> 8) & 0xFF;; - } - cp = (char *) cp2; - - ENTER_XLIB(); - len = XTextWidth16(f, (XChar2b *)cp, l); - LEAVE_XLIB(); - - - if (mustFree) { - free(cp2); - } - - RETURN ( __MKSMALLINT(len) ); - } - } - } - } + ENTER_XLIB(); + len = XQueryTextExtents(myDpy, f->fid, cp, l, + &directionReturn, &fontAscentReturn, &fontDescentReturn, + &overAllReturn); + LEAVE_XLIB(); + printf("lBear:%d rBear:%d width:%d\n", overAllReturn.lbearing, overAllReturn.rbearing, overAllReturn.width); +#endif + ENTER_XLIB(); + len = XTextWidth(f, cp, l); + LEAVE_XLIB(); + + RETURN ( __MKSMALLINT(len) ); + } + } + + nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); + cp += nInstBytes; + + if (__isBytes(aString)) { + n = __byteArraySize(aString) - nInstBytes; + if (i2 < n) { + cp += i1; + + ENTER_XLIB(); + len = XTextWidth(f, cp, l); + LEAVE_XLIB(); + + RETURN ( __MKSMALLINT(len) ); + } + } + + /* TWOBYTESTRINGS */ + if (__isWords(aString)) { + n = (__byteArraySize(aString) - nInstBytes) / 2; + + if (i2 < n) { + union { + char b[2]; + unsigned short s; + } u; + int i; + XChar2b *cp2 = (XChar2b *)0; + int mustFree = 0; + + cp += (i1 * 2); + if (l > lMax) l = lMax; + + /* + * ST/X TwoByteStrings store the asciiValue in native byteOrder; + * X expects them MSB first + * convert as required + */ + + u.s = 0x1234; + if (u.b[0] != 0x12) { + if (l <= NLOCALBUFFER) { + cp2 = xlatebuffer; + } else { + cp2 = (XChar2b *)(malloc(l * 2)); + mustFree = 1; + } + for (i=0; i lMax) l = lMax; + + /* + * For now: X does not support 32bit characters without the new 32Unicode extensions. + * For now, treat chars above 0xFFFF as 0xFFFF (should we use default-char ?). + */ + if (l <= NLOCALBUFFER) { + cp2 = xlatebuffer; + } else { + cp2 = (XChar2b *)(malloc(l * 2)); + mustFree = 1; + } + for (i=0; i 0xFFFF) { + codePoint = 0xFFFF; + } + cp2[i].byte1 = codePoint & 0xFF; + cp2[i].byte2 = (codePoint >> 8) & 0xFF;; + } + cp = (char *) cp2; + + ENTER_XLIB(); + len = XTextWidth16(f, (XChar2b *)cp, l); + LEAVE_XLIB(); + + + if (mustFree) { + free(cp2); + } + + RETURN ( __MKSMALLINT(len) ); + } + } + } + } } #undef NLOCALBUFFER fail: ; @@ -6983,97 +7042,97 @@ XCharStruct overAllReturn; if (ISCONNECTED) { - if (__isExternalAddress(aFontId) - && __isNonNilObject(aString)) { - int lMax = __intVal(@global(MaxStringLength)); - f = __FontVal(aFontId); - if (! f) goto fail; - - cls = __qClass(aString); - - cp = (char *) __stringVal(aString); - - if ((cls == @global(String)) || (cls == @global(Symbol))) { - n = __stringSize(aString); + if (__isExternalAddress(aFontId) + && __isNonNilObject(aString)) { + int lMax = __intVal(@global(MaxStringLength)); + f = __FontVal(aFontId); + if (! f) goto fail; + + cls = __qClass(aString); + + cp = (char *) __stringVal(aString); + + if ((cls == @global(String)) || (cls == @global(Symbol))) { + n = __stringSize(aString); #if 0 - ENTER_XLIB(); - len = XQueryTextExtents(myDpy, f->fid, cp, n, - &directionReturn, &fontAscentReturn, &fontDescentReturn, - &overAllReturn); - LEAVE_XLIB(); - printf("lBear:%d rBear:%d width:%d\n", overAllReturn.lbearing, overAllReturn.rbearing, overAllReturn.width); -#endif - - ENTER_XLIB(); - len = XTextWidth(f, cp, n); - LEAVE_XLIB(); - - RETURN ( __MKSMALLINT(len) ); - } - - nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); - cp += nInstBytes; - - if (__isBytes(aString)) { - n = __byteArraySize(aString) - nInstBytes; - - - ENTER_XLIB(); - len = XTextWidth(f, cp, n); - LEAVE_XLIB(); - - RETURN ( __MKSMALLINT(len) ); - } - - /* TWOBYTESTRINGS */ - if (__isWords(aString)) { - union { - char b[2]; - unsigned short s; - } u; - int i; - XChar2b *cp2; - int mustFree = 0; - - n = (__byteArraySize(aString) - nInstBytes) / 2; - if (n > lMax) n = lMax; - - /* - * ST/X TwoByteStrings store the asciiValue in native byteOrder; - * X expects them MSB first - * convert as required - */ - - u.s = 0x1234; - if (u.b[0] != 0x12) { - if (n <= NLOCALBUFFER) { - cp2 = xlatebuffer; - } else { - cp2 = (XChar2b *)(malloc(n * 2)); - mustFree = 1; - } - - for (i=0; ifid, cp, n, + &directionReturn, &fontAscentReturn, &fontDescentReturn, + &overAllReturn); + LEAVE_XLIB(); + printf("lBear:%d rBear:%d width:%d\n", overAllReturn.lbearing, overAllReturn.rbearing, overAllReturn.width); +#endif + + ENTER_XLIB(); + len = XTextWidth(f, cp, n); + LEAVE_XLIB(); + + RETURN ( __MKSMALLINT(len) ); + } + + nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); + cp += nInstBytes; + + if (__isBytes(aString)) { + n = __byteArraySize(aString) - nInstBytes; + + + ENTER_XLIB(); + len = XTextWidth(f, cp, n); + LEAVE_XLIB(); + + RETURN ( __MKSMALLINT(len) ); + } + + /* TWOBYTESTRINGS */ + if (__isWords(aString)) { + union { + char b[2]; + unsigned short s; + } u; + int i; + XChar2b *cp2; + int mustFree = 0; + + n = (__byteArraySize(aString) - nInstBytes) / 2; + if (n > lMax) n = lMax; + + /* + * ST/X TwoByteStrings store the asciiValue in native byteOrder; + * X expects them MSB first + * convert as required + */ + + u.s = 0x1234; + if (u.b[0] != 0x12) { + if (n <= NLOCALBUFFER) { + cp2 = xlatebuffer; + } else { + cp2 = (XChar2b *)(malloc(n * 2)); + mustFree = 1; + } + + for (i=0; i -%{ +%{ int result, ok, evMask; Window confineWin; @@ -7193,12 +7252,12 @@ if (ISCONNECTED) { if (__isExternalAddress(aWindowId)) { - if (__isExternalAddress(confineId)) + if (__isExternalAddress(confineId)) confineWin = __WindowVal(confineId); else confineWin = (Window) None; - if (__isExternalAddress(aCursorId)) + if (__isExternalAddress(aCursorId)) curs = __CursorVal(aCursorId); else curs = (Cursor) None; @@ -7223,8 +7282,8 @@ ENTER_XLIB(); */ result = XGrabPointer(myDpy, - __WindowVal(aWindowId), - False, + __WindowVal(aWindowId), + False, evMask, pointer_mode, keyboard_mode, confineWin, @@ -7237,22 +7296,22 @@ ok = 0; switch (result) { - case AlreadyGrabbed: + case AlreadyGrabbed: if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [warning]: grab pointer: AlreadyGrabbed\n"); } break; - case GrabNotViewable: + case GrabNotViewable: if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [warning]: grab pointer: GrabNotViewable\n"); } break; - case GrabInvalidTime: + case GrabInvalidTime: if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [warning]: grab pointer: InvalidTime\n"); } break; - case GrabFrozen: + case GrabFrozen: if (@global(ErrorPrinting) == true) { fprintf(stderr, "XWorkstation [warning]: grab pointer: Frozen\n"); } @@ -7284,11 +7343,11 @@ "grap the pointer - return true if ok" ^ self - grabPointerIn:aWindowId - withCursor:aCursorId + grabPointerIn:aWindowId + withCursor:aCursorId eventMask:nil - pointerMode:pMode - keyboardMode:kMode + pointerMode:pMode + keyboardMode:kMode confineTo:confineId "Modified: / 28.7.1998 / 02:47:51 / cg" @@ -7298,7 +7357,7 @@ "release the keyboard" -%{ +%{ if (ISCONNECTED) { Display *dpy = myDpy; @@ -7354,7 +7413,7 @@ "disable clipping rectangle" -%{ +%{ XGCValues gcv; GC gc; @@ -7377,7 +7436,7 @@ "set background color to be drawn with" -%{ +%{ if (ISCONNECTED) { if (__isExternalAddress(aGCId) @@ -7396,7 +7455,7 @@ "set or clear the drawing mask - a bitmap mask using current fg/bg" -%{ +%{ GC gc; Pixmap bitmap; @@ -7430,7 +7489,7 @@ "enable/disable drawing into child views" -%{ +%{ XGCValues gcv; GC gc; @@ -7457,7 +7516,7 @@ "clip to a rectangle" -%{ +%{ XRectangle r; @@ -7483,14 +7542,14 @@ "set line attributes" -%{ +%{ if (ISCONNECTED) { if (__isExternalAddress(aGCId) && __isSmallInteger(offset) && __isByteArray(dashList)) { ENTER_XLIB(); - XSetDashes(myDpy, __GCVal(aGCId), + XSetDashes(myDpy, __GCVal(aGCId), __intVal(offset), __ByteArrayInstPtr(dashList)->ba_element, __byteArraySize(dashList)); @@ -7512,7 +7571,7 @@ "set font to be drawn in" -%{ +%{ XFontStruct *f; @@ -7537,7 +7596,7 @@ "set foreground and background colors to be drawn with" -%{ +%{ GC gc; @@ -7562,7 +7621,7 @@ "set foreground color to be drawn with" -%{ +%{ if (ISCONNECTED) { if (__isExternalAddress(aGCId) @@ -7581,7 +7640,7 @@ "set alu function to be drawn with" -%{ +%{ GC gc; int fun = -1; @@ -7625,7 +7684,7 @@ "set or clear the graphics exposures flag" -%{ +%{ if (ISCONNECTED) { if (__isExternalAddress(aGCId)) { @@ -7640,13 +7699,13 @@ ! setLineWidth:aNumber style:lineStyle cap:capStyle join:joinStyle in:aGCId - "set line attributes; + "set line attributes; lineStyle must be one of #solid, #dashed or #doubleDashed; capStyle one of: #notLast, #butt, #round or #projecting; joinStyle one of: #miter, #bevel or #round." -%{ +%{ int x_style, x_cap, x_join; static char dashList[2] = { 1,1 }; @@ -7724,7 +7783,7 @@ "set the mask origin" -%{ +%{ if (ISCONNECTED) { if (__bothSmallInteger(orgX, orgY) && __isExternalAddress(aGCid)) { @@ -7742,7 +7801,7 @@ "set or clear the drawing mask - a pixmap mask providing full color" -%{ +%{ GC gc; Pixmap pixmap; @@ -7799,7 +7858,7 @@ "low level close of the displays connection (without sending any buffered requests to the display). Only used in case of emergency (brokenConnection)" -%{ +%{ if (ISCONNECTED) { Display *dpy = myDpy; @@ -7834,7 +7893,7 @@ initializeFor:aDisplayName "initialize the receiver for a connection to an X-Server; the argument, aDisplayName may be nil (for the default server from - DISPLAY-variable or command line argument) or the name of the server + DISPLAY-variable or command line argument) or the name of the server as hostname:number" displayId notNil ifTrue:[ @@ -7849,6 +7908,9 @@ ^ nil ]. + xlibTimeout := xlibTimeout ? DefaultXLibTimeout. + xlibTimeoutForWindowCreation := xlibTimeoutForWindowCreation ? DefaultXLibTimeoutForWindowCreation. + dispatching := false. dispatchingExpose := false. isSlow := false. @@ -7886,7 +7948,7 @@ |map| - super initializeModifierMappings. + super initializeModifierMappings. rawKeySymTranslation := RawKeySymTranslation. @@ -7905,11 +7967,11 @@ altModifierMask := 0. metaModifierMask := 0. - stringFromKeyCode := [:key | - |s| - s := self stringFromKeycode:key. - s notNil - ifTrue:[s asSymbol] + stringFromKeyCode := [:key | + |s| + s := self stringFromKeycode:key. + s notNil + ifTrue:[s asSymbol] ifFalse:[nil] ]. nonNilOnes := [:str | str notNil]. @@ -7938,7 +8000,7 @@ altModifierMask := 1 bitShift:(5-1). ]. ] - ]. + ]. " Display initializeModifierMappings @@ -8139,7 +8201,7 @@ ^ nil " - Display queryCells + Display queryCells " ! @@ -8162,7 +8224,7 @@ ^ false " - Display queryDPSExtension + Display queryDPSExtension " ! @@ -8179,7 +8241,7 @@ ^ nil " - Display queryDefaultScreen + Display queryDefaultScreen " ! @@ -8230,7 +8292,7 @@ ^ nil " - Display queryDepth + Display queryDepth " ! @@ -8249,7 +8311,7 @@ ^ nil " - Display queryHeight + Display queryHeight " ! @@ -8268,7 +8330,7 @@ ^ nil " - Display queryHeightMM + Display queryHeightMM " ! @@ -8291,7 +8353,7 @@ ^ false " - Display queryMBUFExtension + Display queryMBUFExtension " ! @@ -8361,7 +8423,7 @@ ^ false " - Display querySHMExtension + Display querySHMExtension " ! @@ -8403,7 +8465,7 @@ ^ nil " - Display queryWhitePixel + Display queryWhitePixel " ! @@ -8422,7 +8484,7 @@ ^ nil " - Display queryWidth + Display queryWidth " ! @@ -8441,7 +8503,7 @@ ^ nil " - Display queryWidthMM + Display queryWidthMM " ! @@ -8510,7 +8572,7 @@ ^ false " - Display queryXVideoExtension + Display queryXVideoExtension " ! @@ -8669,7 +8731,7 @@ |mapping| mapping := Display modifierMapping. - ^ mapping collect:[:eachRow | + ^ mapping collect:[:eachRow | eachRow notNil ifTrue:[ eachRow collect:[ :key | Display stringFromKeycode:key ]. ] ifFalse:[ @@ -8707,14 +8769,14 @@ maxKeyPerMod = __MKSMALLINT(modmap->max_keypermod); modifierKeyMap = __BYTEARRAY_UNINITIALIZED_NEW_INT(modmap->max_keypermod * 8); if (modifierKeyMap != nil) { - memcpy((char *)__ByteArrayInstPtr(modifierKeyMap)->ba_element, + memcpy((char *)__ByteArrayInstPtr(modifierKeyMap)->ba_element, (char *)modmap->modifiermap, modmap->max_keypermod * 8); } XFreeModifiermap(modmap); } } %}. - ^ modifierKeyMap + ^ modifierKeyMap " Display rawModifierMapping @@ -8743,7 +8805,7 @@ Display *dpy = myDpy; if ((keysym = XKeycodeToKeysym(dpy, __intVal(code), 0)) != NoSymbol && - (keystring = XKeysymToString(keysym)) != 0) + (keystring = XKeysymToString(keysym)) != 0) str = __MKSTRING(keystring); } %}. @@ -8762,7 +8824,7 @@ translateKey:untranslatedKey forView:aView "Return the key translated via the translation table. - Here, we preTranslate the key into a common ST/X symbolic name, + Here, we preTranslate the key into a common ST/X symbolic name, which gets further processed in the superclasses translation method." |key| @@ -8816,7 +8878,7 @@ See #unBuffered for additional info." -%{ +%{ if (ISCONNECTED) { ENTER_XLIB(); XSynchronize(myDpy, 0); @@ -8837,7 +8899,7 @@ See also #sync, which even waits until the request has been processed." -%{ +%{ if (ISCONNECTED) { ENTER_XLIB(); XFlush(myDpy); @@ -8871,7 +8933,7 @@ to be finished. See also #flush." -%{ +%{ if (ISCONNECTED) { @@ -8929,7 +8991,7 @@ given to the parent view, the root view or no view." -%{ +%{ int arg; Window focusWindow; @@ -8944,7 +9006,7 @@ arg = RevertToParent; else if (revertSymbol == @symbol(root)) arg = RevertToPointerRoot; - else + else arg = RevertToNone; @@ -8973,7 +9035,7 @@ unBuffered "make all drawing be sent immediately to the display. This makes all graphics synchronous and turns off any buffering - (i.e. each individual draw-request is sent immediately without + (i.e. each individual draw-request is sent immediately without packing multiple requests into a larger message buffer). Be prepared, that this slows down graphics considerably. However, it allows display errors to be handled immediately and @@ -8981,7 +9043,7 @@ which was responsible for it. See also #buffered." -%{ +%{ if (ISCONNECTED) { @@ -9017,7 +9079,7 @@ shiftMask/controlMask and modifierMask methods for the meaning of the bits." -%{ +%{ Window w; int screen = __intVal(__INST(screen)); Window rootRet, childRet; @@ -9053,18 +9115,18 @@ ^ nil " - Display buttonStates + Display buttonStates " "is the control-key pressed ? - Display buttonStates bitTest:(Display controlMask) + Display buttonStates bitTest:(Display controlMask) " "is the alt/meta-key pressed ? - Display buttonStates bitTest:(Display altModifierMask) - Display buttonStates bitTest:(Display metaModifierMask) + Display buttonStates bitTest:(Display altModifierMask) + Display buttonStates bitTest:(Display metaModifierMask) " ! @@ -9174,7 +9236,7 @@ Window w = __WindowVal(aWindowId); ENTER_XLIB(); - XWarpPointer(dpy, + XWarpPointer(dpy, None, /* src window */ w, /* dst window */ 0, /* src_x */ @@ -9232,10 +9294,10 @@ getObjectProperty:propertyID from:aWindowID "get an object property from the server; return object or nil" - self - getProperty:propertyID - from:aWindowID - delete:true + self + getProperty:propertyID + from:aWindowID + delete:true into: [:type :value | type == stringAtom ifTrue:[ @@ -9329,7 +9391,7 @@ XFree(data); goto fail; } - + nread += nitems; bcopy(data, cp2, nitems); XFree(data); @@ -9337,7 +9399,7 @@ fprintf(stderr, "- \n", nitems, bytes_after); #endif } while (bytes_after > 0); - + if (ok) { if (actual_type == XA_STRING) { cp[nread] = '\0'; @@ -9359,7 +9421,7 @@ ^ true " - Display + Display getProperty:#'_DESKTOP_COLORS' from:nil delete:false @@ -9397,10 +9459,10 @@ getTextProperty:propertyID from:aWindowID "get a text property; return string or nil" - self - getProperty:propertyID - from:aWindowID - delete:true + self + getProperty:propertyID + from:aWindowID + delete:true into: [:type :value | |stringClass| @@ -9408,22 +9470,22 @@ type == stringAtom ifTrue:[ clipBoardEncoding notNil ifTrue:[ ^ value decodeFrom:clipBoardEncoding - ]. + ]. ^ value ]. type == (self atomIDOf:#'UTF8_STRING') ifTrue:[ -"/ Transcript show:'UTF8: '; showCR:value storeString. +"/ Transcript show:'UTF8: '; showCR:value storeString. ^ CharacterArray fromUTF8Bytes:value ]. type == (self atomIDOf:#'TEXT') ifTrue:[ -"/ Transcript show:'TEXT: '; showCR:value storeString. +"/ Transcript show:'TEXT: '; showCR:value storeString. ^ value asString ]. type == (self atomIDOf:#'COMPOUND_TEXT') ifTrue:[ -"/ Transcript show:'COMPOUND_TEXT: '; showCR:value storeString. +"/ Transcript show:'COMPOUND_TEXT: '; showCR:value storeString. ^ value asString ]. @@ -9443,8 +9505,8 @@ "Modified: 30.6.1997 / 20:54:59 / cg" " - Display getTextProperty:#'_KDE_GENERAL' from:nil. - Display getTextProperty:#'_DESKTOP_FONTS' from:nil. + Display getTextProperty:#'_KDE_GENERAL' from:nil. + Display getTextProperty:#'_DESKTOP_FONTS' from:nil. " ! @@ -9578,7 +9640,7 @@ (char *)__integerArrayVal(anObject), __integerArraySize(anObject)); #endif - } else if (__isString(anObject) || __isSymbol(anObject)) { + } else if (__isString(anObject) || __isSymbol(anObject)) { XChangeProperty(dpy, window, prop, type, 8, PropModeReplace, __stringVal(anObject), @@ -9598,7 +9660,7 @@ supportedClipboards "answer a collection of symbols with the supported clipboards. - X11 additionaly supports a buffer containing the currently selected text + X11 additionaly supports a buffer containing the currently selected text (in xterm) - the PRIMARY selection" ^ #(clipboard selection) @@ -9621,10 +9683,10 @@ ^ self atomIDOf:aStringOrSymbol create:true " - Display atomIDOf:#'FACE_NAME' - Display atomIDOf:#'FULL_NAME' - Display atomIDOf:#DndProtocol - Display atomIDOf:#DndSelection + Display atomIDOf:#'FACE_NAME' + Display atomIDOf:#'FULL_NAME' + Display atomIDOf:#DndProtocol + Display atomIDOf:#DndSelection " "Modified: 4.4.1997 / 13:38:48 / cg" @@ -9639,7 +9701,7 @@ |atomSymbol atom| - atomSymbol := aStringOrSymbol asSymbol. + atomSymbol := aStringOrSymbol asSymbol. (atoms notNil and:[(atom := atoms at:atomSymbol ifAbsent:nil) notNil]) ifTrue:[ ^ atom. ]. @@ -9659,7 +9721,7 @@ Display atomIDOf:#CLIPBOARD create:false Display atomIDOf:'STRING' create:false Display atomIDOf:'PRIMARY' create:false - Display atomIDOf:'blabla' create:false + Display atomIDOf:'blabla' create:false " ! @@ -9669,7 +9731,7 @@ -%{ +%{ OBJ str; char *name; @@ -9692,11 +9754,11 @@ Display atomName:1 'PRIMARY' Display atomName:130 '_DEC_DEVICE_FONTNAMES' Display atomName:132 'FONTNAME_REGISTRY' - Display atomName:135 'FOUNDRY' + Display atomName:135 'FOUNDRY' Display atomName:150 'CHARSET_REGISTRY' Display atomName:151 'ISO8859' Display atomName:152 'CHARSET_ENCODING' - Display atomName:154 + Display atomName:154 " ! @@ -9705,7 +9767,7 @@ of name in a resource class. This is highly X specific and currently not used. - Notice: + Notice: we do not plan to use X's resources for ST/X's defaults, styles or resources. This would make porting of applications to different platforms much more difficult (Windows has no resource @@ -9738,14 +9800,14 @@ OpenWindows.Beep: notices the following returns 'notices'. - Display getResource:'Beep' class:'OpenWindows' + Display getResource:'Beep' class:'OpenWindows' if your ~/.Xdefaults contains an entry such as: *.beNiceToColormap: false the following return 'false'. - Display getResource:'beNiceToColormap' class:'any' - Display getResource:'beNiceToColormap' class:'' + Display getResource:'beNiceToColormap' class:'any' + Display getResource:'beNiceToColormap' class:'' " ! @@ -9755,7 +9817,7 @@ -%{ +%{ Atom prop; if (ISCONNECTED @@ -9763,7 +9825,7 @@ && (__qIsString(aStringOrSymbol) || __qIsSymbol(aStringOrSymbol))) { ENTER_XLIB(); - prop = XInternAtom(myDpy, __stringVal(aStringOrSymbol), + prop = XInternAtom(myDpy, __stringVal(aStringOrSymbol), (create == true) ? False : True); LEAVE_XLIB(); if (prop == None) { @@ -9868,7 +9930,7 @@ ! primGetBitsFrom:aDrawableId x:srcx y:srcy width:w height:h into:imageBits infoInto:info - "since XGetImage may allocate huge amount of stack space + "since XGetImage may allocate huge amount of stack space (some implementations use alloca), this must run with unlimited stack." @@ -9928,7 +9990,7 @@ /* imageBits too small */ fprintf(stderr, "Workstation [warning]: byteArray too small in primGetBits\n"); fprintf(stderr, " bytes need:%d given:%d\n", numBytes, __byteArraySize(imageBits)); - fprintf(stderr, " pad:%d depth:%d imgBytesPerLine:%d\n", + fprintf(stderr, " pad:%d depth:%d imgBytesPerLine:%d\n", image->bitmap_pad, image->depth, image->bytes_per_line); goto fail; } @@ -9948,7 +10010,7 @@ __ArrayInstPtr(info)->a_element[4] = @symbol(XYPixmap); else if (image->format == ZPixmap) __ArrayInstPtr(info)->a_element[4] = @symbol(ZPixmap); - + __ArrayInstPtr(info)->a_element[5] = __MKSMALLINT(image->bitmap_unit); __ArrayInstPtr(info)->a_element[6] = __MKSMALLINT(image->bitmap_pad); __ArrayInstPtr(info)->a_element[7] = __MKSMALLINT(image->bits_per_pixel); @@ -9956,7 +10018,7 @@ XDestroyImage(image); RETURN ( true ); } -fail: +fail: if (image) { XDestroyImage(image); } @@ -9990,10 +10052,10 @@ ^ copyBuffer ]. - self - requestSelection:clipboardAtom - property:(self atomIDOf:#'ST_SELECTION') - type:(self atomIDOf:#'ST_OBJECT') + self + requestSelection:clipboardAtom + property:(self atomIDOf:#'ST_SELECTION') + type:(self atomIDOf:#'ST_OBJECT') for:drawableId. ^ nil @@ -10002,37 +10064,37 @@ getTextSelection:selectionBufferSymbol for:drawableId "get the text selection - either immediate, or asynchronous. - Returns nil, if async request is on its way + Returns nil, if async request is on its way or if no selection is available" |selectionId selectionOwnerWindowId| selectionBufferSymbol == #selection ifTrue:[ - selectionId := primaryAtom. + selectionId := primaryAtom. ] ifFalse:[ - selectionId := clipboardAtom. + selectionId := clipboardAtom. ]. selectionOwnerWindowId := self getSelectionOwnerOf:selectionId. selectionOwnerWindowId isNil ifTrue:[ - ^ nil "no selection" + ^ nil "no selection" ]. selectionOwnerWindowId == selectionOwner ifTrue:[ - "I still hold the selection, so return my locally buffered data" - ^ self selectionAsString. - ]. - - self - requestSelection:selectionId - property:(self atomIDOf:#'VT_SELECTION') - type:(self atomIDOf:#'UTF8_STRING') - for:drawableId. - -"/ self -"/ requestSelection:selectionId -"/ property:(self atomIDOf:#'VT_SELECTION') -"/ type:stringAtom + "I still hold the selection, so return my locally buffered data" + ^ self selectionAsString. + ]. + + self + requestSelection:selectionId + property:(self atomIDOf:#'VT_SELECTION') + type:(self atomIDOf:#'UTF8_STRING') + for:drawableId. + +"/ self +"/ requestSelection:selectionId +"/ property:(self atomIDOf:#'VT_SELECTION') +"/ type:stringAtom "/ for:drawableId. ^ nil. @@ -10055,7 +10117,7 @@ (aTargetAtom == (self atomIDOf:#STRING)) ifTrue:[ "the other view wants the selection as string" - ^ self selectionAsString. + ^ self selectionAsString. ]. (aTargetAtom == (self atomIDOf:#TARGETS)) ifTrue:[ @@ -10075,7 +10137,7 @@ LENGTH is deprecated, since we do not know how the selection is going to be converted. The client must not rely on the length returned" - ^ self selectionAsString size + ^ self selectionAsString size ]. "we do not support the requestet target" @@ -10095,16 +10157,16 @@ property := targetID. ]. - self setProperty:property - type:targetID - value:something + self setProperty:property + type:targetID + value:something for:requestorID. - self sendSelectionNotifySelection:selectionID - property:property + self sendSelectionNotifySelection:selectionID + property:property target:targetID - time:t - from:windowID + time:t + from:windowID to:requestorID. ! @@ -10120,7 +10182,7 @@ "set the text selection, and make aWindowId be the owner. This can be used by any other X application. - We set both the PRIMARY and CLIPBOARD, so that you can paste + We set both the PRIMARY and CLIPBOARD, so that you can paste into xterm." (self setSelectionOwner:aWindowId of:clipboardAtom) ifFalse:[ @@ -10141,7 +10203,7 @@ supportedTargets := #(ST_OBJECT STRING TARGETS LENGTH). numericTargetArray := IntegerArray new:supportedTargets size. - supportedTargets keysAndValuesDo:[:index :targetSymbol| + supportedTargets keysAndValuesDo:[:index :targetSymbol| numericTargetArray at:index put:(self atomIDOf:targetSymbol) ]. @@ -10163,7 +10225,7 @@ selectionAtomID := selectionAtomSymbolOrID. ]. -%{ +%{ Window window; if (__isAtomID(selectionAtomID) && ISCONNECTED) { @@ -10186,7 +10248,7 @@ -%{ +%{ Atom sel_prop; char *cp; @@ -10206,7 +10268,7 @@ } ENTER_XLIB(); - XConvertSelection(dpy, __AtomVal(selectionID), __AtomVal(typeID), + XConvertSelection(dpy, __AtomVal(selectionID), __AtomVal(typeID), __AtomVal(propertyID), w, CurrentTime); LEAVE_XLIB(); @@ -10217,14 +10279,14 @@ ^ false " - Display + Display requestSelection:(Display atomIDOf:'PRIMARY') property:(Display atomIDOf:'VT_SELECTION') type:(Display atomIDOf:'STRING') for:Transcript id " " - Display + Display requestSelection:(Display atomIDOf:'PRIMARY') property:(Display atomIDOf:'VT_SELECTION') type:(Display atomIDOf:'C_STRING') @@ -10236,7 +10298,7 @@ "send a selectionNotify back from a SelectionRequest" -%{ +%{ if (ISCONNECTED && (__isAtomID(propertyID) || propertyID == nil) && __isAtomID(targetID) && __isAtomID(selectionID)) { @@ -10290,7 +10352,7 @@ /* send nil property if selection cannot be converted */ if (propertyID == nil) ev.xselection.property = None; - else + else ev.xselection.property = __AtomVal(propertyID); @@ -10340,7 +10402,7 @@ selectionAtomID := selectionAtomSymbolOrID. ]. -%{ +%{ Window win; if (__isExternalAddress(aWindowId) @@ -10371,7 +10433,7 @@ "clear a rectangular area to viewbackground" -%{ +%{ int w, h; @@ -10400,7 +10462,7 @@ "clear a window to viewbackground" -%{ +%{ if (ISCONNECTED) { if (__isExternalAddress(aWindowId)) { @@ -10418,7 +10480,7 @@ "configure stacking operation of aWindowId w.r.t siblingId" -%{ +%{ XWindowChanges chg; int mask = CWSibling | CWStackMode; @@ -10454,8 +10516,8 @@ ! getGeometryOf:aWindowId - "get a windows geometry. - NOTICE: X-WindowManagers usually do wrap client topViews into their own + "get a windows geometry. + NOTICE: X-WindowManagers usually do wrap client topViews into their own decoration views (top label, resize boundaries etc.). Thus, the numbers returned here for topViews are the physical (real) dimensions relative to such a wrapper. @@ -10466,18 +10528,18 @@ |x y width height depth borderWidth info| -%{ +%{ int x_ret, y_ret; - unsigned int width_ret, height_ret, + unsigned int width_ret, height_ret, border_width_ret, depth_ret; Window root_ret; if (ISCONNECTED && __isExternalAddress(aWindowId)) { ENTER_XLIB(); - XGetGeometry(myDpy, __WindowVal(aWindowId), - &root_ret, - &x_ret, &y_ret, + XGetGeometry(myDpy, __WindowVal(aWindowId), + &root_ret, + &x_ret, &y_ret, &width_ret, &height_ret, &border_width_ret, &depth_ret); LEAVE_XLIB(); @@ -10523,12 +10585,12 @@ isValidWindowId:aWindowId "return true, if the given window ID is (still) valid. - Especially useful, if the passed windowID is + Especially useful, if the passed windowID is an alien (external) windows id." |ret| -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -10538,7 +10600,7 @@ int nChildren; /* ENTER_XLIB(); */ - ok = XQueryTree(myDpy, __WindowVal(aWindowId), + ok = XQueryTree(myDpy, __WindowVal(aWindowId), &root, &parent, &children, &nChildren); if (children) { XFree(children); @@ -10573,7 +10635,7 @@ "bring a window to back" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -10586,12 +10648,12 @@ self primitiveFailedOrClosedConnection ! -mapView:aView id:aWindowId iconified:aBoolean atX:xPos y:yPos +mapView:aView id:aWindowId iconified:aBoolean atX:xPos y:yPos width:w height:h minExtent:minExt maxExtent:maxExt - "make a window visible - either as icon or as a real view + "make a window visible - either as icon or as a real view in addition, allow change of extend, position, minExtend and maxExtent. Needed for restart, to allow recreating a view as iconified, and to collaps/expand windows." @@ -10617,7 +10679,7 @@ maxW := maxExt x. maxH := maxExt y. ]. -%{ +%{ XWMHints wmhints; XSizeHints szhints; @@ -10716,7 +10778,7 @@ "make a window visible" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -10733,7 +10795,7 @@ "move and resize a window" -%{ +%{ int newWidth, newHeight; @@ -10760,7 +10822,7 @@ "move a window" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) && __bothSmallInteger(x, y)) { @@ -10777,7 +10839,7 @@ "return a windows parent-window id. Useful with getGeometryOf:, to compute information about the decoration." -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -10786,7 +10848,7 @@ int nChildren; /* ENTER_XLIB(); */ - ok = XQueryTree(myDpy, __WindowVal(aWindowId), + ok = XQueryTree(myDpy, __WindowVal(aWindowId), &root, &parent, &children, &nChildren); if (children) { XFree(children); @@ -10813,16 +10875,16 @@ "define a windows name" -%{ +%{ if (ISCONNECTED && __isNonNilObject(aString) && (__qIsString(aString) || __qIsSymbol(aString)) && __isExternalAddress(aWindowId)) { - ENTER_XLIB(); - XStoreName(myDpy, __WindowVal(aWindowId), (char *) __stringVal(aString)); - LEAVE_XLIB(); - RETURN ( self ); + ENTER_XLIB(); + XStoreName(myDpy, __WindowVal(aWindowId), (char *) __stringVal(aString)); + LEAVE_XLIB(); + RETURN ( self ); } %}. self primitiveFailedOrClosedConnection @@ -10832,7 +10894,7 @@ "bring a window to front" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -10888,7 +10950,7 @@ "resize a window" -%{ +%{ int newWidth, newHeight; @@ -10911,7 +10973,7 @@ "turn on/off backing-store for a window" -%{ +%{ XSetWindowAttributes wa; @@ -10938,7 +11000,7 @@ "set bit gravity for a window" -%{ +%{ XSetWindowAttributes wa; @@ -10981,7 +11043,7 @@ "define a windows cursor" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11005,7 +11067,7 @@ "define a windows iconname" -%{ +%{ if (ISCONNECTED && __isNonNilObject(aString) @@ -11024,7 +11086,7 @@ "turn on/off save-under for a window" -%{ +%{ XSetWindowAttributes wa; @@ -11046,7 +11108,7 @@ "set aWindowId to be a transient of aMainWindow" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -11077,7 +11139,7 @@ the background drawing color, which is used with opaque drawing." -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11093,12 +11155,12 @@ setWindowBackgroundPixmap:aPixmapId in:aWindowId "set the windows background pattern to be a form. - This is the pattern with which the view is filled whenever exposed. - Do not confuse this with the background drawing color, which is used + This is the pattern with which the view is filled whenever exposed. + Do not confuse this with the background drawing color, which is used with opaque drawing." -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11116,7 +11178,7 @@ "set the windows border color" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11134,7 +11196,7 @@ "set the windows border pattern" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11155,7 +11217,7 @@ hasShapeExtension ifFalse:[^ self]. -%{ +%{ #ifdef SHAPE Pixmap shapeBitmap; @@ -11182,7 +11244,7 @@ "set the windows border width" -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId) @@ -11233,7 +11295,7 @@ "set window gravity for a window" -%{ +%{ XSetWindowAttributes wa; @@ -11367,7 +11429,7 @@ nil arguments are ignored." -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { Display *dpy = myDpy; @@ -11404,11 +11466,11 @@ stringUsed := aString. self supportsUTF8WindowLabels ifTrue:[ - stringUsed := aString utf8Encoded. + stringUsed := aString utf8Encoded. ] ifFalse:[ - aString bitsPerCharacter > 8 ifTrue:[ - stringUsed := aString utf8Encoded. - ]. + aString bitsPerCharacter > 8 ifTrue:[ + stringUsed := aString utf8Encoded. + ]. ]. self primSetWindowName:stringUsed in:aWindowId @@ -11423,7 +11485,7 @@ hasShapeExtension ifFalse:[^ self]. -%{ +%{ #ifdef SHAPE Pixmap shapeBitmap; @@ -11451,7 +11513,7 @@ "make a window invisible" -%{ +%{ if (!ISCONNECTED) { RETURN ( self ); @@ -11472,7 +11534,7 @@ The passed windowID may be an alien windows id." -%{ +%{ if (ISCONNECTED && __isExternalAddress(aWindowId)) { @@ -11507,7 +11569,7 @@ !XWorkstation class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.459 2004-05-11 08:01:01 stefan Exp $' + ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.460 2004-09-14 12:30:34 cg Exp $' ! ! XWorkstation initialize!