Index: dlls/x11drv/keyboard.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/keyboard.c,v
retrieving revision 1.11
diff -u -p -r1.11 keyboard.c
--- dlls/x11drv/keyboard.c	10 Oct 2002 23:30:13 -0000	1.11
+++ dlls/x11drv/keyboard.c	14 Oct 2002 21:43:34 -0000
@@ -1773,17 +1773,61 @@ INT X11DRV_ToUnicode(UINT virtKey, UINT 
 	    }
 	else
 	    {
-	    char	*ksname;
-
-	    ksname = TSXKeysymToString(keysym);
-	    if (!ksname)
-		ksname = "No Name";
-	    if ((keysym >> 8) != 0xff)
+		if ((keysym >> 8) != 0xff)
 		{
-		ERR("Please report: no char for keysym %04lX (%s) :\n",
-                    keysym, ksname);
-		ERR("(virtKey=%X,scanCode=%X,keycode=%X,state=%X)\n",
-                    virtKey, scanCode, e.keycode, e.state);
+		    unsigned char byte3 = (unsigned char )(keysym >> 8);
+		    UINT cp = 0;
+		    switch (byte3) {
+			case 0: // Latin 1
+			case 1: // Latin 2
+			case 2: // Latin 3
+			case 3: // Latin 4
+			case 5: // arabic
+			    cp = 28591 + byte3; break;
+			case 4: // kana
+			    break;
+			case 6: // Cyrillic
+			    cp = 28595; break;
+			case 7: //greek
+			    cp = 28597; break;
+			case 8: // Technical
+			case 9: // Special
+			case 10: // Publishing
+			case 11: // APL
+			    break;
+			case 12: // Hebrew
+			    cp = 28598; break;
+			case 13: // Thai
+			    cp = 874; break; // not ISO
+			case 14: // Korean, no mapping
+			    cp = 949; break; // not ISO
+			case 18: // Latin 8
+			    cp = 28604; break;
+			case 19: // Latin 9
+			    cp = 28605; break;
+			case 20: // Armenian
+			case 21: // Gregorian
+			case 22: // Azeri
+			case 30: // Vietnamese
+			case 32: // Currency
+			    break;
+		    }
+		    if (cp)
+		    {
+			BYTE key_char = keysym & 0xff;
+			ret = MultiByteToWideChar(cp, 0, &key_char, 1, bufW, bufW_size);
+		    }
+		    else
+		    {
+			char        *ksname;
+			ksname = TSXKeysymToString(keysym);
+			if (!ksname)
+			    ksname = "No Name";
+			ERR("Please report: no char for keysym %04lX (%s) :\n",
+				keysym, ksname);
+			ERR("(virtKey=%X,scanCode=%X,keycode=%X,state=%X)\n",
+				virtKey, scanCode, e.keycode, e.state);
+		    }
 		}
 	    }
 	}
