Alexandre Julliard : winex11.drv: Only load the keycode->
keysym mapping once in DetectLayout,
instead of once per supported layout.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Nov 8 06:41:52 CST 2006
Module: wine
Branch: master
Commit: 4026dfa8f4d1dfe50f505cab41aa6f1c8322d7d6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4026dfa8f4d1dfe50f505cab41aa6f1c8322d7d6
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Nov 7 17:22:52 2006 +0100
winex11.drv: Only load the keycode->keysym mapping once in DetectLayout, instead of once per supported layout.
---
dlls/winex11.drv/keyboard.c | 51 +++++++++++++++++++++++-------------------
1 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 9b3bdeb..5a6df8f 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -1449,31 +1449,24 @@ X11DRV_KEYBOARD_DetectLayout (void)
const char (*lkey)[MAIN_LEN][4];
unsigned max_seq = 0;
int max_score = 0, ismatch = 0;
- char ckey[4] =
- {0, 0, 0, 0};
+ char ckey[256][4];
syms = keysyms_per_keycode;
if (syms > 4) {
WARN("%d keysyms per keycode not supported, set to 4\n", syms);
syms = 4;
}
- for (current = 0; main_key_tab[current].comment; current++) {
- TRACE("Attempting to match against \"%s\"\n", main_key_tab[current].comment);
- match = 0;
- mismatch = 0;
- score = 0;
- seq = 0;
- lkey = main_key_tab[current].key;
- pkey = -1;
- for (keyc = min_keycode; keyc <= max_keycode; keyc++) {
+
+ memset( ckey, 0, sizeof(ckey) );
+ for (keyc = min_keycode; keyc <= max_keycode; keyc++) {
/* get data for keycode from X server */
for (i = 0; i < syms; i++) {
- keysym = XKeycodeToKeysym (display, keyc, i);
+ if (!(keysym = XKeycodeToKeysym (display, keyc, i))) continue;
/* Allow both one-byte and two-byte national keysyms */
if ((keysym < 0x8000) && (keysym != ' '))
{
#ifdef HAVE_XKB
- if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[i], 1, NULL))
+ if (!use_xkb || !XkbTranslateKeySym(display, &keysym, 0, &ckey[keyc][i], 1, NULL))
#endif
{
TRACE("XKB could not translate keysym %ld\n", keysym);
@@ -1481,14 +1474,25 @@ #endif
* with appropriate ShiftMask and Mode_switch, use XLookupString
* to get character in the local encoding.
*/
- ckey[i] = keysym & 0xFF;
+ ckey[keyc][i] = keysym & 0xFF;
}
}
else {
- ckey[i] = KEYBOARD_MapDeadKeysym(keysym);
+ ckey[keyc][i] = KEYBOARD_MapDeadKeysym(keysym);
}
}
- if (ckey[0]) {
+ }
+
+ for (current = 0; main_key_tab[current].comment; current++) {
+ TRACE("Attempting to match against \"%s\"\n", main_key_tab[current].comment);
+ match = 0;
+ mismatch = 0;
+ score = 0;
+ seq = 0;
+ lkey = main_key_tab[current].key;
+ pkey = -1;
+ for (keyc = min_keycode; keyc <= max_keycode; keyc++) {
+ if (ckey[keyc][0]) {
/* search for a match in layout table */
/* right now, we just find an absolute match for defined positions */
/* (undefined positions are ignored, so if it's defined as "3#" in */
@@ -1496,9 +1500,9 @@ #endif
/* however, the score will be higher for longer matches */
for (key = 0; key < MAIN_LEN; key++) {
for (ok = 0, i = 0; (ok >= 0) && (i < syms); i++) {
- if ((*lkey)[key][i] && ((*lkey)[key][i] == ckey[i]))
+ if ((*lkey)[key][i] && ((*lkey)[key][i] == ckey[keyc][i]))
ok++;
- if ((*lkey)[key][i] && ((*lkey)[key][i] != ckey[i]))
+ if ((*lkey)[key][i] && ((*lkey)[key][i] != ckey[keyc][i]))
ok = -1;
}
if (ok > 0) {
@@ -1514,11 +1518,12 @@ #endif
pkey = key;
} else {
/* print spaces instead of \0's */
- for (i = 0; i < sizeof(ckey); i++) if (!ckey[i]) ckey[i] = ' ';
- TRACE_(key)("mismatch for keysym 0x%04lX, keycode %d, got %c%c%c%c\n",
- keysym, keyc, ckey[0], ckey[1], ckey[2], ckey[3]);
- mismatch++;
- score -= syms;
+ char str[5];
+ for (i = 0; i < 4; i++) str[i] = ckey[keyc][i] ? ckey[keyc][i] : ' ';
+ str[4] = 0;
+ TRACE_(key)("mismatch for keysym 0x%04lX, keycode %d, got %s\n", keysym, keyc, str );
+ mismatch++;
+ score -= syms;
}
}
}
More information about the wine-cvs
mailing list