--- sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/18 18:28:12 66 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/29 20:17:10 77 @@ -35,9 +35,10 @@ extern Display *display; extern char keymapname[16]; extern int keylayout; +extern BOOL enable_compose; static key_translation keymap[KEYMAP_SIZE]; -static unsigned int min_keycode; +static int min_keycode; static uint16 remote_modifier_state = 0; static void @@ -120,6 +121,14 @@ continue; } + /* compose */ + if (strncmp(line, "enable_compose", 15) == 0) + { + DEBUG_KBD("Enabling compose handling\n"); + enable_compose = True; + continue; + } + /* Comment */ if (line[0] == '#') { @@ -163,6 +172,11 @@ MASK_ADD_BITS(modifiers, MapNumLockMask); } + if (strstr(line_rest, "localstate")) + { + MASK_ADD_BITS(modifiers, MapLocalStateMask); + } + add_to_keymap(keyname, scancode, modifiers, mapname); if (strstr(line_rest, "addupper")) @@ -206,17 +220,27 @@ xkeymap_init2(void) { unsigned int max_keycode; - XDisplayKeycodes(display, &min_keycode, &max_keycode); + XDisplayKeycodes(display, &min_keycode, (int *) &max_keycode); } key_translation -xkeymap_translate_key(KeySym keysym, unsigned int keycode) +xkeymap_translate_key(KeySym keysym, unsigned int keycode, unsigned int state) { key_translation tr = { 0, 0 }; tr = keymap[keysym & KEYMAP_MASK]; + if (tr.modifiers & MapLocalStateMask) + { + /* The modifiers to send for this key should be obtained + from the local state. Currently, only shift is implemented. */ + if (state & ShiftMask) + { + tr.modifiers = MapLeftShiftMask; + } + } + if (tr.scancode != 0) { DEBUG_KBD @@ -253,6 +277,10 @@ return MOUSE_FLAG_BUTTON3; case Button3: /* right */ return MOUSE_FLAG_BUTTON2; + case Button4: /* wheel up */ + return MOUSE_FLAG_BUTTON4; + case Button5: /* wheel down */ + return MOUSE_FLAG_BUTTON5; } return 0;