--- sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/18 18:28:12 66 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2002/07/31 06:49:34 85 @@ -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 @@ -52,9 +53,8 @@ return; } - DEBUG_KBD("Adding translation, keysym=0x%x, scancode=0x%x, " - "modifiers=0x%x\n", (unsigned int) keysym, scancode, - modifiers); + DEBUG_KBD(("Adding translation, keysym=0x%x, scancode=0x%x, " + "modifiers=0x%x\n", (unsigned int) keysym, scancode, modifiers)); keymap[keysym & KEYMAP_MASK].scancode = scancode; keymap[keysym & KEYMAP_MASK].modifiers = modifiers; @@ -116,7 +116,15 @@ if (strncmp(line, "map ", 4) == 0) { keylayout = strtol(line + 4, NULL, 16); - DEBUG_KBD("Keylayout 0x%x\n", keylayout); + DEBUG_KBD(("Keylayout 0x%x\n", keylayout)); + continue; + } + + /* compose */ + if (strncmp(line, "enable_compose", 15) == 0) + { + DEBUG_KBD(("Enabling compose handling\n")); + enable_compose = True; continue; } @@ -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,27 +218,36 @@ 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 - ("Found key translation, scancode=0x%x, modifiers=0x%x\n", - tr.scancode, tr.modifiers); + (("Found key translation, scancode=0x%x, modifiers=0x%x\n", + tr.scancode, tr.modifiers)); 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); } } @@ -351,22 +372,18 @@ != MASK_HAS_BITS(remote_modifier_state, MapNumLockMask)) { /* The remote modifier state is not correct */ - DEBUG_KBD("Remote NumLock state is incorrect. Toggling\n"); + DEBUG_KBD(("Remote NumLock state is incorrect. Toggling\n")); 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); } } @@ -377,41 +394,33 @@ update_modifier_state(uint16 modifiers, BOOL pressed) { - DEBUG_KBD("Before updating modifier_state:0x%x, pressed=0x%x\n", - remote_modifier_state, pressed); + DEBUG_KBD(("Before updating modifier_state:0x%x, pressed=0x%x\n", + remote_modifier_state, pressed)); 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)); } @@ -442,15 +448,14 @@ if (scancode & SCANCODE_EXTENDED) { - DEBUG_KBD("Sending extended scancode=0x%x, flags=0x%x\n", - scancode & ~SCANCODE_EXTENDED, flags); + DEBUG_KBD(("Sending extended scancode=0x%x, flags=0x%x\n", + scancode & ~SCANCODE_EXTENDED, flags)); rdp_send_input(time, RDP_INPUT_SCANCODE, flags | KBD_FLAG_EXT, scancode & ~SCANCODE_EXTENDED, 0); } 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); } }