--- sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/18 18:28:12 66 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/30 07:18:48 82 @@ -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 @@ -53,8 +54,7 @@ } DEBUG_KBD("Adding translation, keysym=0x%x, scancode=0x%x, " - "modifiers=0x%x\n", (unsigned int) keysym, scancode, - modifiers); + "modifiers=0x%x\n", (unsigned int) keysym, scancode, modifiers); keymap[keysym & KEYMAP_MASK].scancode = scancode; keymap[keysym & KEYMAP_MASK].modifiers = modifiers; @@ -120,6 +120,14 @@ continue; } + /* compose */ + if (strncmp(line, "enable_compose", 15) == 0) + { + DEBUG_KBD("Enabling compose handling\n"); + enable_compose = True; + continue; + } + /* Comment */ if (line[0] == '#') { @@ -131,8 +139,7 @@ p = strchr(line, ' '); if (p == NULL) { - error("Bad line %d in keymap %s\n", line_num, - mapname); + error("Bad line %d in keymap %s\n", line_num, mapname); continue; } else @@ -163,6 +170,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 +218,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 @@ -225,8 +247,7 @@ return tr; } - printf("No translation for (keysym 0x%lx, %s)\n", keysym, - get_ksname(keysym)); + printf("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym)); /* not in keymap, try to interpret the raw scancode */ if ((keycode >= min_keycode) && (keycode <= 0x60)) @@ -253,6 +274,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; @@ -316,14 +341,12 @@ if (MASK_HAS_BITS(tr.modifiers, MapShiftMask)) { /* Needs this modifier. Send down. */ - rdp_send_scancode(ev_time, RDP_KEYPRESS, - SCANCODE_CHAR_LSHIFT); + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LSHIFT); } else { /* Should not use this modifier. Send up. */ - rdp_send_scancode(ev_time, RDP_KEYRELEASE, - SCANCODE_CHAR_LSHIFT); + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT); } } @@ -335,14 +358,12 @@ if (MASK_HAS_BITS(tr.modifiers, MapAltGrMask)) { /* Needs this modifier. Send down. */ - rdp_send_scancode(ev_time, RDP_KEYPRESS, - SCANCODE_CHAR_RALT); + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_RALT); } else { /* Should not use this modifier. Send up. */ - rdp_send_scancode(ev_time, RDP_KEYRELEASE, - SCANCODE_CHAR_RALT); + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT); } } @@ -355,18 +376,14 @@ if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)) { /* Needs this modifier. Toggle */ - rdp_send_scancode(ev_time, RDP_KEYPRESS, - SCANCODE_CHAR_NUMLOCK); - rdp_send_scancode(ev_time, RDP_KEYRELEASE, - SCANCODE_CHAR_NUMLOCK); + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_NUMLOCK); + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_NUMLOCK); } else { /* Should not use this modifier. Toggle */ - rdp_send_scancode(ev_time, RDP_KEYPRESS, - SCANCODE_CHAR_NUMLOCK); - rdp_send_scancode(ev_time, RDP_KEYRELEASE, - SCANCODE_CHAR_NUMLOCK); + rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_NUMLOCK); + rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_NUMLOCK); } } @@ -382,36 +399,28 @@ switch (modifiers) { case SCANCODE_CHAR_LSHIFT: - MASK_CHANGE_BIT(remote_modifier_state, - MapLeftShiftMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapLeftShiftMask, pressed); break; case SCANCODE_CHAR_RSHIFT: - MASK_CHANGE_BIT(remote_modifier_state, - MapRightShiftMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapRightShiftMask, pressed); break; case SCANCODE_CHAR_LCTRL: - MASK_CHANGE_BIT(remote_modifier_state, - MapLeftCtrlMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapLeftCtrlMask, pressed); break; case SCANCODE_CHAR_RCTRL: - MASK_CHANGE_BIT(remote_modifier_state, - MapRightCtrlMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapRightCtrlMask, pressed); break; case SCANCODE_CHAR_LALT: - MASK_CHANGE_BIT(remote_modifier_state, MapLeftAltMask, - pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapLeftAltMask, pressed); break; case SCANCODE_CHAR_RALT: - MASK_CHANGE_BIT(remote_modifier_state, - MapRightAltMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapRightAltMask, pressed); break; case SCANCODE_CHAR_LWIN: - MASK_CHANGE_BIT(remote_modifier_state, MapLeftWinMask, - pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapLeftWinMask, pressed); break; case SCANCODE_CHAR_RWIN: - MASK_CHANGE_BIT(remote_modifier_state, - MapRightWinMask, pressed); + MASK_CHANGE_BIT(remote_modifier_state, MapRightWinMask, pressed); break; case SCANCODE_CHAR_NUMLOCK: /* KeyReleases for NumLocks are sent immediately. Toggle the @@ -421,16 +430,13 @@ BOOL newNumLockState; newNumLockState = (MASK_HAS_BITS - (remote_modifier_state, - MapNumLockMask) == False); + (remote_modifier_state, MapNumLockMask) == False); MASK_CHANGE_BIT(remote_modifier_state, - MapNumLockMask, - newNumLockState); + MapNumLockMask, newNumLockState); } break; } - DEBUG_KBD("After updating modifier_state:0x%x\n", - remote_modifier_state); + DEBUG_KBD("After updating modifier_state:0x%x\n", remote_modifier_state); } @@ -449,8 +455,7 @@ } else { - DEBUG_KBD("Sending scancode=0x%x, flags=0x%x\n", scancode, - flags); + DEBUG_KBD("Sending scancode=0x%x, flags=0x%x\n", scancode, flags); rdp_send_input(time, RDP_INPUT_SCANCODE, flags, scancode, 0); } }