Fix a bug in VkKeyScan.
diff --git a/dlls/x11drv/keyboard.c b/dlls/x11drv/keyboard.c
index 0c60fe1..8a8b80f 100644
--- a/dlls/x11drv/keyboard.c
+++ b/dlls/x11drv/keyboard.c
@@ -1501,48 +1501,67 @@
*/
WORD X11DRV_VkKeyScan(CHAR cChar)
{
- Display *display = thread_display();
- KeyCode keycode;
- KeySym keysym;
- int i,index;
- int highbyte=0;
+ Display *display = thread_display();
+ KeyCode keycode;
+ KeySym keysym;
+ int i, index;
+ SHORT ret;
- /* char->keysym (same for ANSI chars) */
- keysym=(unsigned char) cChar;/* (!) cChar is signed */
- if (keysym<=27) keysym+=0xFF00;/*special chars : return, backspace...*/
+ /* char->keysym (same for ANSI chars) */
+ keysym = (unsigned char)cChar; /* (!) cChar is signed */
+ if (keysym <= 27) keysym += 0xFF00; /* special chars : return, backspace... */
- keycode = TSXKeysymToKeycode(display, keysym); /* keysym -> keycode */
- if (!keycode)
- { /* It didn't work ... let's try with deadchar code. */
- keycode = TSXKeysymToKeycode(display, keysym | 0xFE00);
- }
+ keycode = TSXKeysymToKeycode(display, keysym); /* keysym -> keycode */
+ if (!keycode)
+ { /* It didn't work ... let's try with deadchar code. */
+ TRACE("retrying with | 0xFE00\n");
+ keycode = TSXKeysymToKeycode(display, keysym | 0xFE00);
+ }
- TRACE("'%c'(%#lx, %lu): got keycode %#.2x\n",
- cChar,keysym,keysym,keycode);
+ TRACE("'%c'(%#lx, %lu): got keycode %#.2x (%d)\n",
+ cChar, keysym, keysym, keycode, keycode);
- if (keycode)
- {
- for (index=-1, i=0; (i<8) && (index<0); i++) /* find shift state */
- if (TSXKeycodeToKeysym(display,keycode,i)==keysym) index=i;
- switch (index) {
- case -1 :
- WARN("Keysym %lx not found while parsing the keycode table\n",keysym); break;
- case 0 : break;
- case 1 : highbyte = 0x0100; break;
- case 2 : highbyte = 0x0600; break;
- case 3 : highbyte = 0x0700; break;
- default : ERR("index %d found by XKeycodeToKeysym. please report! \n",index);
- }
- /*
- index : 0 adds 0x0000
- index : 1 adds 0x0100 (shift)
- index : ? adds 0x0200 (ctrl)
- index : 2 adds 0x0600 (ctrl+alt)
- index : 3 adds 0x0700 (ctrl+alt+shift)
- */
- }
- TRACE(" ... returning %#.2x\n", keyc2vkey[keycode]+highbyte);
- return keyc2vkey[keycode]+highbyte; /* keycode -> (keyc2vkey) vkey */
+ /* keycode -> (keyc2vkey) vkey */
+ ret = keyc2vkey[keycode];
+
+ if (!keycode || !ret)
+ {
+ TRACE("keycode for '%c' not found, returning -1\n", cChar);
+ return -1;
+ }
+
+ index = -1;
+ for (i = 0; i < 4; i++) /* find shift state */
+ {
+ if (TSXKeycodeToKeysym(display, keycode, i) == keysym)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ switch (index)
+ {
+ default:
+ case -1:
+ WARN("Keysym %lx not found while parsing the keycode table\n", keysym);
+ return -1;
+
+ case 0: break;
+ case 1: ret += 0x0100; break;
+ case 2: ret += 0x0600; break;
+ case 3: ret += 0x0700; break;
+ }
+ /*
+ index : 0 adds 0x0000
+ index : 1 adds 0x0100 (shift)
+ index : ? adds 0x0200 (ctrl)
+ index : 2 adds 0x0600 (ctrl+alt)
+ index : 3 adds 0x0700 (ctrl+alt+shift)
+ */
+
+ TRACE(" ... returning %#.2x\n", ret);
+ return ret;
}
/***********************************************************************