XWorkstation.st
changeset 3214 359316f51b9f
parent 3207 df242f652d1f
child 3215 228d7bfaa022
--- a/XWorkstation.st	Sun Jul 02 14:54:33 2000 +0200
+++ b/XWorkstation.st	Sun Jul 02 14:55:42 2000 +0200
@@ -1115,6 +1115,431 @@
     "Created: 10.6.1996 / 21:06:48 / cg"
 !
 
+queryAtom:atomName
+%{
+    Display *dpy;
+
+    if (ISCONNECTED) {
+        dpy = myDpy;
+        RETURN ( __MKATOMOBJ( XInternAtom(dpy, __stringVal(atomName), True) ));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryAtom:'PRIMARY'  
+    "
+!
+
+queryBlackPixel
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(BlackPixel(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryBlackPixel
+    "
+!
+
+queryCells
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayCells(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryCells 
+    "
+!
+
+queryDPSExtension
+%{  /* NOCONTEXT */
+
+#ifdef DPS
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, "DPSExtension", &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryDPSExtension  
+    "
+!
+
+queryDefaultScreen
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+
+        dpy = myDpy;
+        RETURN ( __MKSMALLINT(DefaultScreen(dpy)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryDefaultScreen  
+    "
+!
+
+queryDefaultVisualType
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        Visual *visual;
+
+        dpy = myDpy;
+        visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(dpy));
+        switch (visual->class) {
+            case StaticGray:
+                RETURN ( @symbol(StaticGray) );
+            case GrayScale:
+                RETURN ( @symbol(GrayScale) );
+            case StaticColor:
+                RETURN ( @symbol(StaticColor) );
+            case PseudoColor:
+                RETURN ( @symbol(PseudoColor) );
+            case TrueColor:
+                RETURN ( @symbol(TrueColor) );
+            case DirectColor:
+                RETURN ( @symbol(DirectColor) );
+        }
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryDefaultVisualType
+    "
+!
+
+queryDepth
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayPlanes(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryDepth  
+    "
+!
+
+queryHeight
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayHeight(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryHeight      
+    "
+!
+
+queryHeightMM
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayHeightMM(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryHeightMM      
+    "
+!
+
+queryMBUFExtension
+%{  /* NOCONTEXT */
+
+#ifdef MBUF
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, "Multi-Buffering", &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryMBUFExtension  
+    "
+!
+
+queryPEXExtension
+%{  /* NOCONTEXT */
+
+#ifdef PEX5
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, PEX_NAME_STRING, &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryPEXExtension
+    "
+!
+
+queryRGBMasks
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        Visual *visual;
+        OBJ redMask, greenMask, blueMask, bprgb;
+
+        dpy = myDpy;
+        visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(dpy));
+        redMask   = __MKSMALLINT(visual->red_mask);
+        greenMask = __MKSMALLINT(visual->green_mask);
+        blueMask  = __MKSMALLINT(visual->blue_mask);
+        bprgb  = __MKSMALLINT(visual->bits_per_rgb);
+        RETURN ( __ARRAY_WITH4(redMask, greenMask, blueMask, bprgb) );
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryRGBMasks
+    "
+!
+
+querySHMExtension
+%{  /* NOCONTEXT */
+
+#ifdef xxSHM
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, "MIT_SHM", &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display querySHMExtension  
+    "
+!
+
+queryShapeExtension
+%{  /* NOCONTEXT */
+
+#ifdef SHAPE
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XShapeQueryExtension(dpy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryShapeExtension
+    "
+!
+
+queryWhitePixel
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(WhitePixel(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryWhitePixel    
+    "
+!
+
+queryWidth
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayWidth(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryWidth 
+    "
+!
+
+queryWidthMM
+%{  /* NOCONTEXT */
+
+    if (ISCONNECTED) {
+        Display *dpy;
+        int scr;
+
+        dpy = myDpy;
+        scr = DefaultScreen(dpy);
+        RETURN ( __MKSMALLINT(DisplayWidthMM(dpy, scr)));
+    }
+%}.
+    ^ nil
+
+    "
+     Display queryWidthMM 
+    "
+!
+
+queryXIEExtension
+%{  /* NOCONTEXT */
+
+#ifdef XIE
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, xieExtName, &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryXIEExtension
+    "
+!
+
+queryXIExtension
+%{  /* NOCONTEXT */
+
+#ifdef XI
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, "XInputExtension", &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryXIExtension
+    "
+!
+
+queryXVideoExtension
+%{  /* NOCONTEXT */
+
+#ifdef XVIDEO
+    if (ISCONNECTED) {
+        Display *dpy;
+        int dummy;
+
+        dpy = myDpy;
+
+        if (XQueryExtension(dpy, "XVideo", &dummy, &dummy, &dummy)) {
+            _RETURN ( true );
+        }
+    }
+#endif
+%}.
+    ^ false
+
+    "
+     Display queryXVideoExtension  
+    "
+!
+
 scrollsAsynchronous
     "return true, if this display asynchronously sends expose events after a
      scroll operation. False otherwise. Asynchronous expose events are an X
@@ -7467,7 +7892,7 @@
         ].
     ].
 
-    self openConnectionTo:dpyName.
+    displayId := self openConnectionTo:dpyName.
 
     displayId isNil ifTrue:[
         "/ could not connect.
@@ -7565,8 +7990,69 @@
 !
 
 initializeScreenProperties
+    |masks|
+
     super initializeScreenProperties.
 
+    hasShapeExtension := self queryShapeExtension.
+    hasShmExtension := self querySHMExtension.
+    hasDPSExtension := self queryDPSExtension.
+    hasXVideoExtension := self queryXVideoExtension.
+    hasMbufExtension := self queryMBUFExtension.
+    hasPEXExtension := self queryPEXExtension.
+    hasImageExtension := self queryXIEExtension.
+    hasInputExtension := self queryXIExtension.
+
+    primaryAtom := self queryAtom:'PRIMARY'.
+    secondaryAtom := self queryAtom:'SECONDARY'.
+    cutBuffer0Atom := self queryAtom:'CUT_BUFFER0'.
+    stringAtom := self queryAtom:'STRING'.
+    lengthAtom := self queryAtom:'LENGTH'.
+    wmStateAtom := self queryAtom:'WM_STATE'.
+
+    altModifierMask := self modifier2Mask.
+    metaModifierMask := self modifier1Mask.
+
+    screen := self queryDefaultScreen.
+    depth := self queryDepth.
+    ncells := self queryCells.
+    width := self queryWidth.
+    height := self queryHeight.
+    widthMM := self queryWidthMM.
+    heightMM := self queryHeightMM.
+    blackpixel := self queryBlackPixel.
+    whitepixel := self queryWhitePixel.
+
+    monitorType := #unknown.
+    visualType := self queryDefaultVisualType.
+
+    hasColors := hasGreyscales := true.
+    (visualType == #StaticGray
+    or:[ visualType == #GrayScale]) ifTrue:[
+        hasColors := false.
+        monitorType := #monochrome.
+    ].
+
+    ncells == 2 ifTrue:[
+        hasColors := hasGreyscales := false.
+    ].
+
+    masks := self queryRGBMasks.
+    redMask := masks at:1.
+    greenMask := masks at:2.
+    blueMask := masks at:3.
+    bitsPerRGB := masks at:4.
+
+    visualType == #TrueColor ifTrue:[
+        redShift := redMask lowBit - 1.
+        greenShift := greenMask lowBit - 1.
+        blueShift := blueMask lowBit - 1.
+
+        bitsRed := redMask highBit - redMask lowBit + 1.
+        bitsGreen := greenMask highBit - greenMask lowBit + 1.
+        bitsBlue := blueMask highBit - blueMask lowBit + 1.
+    ].
+
 %{
 
     Display *dpy;
@@ -7578,228 +8064,37 @@
     int rgbRedMask, rgbGreenMask, rgbBlueMask;
     int rgbVisualID;
     int nvi, i;
-    int shapeEventBase, shapeErrorBase;
-    int shmEventBase, shmErrorBase;
     char *type, *nm;
     int dummy;
-    int mask, shift, nBits;
 
     if (ISCONNECTED) {
-	dpy = myDpy;
-
-	__INST(altModifierMask) = __MKSMALLINT(Mod2Mask);
-	__INST(metaModifierMask) = __MKSMALLINT(Mod1Mask);
-
-
-
-	__INST(screen) = __MKSMALLINT(scr = DefaultScreen(dpy));
-	__INST(depth) = __MKSMALLINT(DisplayPlanes(dpy, scr));
-	__INST(ncells) = __MKSMALLINT(DisplayCells(dpy, scr));
-	__INST(width) = __MKSMALLINT(DisplayWidth(dpy, scr));
-	__INST(height) = __MKSMALLINT(DisplayHeight(dpy, scr));
-	__INST(widthMM) = __MKSMALLINT(DisplayWidthMM(dpy, scr));
-	__INST(heightMM) = __MKSMALLINT(DisplayHeightMM(dpy, scr));
-	__INST(blackpixel) = __MKSMALLINT(BlackPixel(dpy, scr));
-	__INST(whitepixel) = __MKSMALLINT(WhitePixel(dpy, scr));
-
-#ifdef SHAPE
-	if (XShapeQueryExtension(dpy, &dummy, &dummy))
-	    __INST(hasShapeExtension) = true;
-	else
-#endif
-	  __INST(hasShapeExtension) = false;
-
-#ifdef SHM
-	if (XQueryExtension(dpy, "MIT_SHM", &dummy, &dummy, &dummy))
-	    __INST(hasShmExtension) = true;
-	else
-#endif
-	  __INST(hasShmExtension) = false;
-
-#ifdef DPS
-	if (XQueryExtension(dpy, "DPSExtension", &dummy, &dummy, &dummy))
-	    __INST(hasDPSExtension) = true;
-	else
-#endif
-	  __INST(hasDPSExtension) = false;
-
-#ifdef XVIDEO
-	if (XQueryExtension(dpy, "XVideo", &dummy, &dummy, &dummy))
-	    __INST(hasXVideoExtension) = true;
-	else
-#endif
-	  __INST(hasXVideoExtension) = false;
-
-#ifdef MBUF
-	if (XQueryExtension(dpy, "Multi-Buffering", &dummy, &dummy, &dummy))
-	    __INST(hasMbufExtension) = true;
-	else
-#endif
-	  __INST(hasMbufExtension) = false;
-
-#ifdef PEX5
-	if (XQueryExtension(dpy, PEX_NAME_STRING, &dummy, &dummy, &dummy))
-	    __INST(hasPEXExtension) = true;
-	else
-#endif
-	  __INST(hasPEXExtension) = false;
-
-#ifdef XIE
-	if (XQueryExtension(dpy, xieExtName, &dummy, &dummy, &dummy))
-	    __INST(hasImageExtension) = true;
-	else
-#endif
-	  __INST(hasImageExtension) = false;
-
-#ifdef XI
-	if (XQueryExtension(dpy, "XInputExtension", &dummy, &dummy, &dummy))
-	    __INST(hasInputExtension) = true;
-	else
-#endif
-	  __INST(hasInputExtension) = false;
-
-	/*
-	 * look for RGB visual
-	 */
-	nvi = 0;
-	viproto.screen = scr;
-	vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi);
-	maxRGBDepth = 0;
-	for (i = 0; i < nvi; i++) {
-	    switch (vip[i].class) {
-		case TrueColor:
-		    if (vip[i].depth > maxRGBDepth) {
-			maxRGBDepth = vip[i].depth;
-			rgbRedMask = vip[i].red_mask;
-			rgbGreenMask = vip[i].green_mask;
-			rgbBlueMask = vip[i].blue_mask;
-			rgbVisualID = vip[i].visualid;
-		    }
-		    break;
-	    }
-	}
-	if (vip) XFree ((char *) vip);
-
-	if (maxRGBDepth) {
-	    __INST(rgbVisual) = __MKEXTERNALADDRESS(rgbVisualID); __STORESELF(rgbVisual);
-	}
-
-	visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(dpy));
-	__INST(monitorType) = @symbol(unknown);
-	__INST(hasColors) = true;
-	__INST(hasGreyscales) = true;
-	switch (visual->class) {
-	    case StaticGray:
-		__INST(visualType) = @symbol(StaticGray);
-		__INST(hasColors) = false;
-		__INST(monitorType) = @symbol(monochrome);
-		break;
-	    case GrayScale:
-		__INST(visualType) = @symbol(GrayScale);
-		__INST(hasColors) = false;
-		__INST(monitorType) = @symbol(monochrome);
-		break;
-	    case StaticColor:
-		__INST(visualType) = @symbol(StaticColor);
-		break;
-	    case PseudoColor:
-		__INST(visualType) = @symbol(PseudoColor);
-		break;
-	    case TrueColor:
-		__INST(visualType) = @symbol(TrueColor);
-		break;
-	    case DirectColor:
-		__INST(visualType) = @symbol(DirectColor);
-		break;
-	}
-	if (DisplayCells(dpy, scr) == 2) {
-	    __INST(hasColors) = false;
-	    __INST(hasGreyscales) = false;
-	    __INST(monitorType) = @symbol(monochrome);
-	}
-	__INST(bitsPerRGB) = __MKSMALLINT(visual->bits_per_rgb);
-	__INST(redMask)   = __MKSMALLINT(visual->red_mask);
-	__INST(greenMask) = __MKSMALLINT(visual->green_mask);
-	__INST(blueMask)  = __MKSMALLINT(visual->blue_mask);
-	switch (visual->class) {
-	    case TrueColor:
-		/* extract number of bits and shift counts */
-		mask = visual->red_mask;
-		shift = 0;
-		while (mask && ((mask & 1) == 0)) {
-		    mask >>= 1;
-		    shift++;
-		}
-		__INST(redShift) = __MKSMALLINT(shift);
-		nBits = 0;
-		while (mask) {
-		    mask >>= 1;
-		    nBits++;
-		}
-		__INST(bitsRed) = __MKSMALLINT(nBits);
-
-		mask = visual->green_mask;
-		shift = 0;
-		while (mask && ((mask & 1) == 0)) {
-		    mask >>= 1;
-		    shift++;
-		}
-		__INST(greenShift) = __MKSMALLINT(shift);
-		nBits = 0;
-		while (mask) {
-		    mask >>= 1;
-		    nBits++;
-		}
-		__INST(bitsGreen) = __MKSMALLINT(nBits);
-
-		mask = visual->blue_mask;
-		shift = 0;
-		while (mask && ((mask & 1) == 0)) {
-		    mask >>= 1;
-		    shift++;
-		}
-		__INST(blueShift) = __MKSMALLINT(shift);
-		nBits = 0;
-		while (mask) {
-		    mask >>= 1;
-		    nBits++;
-		}
-		__INST(bitsBlue) = __MKSMALLINT(nBits);
-		break;
-	}
-
-#ifndef XA_PRIMARY
-	__INST(primaryAtom) = __MKATOMOBJ( XInternAtom(dpy, "PRIMARY", True) );
-#else
-	__INST(primaryAtom) = __MKATOMOBJ( XA_PRIMARY );
-#endif
-#ifndef XA_SECONDARY
-	__INST(secondaryAtom) = __MKATOMOBJ( XInternAtom(dpy, "SECONDARY", True) );
-#else
-	__INST(secondaryAtom) = __MKATOMOBJ( XA_SECONDARY );
-#endif
-#ifndef XA_CUT_BUFFER0
-	__INST(cutBuffer0Atom) = __MKATOMOBJ( XInternAtom(dpy, "CUT_BUFFER0", True) );
-#else
-	__INST(cutBuffer0Atom) = __MKATOMOBJ( XA_CUT_BUFFER0 );
-#endif
-#ifndef XA_STRING
-	__INST(stringAtom) = __MKATOMOBJ( XInternAtom(dpy, "STRING", True) );
-#else
-	__INST(stringAtom) = __MKATOMOBJ( XA_STRING );
-#endif
-#ifndef XA_LENGTH
-	__INST(lengthAtom) = __MKATOMOBJ( XInternAtom(dpy, "LENGTH", True) );
-#else
-	__INST(lengthAtom) = __MKATOMOBJ( XA_LENGTH );
-#endif
-#ifndef WM_STATE
-	__INST(wmStateAtom) = __MKATOMOBJ( XInternAtom(dpy, "WM_STATE", True) );
-#else
-	__INST(wmStateAtom) = __MKATOMOBJ( WM_STATE );
-#endif
-
-
+        dpy = myDpy;
+
+        /*
+         * look for RGB visual
+         */
+        nvi = 0;
+        viproto.screen = scr;
+        vip = XGetVisualInfo (dpy, VisualScreenMask, &viproto, &nvi);
+        maxRGBDepth = 0;
+        for (i = 0; i < nvi; i++) {
+            switch (vip[i].class) {
+                case TrueColor:
+                    if (vip[i].depth > maxRGBDepth) {
+                        maxRGBDepth = vip[i].depth;
+                        rgbRedMask = vip[i].red_mask;
+                        rgbGreenMask = vip[i].green_mask;
+                        rgbBlueMask = vip[i].blue_mask;
+                        rgbVisualID = vip[i].visualid;
+                    }
+                    break;
+            }
+        }
+        if (vip) XFree ((char *) vip);
+
+        if (maxRGBDepth) {
+            __INST(rgbVisual) = __MKEXTERNALADDRESS(rgbVisualID); __STORESELF(rgbVisual);
+        }
     }
 %}.
 !
@@ -7824,23 +8119,13 @@
 
 openConnectionTo:dpyName
     "open a connection to some display;
-     set my displayId if ok; leaves it as nil of not ok"
+     return displayId if ok, nil of not ok"
 
 %{
     Display *dpy;
     int i;
     char *nm;
 
-    if (__INST(displayId) != nil) {
-        /*
-         * already connected - you bad guy try to
-         * trick me manually ?
-         */
-        RETURN ( self );
-    }
-
-
-
     if (__isString(dpyName))
         nm = (char *) __stringVal(dpyName);
     else {
@@ -7852,17 +8137,17 @@
         static int firstCall = 1;
         OBJ dpyID;
 
-        __INST(displayId) = dpyID = __MKEXTERNALADDRESS(dpy); __STORE(self, dpyID);
+        dpyID = __MKEXTERNALADDRESS(dpy);
 
         if (firstCall) {
             firstCall = 0;
             XSetErrorHandler(__XErrorHandler__);
             XSetIOErrorHandler(__XIOErrorHandler__);
         }
-    }
-
-
-%}
+        RETURN (dpyID);
+    }
+%}.
+    ^ nil
 !
 
 reinitialize
@@ -7950,49 +8235,61 @@
 
     |modifierKeyMap maxKeyPerMod ret nextKey|
 
+    modifierKeyMap := self rawModifierMapping.
+    maxKeyPerMod := modifierKeyMap size // 8.
+    modifierKeyMap isNil ifTrue:[^ nil].
+
+    ret := Array new:8.
+    nextKey := 1.
+    1 to:8 do:[ :i |
+        (modifierKeyMap at:nextKey) ~= 0 ifTrue:[
+            |mod|
+
+            mod := OrderedCollection new:maxKeyPerMod.
+            modifierKeyMap from:nextKey to:(nextKey+maxKeyPerMod-1) do:[ :key |
+                key ~= 0 ifTrue:[
+                    mod add:key
+                ].
+            ].
+            ret at:i put:mod.
+        ].
+        nextKey := nextKey+maxKeyPerMod.
+    ].
+
+    ^ ret
+
+    "
+        Display modifierMapping
+    "
+!
+
+rawModifierMapping
+    "Get the raw Modifier Mapping."
+
+    |modifierKeyMap maxKeyPerMod |
+
 %{
     XModifierKeymap *modmap;
     OBJ __BYTEARRAY_UNINITIALIZED_NEW_INT();
 
     if (ISCONNECTED) {
-	Display *dpy = myDpy;
-
-	if ((modmap = XGetModifierMapping(dpy)) != 0) {
-	   maxKeyPerMod = __MKSMALLINT(modmap->max_keypermod);
-	   modifierKeyMap = __BYTEARRAY_UNINITIALIZED_NEW_INT(modmap->max_keypermod * 8);
-	   if (modifierKeyMap != nil) {
-		maxKeyPerMod = __MKSMALLINT(modmap->max_keypermod);
-		memcpy((char *)__ByteArrayInstPtr(modifierKeyMap)->ba_element, 
-		       (char *)modmap->modifiermap, modmap->max_keypermod * 8);
-	   }
-	   XFreeModifiermap(modmap);
-	}
-    }
-%}.
-
-    modifierKeyMap isNil ifTrue:[^ nil].
-
-    ret := Array new:8.
-    nextKey := 1.
-    1 to:8 do:[ :i |
-	(modifierKeyMap at:nextKey) ~= 0 ifTrue:[
-	    |mod|
-
-	    mod := OrderedCollection new:maxKeyPerMod.
-	    modifierKeyMap from:nextKey to:(nextKey+maxKeyPerMod-1) do:[ :key |
-		key ~= 0 ifTrue:[
-		    mod add:key
-		].
-	    ].
-	    ret at:i put:mod.
-	].
-	nextKey := nextKey+maxKeyPerMod.
-    ].
-
-    ^ ret
-
-    "
-	Display modifierMapping
+        Display *dpy = myDpy;
+
+        if ((modmap = XGetModifierMapping(dpy)) != 0) {
+           maxKeyPerMod = __MKSMALLINT(modmap->max_keypermod);
+           modifierKeyMap = __BYTEARRAY_UNINITIALIZED_NEW_INT(modmap->max_keypermod * 8);
+           if (modifierKeyMap != nil) {
+                memcpy((char *)__ByteArrayInstPtr(modifierKeyMap)->ba_element, 
+                       (char *)modmap->modifiermap, modmap->max_keypermod * 8);
+           }
+           XFreeModifiermap(modmap);
+        }
+    }
+%}.
+    ^ modifierKeyMap 
+
+    "
+        Display rawModifierMapping
     "
 !
 
@@ -10224,6 +10521,6 @@
 !XWorkstation class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.349 2000-05-30 20:29:31 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/XWorkstation.st,v 1.350 2000-07-02 12:55:15 cg Exp $'
 ! !
 XWorkstation initialize!