static void add_sequence(char *rest, char *mapname) { KeySym keysym; key_translation *tr, **prev_next; size_t chars; char keyname[KEYMAP_MAX_LINE_LENGTH]; /* Skip over whitespace after the sequence keyword */ chars = strspn(rest, " \t"); rest += chars; /* Fetch the keysym name */ chars = strcspn(rest, " \t\0"); STRNCPY(keyname, rest, chars + 1); rest += chars; keysym = XStringToKeysym(keyname); if (keysym == NoSymbol) { DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname, mapname)); return; } 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) { /* Skip whitespace */ chars = strspn(rest, " \t"); rest += chars; /* Fetch the keysym name */ chars = strcspn(rest, " \t\0"); STRNCPY(keyname, rest, chars + 1); rest += chars; keysym = XStringToKeysym(keyname); if (keysym == NoSymbol) { DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname, mapname)); return; } /* Allocate space for key_translation structure */ tr = (key_translation *) xmalloc(sizeof(key_translation)); memset(tr, 0, sizeof(key_translation)); *prev_next = tr; prev_next = &tr->next; tr->seq_keysym = keysym; DEBUG_KBD(("0x%x, ", (unsigned int) keysym)); } DEBUG_KBD(("\n")); }
static void add_to_keymap(char *keyname, uint8 scancode, uint16 modifiers, char *mapname) { KeySym keysym; key_translation *tr; keysym = XStringToKeysym(keyname); if (keysym == NoSymbol) { DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring)\n", keyname, mapname)); return; } DEBUG_KBD(("Adding translation, keysym=0x%x, scancode=0x%x, " "modifiers=0x%x\n", (unsigned int) keysym, scancode, modifiers)); tr = (key_translation *) xmalloc(sizeof(key_translation)); 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; }
/* Free the key_translation_entry for a given keysym and remove from the table */ static void delete_key_translation_entry(KeySym keysym) { uint32 hash; key_translation_entry *ptr; key_translation_entry *next; key_translation_entry *prev; key_translation_entry tmp; /* Faking a prev node allows us to keep the algorithm simple */ hash = keysym & KEYMAP_MASK; ptr = keymap[hash]; tmp.next = ptr; prev = &tmp; while (ptr) { next = ptr->next; if (ptr->keysym == keysym) { free_key_translation(ptr->tr); prev->next = next; xfree(ptr); } else { prev = ptr; } ptr = next; } /* Copy pointer back from our fake node */ keymap[hash] = tmp.next; }