XWorkstation.st
branchjv
changeset 8038 c7cab63f9ec9
parent 7803 14d6df784ebb
child 8075 00b6d158ab89
--- a/XWorkstation.st	Sun May 14 21:48:34 2017 +0200
+++ b/XWorkstation.st	Thu May 25 09:42:28 2017 +0100
@@ -63,7 +63,6 @@
 
 !XWorkstation primitiveDefinitions!
 %{
-
 #define SUPPORT_MOTIF_WM_HINTS
 
 #ifdef LINUX
@@ -116,6 +115,12 @@
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 
+/*
+ * To get XKeysymToUnicode(), not provided by Xlib...
+ */
+#include "xkeysymtounicode.h"
+
+
 #define XK_MISCELLANY
 #include <X11/keysymdef.h>
 
@@ -6143,9 +6148,9 @@
     int evMask, returnValue;
     XEvent ev;
     OBJ eB;
-    KeySym keySym;
+    KeySym keySym = NoSymbol;
     unsigned char buffer[64];
-    int i, nchars;
+    int i, nchars, codepoint; 
     char *keySymString;
     OBJ arg, sym, t, windowID;
 
@@ -6238,18 +6243,16 @@
 
 	keyPressAndRelease:
 	    arg = nil;
-	    nchars = XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
-	    if (nchars == 1 && (((buffer[0] >= ' ') && (buffer[0] <= '~'))
-		|| (buffer[0] >= 0x80))) {
-		arg = __MKCHARACTER(buffer[0]);
-//            } else if (nchars > 2) {
-//                arg = __MKSTRING_L(buffer, nchars);
+	    XLookupString(ke, (char *)buffer, sizeof(buffer), &keySym, NULL);
+	    codepoint = XKeysymToUnicode(keySym);	    
+	    if ( codepoint ) {
+	    	arg = __MKUCHARACTER( codepoint );
 	    } else {
 		keySymString = XKeysymToString(keySym);
-		if (keySymString) {
+		if (keySymString) {		    
 		    arg = __MKSYMBOL(keySymString, 0);
 		}
-	    }
+	    }	   
 
 #ifdef IGNORE_UNKNOWN_KEYCODES
 	    if (arg == nil) {