Split off keysym/deadchar -> char mapping, use it in DetectLayout.
diff --git a/windows/x11drv/keyboard.c b/windows/x11drv/keyboard.c
index 3f011ed..e2b8e14 100644
--- a/windows/x11drv/keyboard.c
+++ b/windows/x11drv/keyboard.c
@@ -35,6 +35,8 @@
static int NumLockMask, AltGrMask; /* mask in the XKeyEvent state */
static int kcControl, kcAlt, kcShift, kcNumLock, kcCapsLock; /* keycodes */
+static char KEYBOARD_MapDeadKeysym(KeySym keysym);
+
/* Keyboard translation tables */
#define MAIN_LEN 48
static const int main_key_scan[MAIN_LEN] =
@@ -545,8 +547,9 @@
/* Allow both one-byte and two-byte national keysyms */
if ((keysym < 0x800) && (keysym != ' '))
ckey[i] = keysym & 0xFF;
- else
- ckey[i] = 0;
+ else {
+ ckey[i] = KEYBOARD_MapDeadKeysym(keysym);
+ }
}
if (ckey[0]) {
/* search for a match in layout table */
@@ -933,6 +936,84 @@
}
/***********************************************************************
+ * X11DRV_KEYBOARD_MapDeadKeysym
+ */
+static char KEYBOARD_MapDeadKeysym(KeySym keysym)
+{
+ switch (keysym)
+ {
+ /* symbolic ASCII is the same as defined in rfc1345 */
+#ifdef XK_dead_tilde
+ case XK_dead_tilde :
+#endif
+ case 0x1000FE7E : /* Xfree's XK_Dtilde */
+ return '~'; /* '? */
+#ifdef XK_dead_acute
+ case XK_dead_acute :
+#endif
+ case 0x1000FE27 : /* Xfree's XK_Dacute_accent */
+ return 0xb4; /* '' */
+#ifdef XK_dead_circumflex
+ case XK_dead_circumflex:
+#endif
+ case 0x1000FE5E : /* Xfree's XK_Dcircumflex_accent */
+ return '^'; /* '> */
+#ifdef XK_dead_grave
+ case XK_dead_grave :
+#endif
+ case 0x1000FE60 : /* Xfree's XK_Dgrave_accent */
+ return '`'; /* '! */
+#ifdef XK_dead_diaeresis
+ case XK_dead_diaeresis :
+#endif
+ case 0x1000FE22 : /* Xfree's XK_Ddiaeresis */
+ return 0xa8; /* ': */
+#ifdef XK_dead_cedilla
+ case XK_dead_cedilla :
+ return 0xb8; /* ', */
+#endif
+#ifdef XK_dead_macron
+ case XK_dead_macron :
+ return '-'; /* 'm isn't defined on iso-8859-x */
+#endif
+#ifdef XK_dead_breve
+ case XK_dead_breve :
+ return 0xa2; /* '( */
+#endif
+#ifdef XK_dead_abovedot
+ case XK_dead_abovedot :
+ return 0xff; /* '. */
+#endif
+#ifdef XK_dead_abovering
+ case XK_dead_abovering :
+ return '0'; /* '0 isn't defined on iso-8859-x */
+#endif
+#ifdef XK_dead_doubleacute
+ case XK_dead_doubleacute :
+ return 0xbd; /* '" */
+#endif
+#ifdef XK_dead_caron
+ case XK_dead_caron :
+ return 0xb7; /* '< */
+#endif
+#ifdef XK_dead_ogonek
+ case XK_dead_ogonek :
+ return 0xb2; /* '; */
+#endif
+/* FIXME: I don't know this three.
+ case XK_dead_iota :
+ return 'i';
+ case XK_dead_voiced_sound :
+ return 'v';
+ case XK_dead_semivoiced_sound :
+ return 's';
+*/
+ }
+ TRACE(keyboard,"no character for dead keysym 0x%08lx\n",keysym);
+ return 0;
+}
+
+/***********************************************************************
* X11DRV_KEYBOARD_ToAscii
*
* The ToAscii function translates the specified virtual-key code and keyboard
@@ -1021,91 +1102,7 @@
BYTE dead_char = 0;
((char*)lpChar)[1] = '\0';
- switch (keysym)
- {
- /* symbolic ASCII is the same as defined in rfc1345 */
-#ifdef XK_dead_tilde
- case XK_dead_tilde :
-#endif
- case 0x1000FE7E : /* Xfree's XK_Dtilde */
- dead_char = '~'; /* '? */
- break;
-#ifdef XK_dead_acute
- case XK_dead_acute :
-#endif
- case 0x1000FE27 : /* Xfree's XK_Dacute_accent */
- dead_char = 0xb4; /* '' */
- break;
-#ifdef XK_dead_circumflex
- case XK_dead_circumflex :
-#endif
- case 0x1000FE5E : /* Xfree's XK_Dcircumflex_accent */
- dead_char = '^'; /* '> */
- break;
-#ifdef XK_dead_grave
- case XK_dead_grave :
-#endif
- case 0x1000FE60 : /* Xfree's XK_Dgrave_accent */
- dead_char = '`'; /* '! */
- break;
-#ifdef XK_dead_diaeresis
- case XK_dead_diaeresis :
-#endif
- case 0x1000FE22 : /* Xfree's XK_Ddiaeresis */
- dead_char = 0xa8; /* ': */
- break;
-#ifdef XK_dead_cedilla
- case XK_dead_cedilla :
- dead_char = 0xb8; /* ', */
- break;
-#endif
-#ifdef XK_dead_macron
- case XK_dead_macron :
- dead_char = '-'; /* 'm isn't defined on iso-8859-x */
- break;
-#endif
-#ifdef XK_dead_breve
- case XK_dead_breve :
- dead_char = 0xa2; /* '( */
- break;
-#endif
-#ifdef XK_dead_abovedot
- case XK_dead_abovedot :
- dead_char = 0xff; /* '. */
- break;
-#endif
-#ifdef XK_dead_abovering
- case XK_dead_abovering :
- dead_char = '0'; /* '0 isn't defined on iso-8859-x */
- break;
-#endif
-#ifdef XK_dead_doubleacute
- case XK_dead_doubleacute :
- dead_char = 0xbd; /* '" */
- break;
-#endif
-#ifdef XK_dead_caron
- case XK_dead_caron :
- dead_char = 0xb7; /* '< */
- break;
-#endif
-#ifdef XK_dead_ogonek
- case XK_dead_ogonek :
- dead_char = 0xb2; /* '; */
- break;
-#endif
-/* FIXME: I don't know this three.
- case XK_dead_iota :
- dead_char = 'i';
- break;
- case XK_dead_voiced_sound :
- dead_char = 'v';
- break;
- case XK_dead_semivoiced_sound :
- dead_char = 's';
- break;
-*/
- }
+ dead_char = KEYBOARD_MapDeadKeysym(keysym);
if (dead_char)
{
*(char*)lpChar = dead_char;