winex11.drv: Windows always generates VK_DECIMAL for Del/. on a keypad.

Dmitry Timoshkov dmitry at baikal.ru
Mon Apr 9 01:08:50 CDT 2012


Windows always generates VK_DECIMAL for Del/. on a keypad while some
X11 keyboard layouts generate XK_KP_Separator instead of XK_KP_Decimal
in order to produce a locale dependent numeric separator.

X11 handles XK_KP_Separator same way as XK_KP_Decimal for all tested
keyboard layouts, so passing XK_KP_Separator instead of XK_KP_Decimal
to XKeysymToKeycode doesn't break things. Pressing Del/. with NumLock
turned on still correctly generates '.' or ',' depending on keyboard
layout and matches what Windows does.

This patch fixes an application which uses VK_DECIMAL as a sign to break
the input string and insert a separator while entering a currency/price.
---
 dlls/winex11.drv/keyboard.c |   23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 3b91d8f..090eae4 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -994,7 +994,11 @@ static const WORD nonchar_key_vkey[256] =
     VK_END, VK_CLEAR, VK_INSERT, VK_DELETE,
     0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFA0 */
     0, 0, VK_MULTIPLY, VK_ADD,                                  /* FFA8 */
-    VK_SEPARATOR, VK_SUBTRACT, VK_DECIMAL, VK_DIVIDE,
+    /* Windows always generates VK_DECIMAL for Del/. on keypad while some
+     * X11 keyboard layouts generate XK_KP_Separator instead of XK_KP_Decimal
+     * in order to produce a locale dependent numeric separator.
+     */
+    VK_DECIMAL, VK_SUBTRACT, VK_DECIMAL, VK_DIVIDE,
     VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,             /* FFB0 */
     VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
     VK_NUMPAD8, VK_NUMPAD9, 0, 0, 0, VK_OEM_NEC_EQUAL,          /* FFB8 */
@@ -2211,8 +2215,12 @@ UINT CDECL X11DRV_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl)
 			if ((wCode>=VK_NUMPAD0) && (wCode<=VK_NUMPAD9))
 			  e.keycode = XKeysymToKeycode(e.display, wCode-VK_NUMPAD0+XK_KP_0);
 
-			if (wCode==VK_DECIMAL)
-			  e.keycode = XKeysymToKeycode(e.display, XK_KP_Decimal);
+                        /* Windows always generates VK_DECIMAL for Del/. on keypad while some
+                         * X11 keyboard layouts generate XK_KP_Separator instead of XK_KP_Decimal
+                         * in order to produce a locale dependent numeric separator.
+                         */
+			if (wCode == VK_DECIMAL || wCode == VK_SEPARATOR)
+			  e.keycode = XKeysymToKeycode(e.display, XK_KP_Separator);
 
 			if (!e.keycode)
 			{
@@ -2545,10 +2553,11 @@ INT CDECL X11DRV_ToUnicodeEx(UINT virtKey, UINT scanCode, const BYTE *lpKeyState
     if ((virtKey>=VK_NUMPAD0) && (virtKey<=VK_NUMPAD9))
         e.keycode = XKeysymToKeycode(e.display, virtKey-VK_NUMPAD0+XK_KP_0);
 
-    if (virtKey==VK_DECIMAL)
-        e.keycode = XKeysymToKeycode(e.display, XK_KP_Decimal);
-
-    if (virtKey==VK_SEPARATOR)
+    /* Windows always generates VK_DECIMAL for Del/. on keypad while some
+     * X11 keyboard layouts generate XK_KP_Separator instead of XK_KP_Decimal
+     * in order to produce a locale dependent numeric separator.
+     */
+    if (virtKey == VK_DECIMAL || virtKey == VK_SEPARATOR)
         e.keycode = XKeysymToKeycode(e.display, XK_KP_Separator);
 
     if (!e.keycode && virtKey != VK_NONAME)
-- 
1.7.9.4




More information about the wine-patches mailing list