Index: ChangeLog =================================================================== RCS file: /cvs/gnome/vino/ChangeLog,v retrieving revision 1.175 diff -u -p -r1.175 ChangeLog --- ChangeLog 30 Nov 2006 19:11:48 -0000 1.175 +++ ChangeLog 6 Dec 2006 10:02:54 -0000 @@ -0,0 +1,13 @@ +2006-12-06 Mark McLoughlin + + Fix broken keyboard handling on Xsun by making use of + Xlib's strange "guess lowercase keysym from upper-case + keycode mapping" logic in XKeycodeToKeysym() + + Based on patch from Halton Huo in + bug #369884 + + * server/vino-input.c: (vino_input_initialize_keycodes): use + XKeycodeToKeysym() rather than XGetKeyboardMapping() to build + our keysym->keycode mapping. + Index: server/vino-input.c =================================================================== RCS file: /cvs/gnome/vino/server/vino-input.c,v retrieving revision 1.5 diff -u -p -r1.5 vino-input.c --- server/vino-input.c 16 Nov 2005 08:18:43 -0000 1.5 +++ server/vino-input.c 6 Dec 2006 10:02:54 -0000 @@ -95,7 +95,6 @@ vino_input_initialize_keycodes (GdkDispl Display *xdisplay; int min_keycodes, max_keycodes; int keysyms_per_keycode; - KeySym *keymap; int keycode; xdisplay = GDK_DISPLAY_XDISPLAY (display); @@ -108,26 +107,19 @@ vino_input_initialize_keycodes (GdkDispl g_assert (min_keycodes >= 8); g_assert (max_keycodes <= 255); - keymap = XGetKeyboardMapping (xdisplay, - min_keycodes, - max_keycodes - min_keycodes + 1, - &keysyms_per_keycode); - - g_assert (keymap != NULL); + XGetKeyboardMapping (xdisplay, min_keycodes, 0, &keysyms_per_keycode); dprintf (INPUT, "Initializing keysym to keycode/modifier mapping\n"); for (keycode = min_keycodes; keycode < max_keycodes; keycode++) { - int keycode_index = (keycode - min_keycodes) * keysyms_per_keycode; guint8 modifier; for (modifier = 0; modifier < keysyms_per_keycode; modifier++) { - guint32 keysym = keymap [keycode_index + modifier]; + guint32 keysym = XKeycodeToKeysym (xdisplay, keycode, modifier); - if (VINO_IS_LATIN1_KEYSYM (keysym) && - XKeysymToKeycode (xdisplay, keysym) == keycode) + if (VINO_IS_LATIN1_KEYSYM (keysym)) { if (global_input_data.keycodes [keysym] != 0) continue; @@ -139,8 +131,6 @@ vino_input_initialize_keycodes (GdkDispl } } } - - XFree (keymap); global_input_data.left_shift_keycode = XKeysymToKeycode (xdisplay, XK_Shift_L); global_input_data.right_shift_keycode = XKeysymToKeycode (xdisplay, XK_Shift_R);