XWorkstation.st
changeset 459 6678caa541c1
parent 457 b40bf5d8727c
child 461 4a4b1384ab76
--- a/XWorkstation.st	Sat Feb 24 23:51:21 1996 +0100
+++ b/XWorkstation.st	Mon Feb 26 16:15:34 1996 +0100
@@ -2495,51 +2495,101 @@
      && __isNonNilObject(aString)
      && __bothSmallInteger(index1, index2)
      && __bothSmallInteger(x, y)) {
-	gc = _GCVal(aGCId);
-	win = _WindowVal(aDrawableId);
-	cls = __qClass(aString);
-
-	if ((cls == @global(String)) || (cls == @global(Symbol))) {
-	    i1 = _intVal(index1) - 1;
-	    i2 = _intVal(index2) - 1;
-	    n = _stringSize(aString);
-	    cp = _stringVal(aString);
-	    if ((i1 >= 0) && (i2 < n)) {
-		if (i2 >= i1) {
-		    cp += i1;
-		    l = i2 - i1 + 1;
-		    if (l > 1000) l = 1000;
-		    if (opaque == true)
-			XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
-		    else
-			XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
-		}
-		RETURN ( self );
-	    }
-	}
+        gc = _GCVal(aGCId);
+        win = _WindowVal(aDrawableId);
+        cls = __qClass(aString);
+
+        if ((cls == @global(String)) || (cls == @global(Symbol))) {
+            i1 = _intVal(index1) - 1;
+            i2 = _intVal(index2) - 1;
+            n = _stringSize(aString);
+            cp = _stringVal(aString);
+            if ((i1 >= 0) && (i2 < n)) {
+                if (i2 >= i1) {
+                    cp += i1;
+                    l = i2 - i1 + 1;
+                    if (l > 1000) l = 1000;
+                    if (opaque == true)
+                        XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
+                    else
+                        XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
+                }
+                RETURN ( self );
+            }
+        }
+        if (__isBytes(aString)) {
+            int nInstBytes;
+
+            nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
+
+            i1 = _intVal(index1) - 1;
+            i2 = _intVal(index2) - 1;
+            n = _byteArraySize(aString) - nInstBytes - 1;
+            cp = _stringVal(aString) + nInstBytes;
+            if ((i1 >= 0) && (i2 < n)) {
+                if (i2 >= i1) {
+                    cp += i1;
+                    l = i2 - i1 + 1;
+                    if (l > 1000) l = 1000;
+                    if (opaque == true)
+                        XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
+                    else
+                        XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, l);
+                    RETURN ( self );
+                }
+            }
+        }
 #ifdef TWOBYTESTRINGS
