--- sourceforge.net/trunk/rdesktop/xkeymap.c 2005/08/02 15:07:35 949 +++ sourceforge.net/trunk/rdesktop/xkeymap.c 2005/08/02 18:15:07 952 @@ -54,6 +54,20 @@ static void update_modifier_state(uint8 scancode, BOOL pressed); +/* Free key_translation structure, included linked list */ +void +free_key_translation(key_translation * ptr) +{ + key_translation *next; + + while (ptr) + { + next = ptr->next; + xfree(ptr); + ptr = next; + } +} + static void add_to_keymap(char *keyname, uint8 scancode, uint16 modifiers, char *mapname) { @@ -74,6 +88,7 @@ memset(tr, 0, sizeof(key_translation)); tr->scancode = scancode; tr->modifiers = modifiers; + free_key_translation(keymap[keysym & KEYMAP_MASK]); keymap[keysym & KEYMAP_MASK] = tr; return; @@ -106,6 +121,7 @@ DEBUG_KBD(("Adding sequence for keysym (0x%lx, %s) -> ", keysym, keyname)); + free_key_translation(keymap[keysym & KEYMAP_MASK]); prev_next = &keymap[keysym & KEYMAP_MASK]; while (*rest) @@ -139,7 +155,6 @@ DEBUG_KBD(("\n")); } - static BOOL xkeymap_read(char *mapname) { @@ -364,8 +379,7 @@ } } -/* Handles, for example, multi-scancode keypresses (which is not - possible via keymap-files) */ +/* Handle special key combinations */ BOOL handle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, BOOL pressed) {