mirror of
https://github.com/tmux/tmux.git
synced 2024-12-13 01:48:47 +00:00
Common function to free key bindings.
This commit is contained in:
parent
7c6c66cc3c
commit
73b8c2ef3c
@ -85,6 +85,14 @@ key_bindings_cmp(struct key_binding *bd1, struct key_binding *bd2)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
key_bindings_free(struct key_table *table, struct key_binding *bd)
|
||||
{
|
||||
RB_REMOVE(key_bindings, &table->key_bindings, bd);
|
||||
cmd_list_free(bd->cmdlist);
|
||||
free(bd);
|
||||
}
|
||||
|
||||
struct key_table *
|
||||
key_bindings_get_table(const char *name, int create)
|
||||
{
|
||||
@ -126,11 +134,8 @@ key_bindings_unref_table(struct key_table *table)
|
||||
if (--table->references != 0)
|
||||
return;
|
||||
|
||||
RB_FOREACH_SAFE(bd, key_bindings, &table->key_bindings, bd1) {
|
||||
RB_REMOVE(key_bindings, &table->key_bindings, bd);
|
||||
cmd_list_free(bd->cmdlist);
|
||||
free(bd);
|
||||
}
|
||||
RB_FOREACH_SAFE(bd, key_bindings, &table->key_bindings, bd1)
|
||||
key_bindings_free(table, bd);
|
||||
|
||||
free((void *)table->name);
|
||||
free(table);
|
||||
@ -162,17 +167,13 @@ key_bindings_add(const char *name, key_code key, int repeat,
|
||||
struct cmd_list *cmdlist)
|
||||
{
|
||||
struct key_table *table;
|
||||
struct key_binding bd_find, *bd;
|
||||
struct key_binding *bd;
|
||||
|
||||
table = key_bindings_get_table(name, 1);
|
||||
|
||||
bd_find.key = (key & ~KEYC_XTERM);
|
||||
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
|
||||
if (bd != NULL) {
|
||||
RB_REMOVE(key_bindings, &table->key_bindings, bd);
|
||||
cmd_list_free(bd->cmdlist);
|
||||
free(bd);
|
||||
}
|
||||
bd = key_bindings_get(table, key & ~KEYC_XTERM);
|
||||
if (bd != NULL)
|
||||
key_bindings_free(table, bd);
|
||||
|
||||
bd = xcalloc(1, sizeof *bd);
|
||||
bd->key = key;
|
||||
@ -187,20 +188,16 @@ void
|
||||
key_bindings_remove(const char *name, key_code key)
|
||||
{
|
||||
struct key_table *table;
|
||||
struct key_binding bd_find, *bd;
|
||||
struct key_binding *bd;
|
||||
|
||||
table = key_bindings_get_table(name, 0);
|
||||
if (table == NULL)
|
||||
return;
|
||||
|
||||
bd_find.key = (key & ~KEYC_XTERM);
|
||||
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
|
||||
bd = key_bindings_get(table, key & ~KEYC_XTERM);
|
||||
if (bd == NULL)
|
||||
return;
|
||||
|
||||
RB_REMOVE(key_bindings, &table->key_bindings, bd);
|
||||
cmd_list_free(bd->cmdlist);
|
||||
free(bd);
|
||||
key_bindings_free(table, bd);
|
||||
|
||||
if (RB_EMPTY(&table->key_bindings)) {
|
||||
RB_REMOVE(key_tables, &key_tables, table);
|
||||
|
Loading…
Reference in New Issue
Block a user