-	if (__isWords(aString)) {
-	    int nInstBytes;
-
-	    nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
-
-	    i1 = _intVal(index1) - 1;
-	    i2 = _intVal(index2) - 1;
-	    n = (_byteArraySize(aString) - nInstBytes) / 2;
-	    cp = _stringVal(aString) + nInstBytes;
-	    if ((i1 >= 0) && (i2 < n)) {
-		if (i2 >= i1) {
-		    cp += (i1 * 2);
-		    l = i2 - i1 + 1;
-		    if (l > 1000) l = 1000;
-		    if (opaque == true)
-			XDrawImageString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, l);
-		    else
-			XDrawString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, l);
-		    RETURN ( self );
-		}
-	    }
-	}
+        if (__isWords(aString)) {
+            int nInstBytes;
+            union {
+                char b[2];
+                unsigned short s;
+            } u;
+            int i;
+            XChar2b *cp2 = (XChar2b *)0;
+
+            nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
+
+            i1 = _intVal(index1) - 1;
+            i2 = _intVal(index2) - 1;
+            n = (_byteArraySize(aString) - nInstBytes) / 2;
+            cp = _stringVal(aString) + nInstBytes;
+            if ((i1 >= 0) && (i2 < n)) {
+                if (i2 >= i1) {
+                    cp += (i1 * 2);
+                    l = i2 - i1 + 1;
+                    if (l > 1000) l = 1000;
+
+                    /*
+                     * 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) {
+                        cp2 = (XChar2b *)(malloc(l * 2));
+                        for (i=0; i<l; i++) {
+                            cp2[i].byte1 = (((XChar2b *)cp)[i]).byte2;
+                            cp2[i].byte2 = (((XChar2b *)cp)[i]).byte1;
+                        }
+                        cp = (char *) cp2;
+                    }
+
+                    if (opaque == true)
+                        XDrawImageString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, l);
+                    else
+                        XDrawString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, l);
+
+                    if (cp2) {
+                        free(cp2);
+                    }
+
+                    RETURN ( self );
+                }
+            }
+        }
 #endif
     }
 %}.
@@ -2564,35 +2614,78 @@
      && __isExternalAddress(aDrawableId)
      && __isNonNilObject(aString)
      && __bothSmallInteger(x, y)) {
-	gc = _GCVal(aGCId);
-	win = _WindowVal(aDrawableId);
-	cls = __qClass(aString);
-
-	if ((cls == @global(String)) || (cls == @global(Symbol))) {
-	    cp = _stringVal(aString);
-	    n = _stringSize(aString);
-	    if (n > 1000) n = 1000;
-	    if (opaque == true)
-		XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
-	    else
-		XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
-	    RETURN ( self );
-	}
+        gc = _GCVal(aGCId);
+        win = _WindowVal(aDrawableId);
+        cls = __qClass(aString);
+
+        if ((cls == @global(String)) || (cls == @global(Symbol))) {
+            cp = _stringVal(aString);
+            n = _stringSize(aString);
+            if (n > 1000) n = 1000;
+            if (opaque == true)
+                XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
+            else
+                XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
+            RETURN ( self );
+        }
+        if (__isBytes(aString)) {
+            int nInstBytes;
+
+            nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
+
+            cp = _stringVal(aString) + nInstBytes;
+            n = _byteArraySize(aString) - nInstBytes - 1;
+            if (n > 1000) n = 1000;
+            if (opaque == true)
+                XDrawImageString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
+            else
+                XDrawString(myDpy, win, gc, _intVal(x), _intVal(y), (char *)cp, n);
+            RETURN ( self );
+        }
 #ifdef TWOBYTESTRINGS
-	if (__isWords(aString)) {
-	    int nInstBytes;
-
-	    nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
-
-	    cp = _stringVal(aString) + nInstBytes;
-	    n = (_byteArraySize(aString) - nInstBytes) / 2;
-	    if (n > 1000) n = 1000;
-	    if (opaque == true)
-		XDrawImageString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, n);
-	    else
-		XDrawString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, n);
-	    RETURN ( self );
-	}
+        if (__isWords(aString)) {
+            int nInstBytes;
+            union {
+                char b[2];
+                unsigned short s;
+            } u;
+            int i;
+            XChar2b *cp2 = (XChar2b *)0;
+
+            nInstBytes = __OBJS2BYTES__(_intVal(_ClassInstPtr(cls)->c_ninstvars));
+
+            cp = _stringVal(aString) + nInstBytes;
+            n = (_byteArraySize(aString) - nInstBytes) / 2;
+            if (n > 1000) n = 1000;
+
+            /*
+             * 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) {
+                cp2 = (XChar2b *)(malloc(n * 2));
+                for (i=0; i<n; i++) {
+                    cp2[i].byte1 = (((XChar2b *)cp)[i]).byte2;
+                    cp2[i].byte2 = (((XChar2b *)cp)[i]).byte1;
+                }
+                cp = (char *) cp2;
+            }
+
+            if (opaque == true)
+                XDrawImageString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, n);
+            else
+                XDrawString16(myDpy, win, gc, _intVal(x), _intVal(y), (XChar2b *)cp, n);
+
+
+            if (cp2) {
+                free(cp2);
+            }
+
+            RETURN ( self );
+        }
 #endif
     }
 %}.
@@ -7556,6 +7649,6 @@
 !XWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.113 1996-02-24 21:51:50 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.114 1996-02-26 15:15:34 cg Exp $'
 ! !
 XWorkstation initialize!