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