1
0
mirror of https://github.com/tmux/tmux.git synced 2025-04-01 13:18:49 +00:00

Common function to free key bindings.

This commit is contained in:
nicm 2020-01-05 20:39:25 +00:00
parent 7c6c66cc3c
commit 73b8c2ef3c

View File

@ -85,6 +85,14 @@ key_bindings_cmp(struct key_binding *bd1, struct key_binding *bd2)
return (0); 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 * struct key_table *
key_bindings_get_table(const char *name, int create) 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) if (--table->references != 0)
return; return;
RB_FOREACH_SAFE(bd, key_bindings, &table->key_bindings, bd1) { RB_FOREACH_SAFE(bd, key_bindings, &table->key_bindings, bd1)
RB_REMOVE(key_bindings, &table->key_bindings, bd); key_bindings_free(table, bd);
cmd_list_free(bd->cmdlist);
free(bd);
}
free((void *)table->name); free((void *)table->name);
free(table); free(table);
@ -162,17 +167,13 @@ key_bindings_add(const char *name, key_code key, int repeat,
struct cmd_list *cmdlist) struct cmd_list *cmdlist)
{ {
struct key_table *table; struct key_table *table;
struct key_binding bd_find, *bd; struct key_binding *bd;
table = key_bindings_get_table(name, 1); table = key_bindings_get_table(name, 1);
bd_find.key = (key & ~KEYC_XTERM); bd = key_bindings_get(table, key & ~KEYC_XTERM);
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find); if (bd != NULL)
if (bd != NULL) { key_bindings_free(table, bd);
RB_REMOVE(key_bindings, &table->key_bindings, bd);
cmd_list_free(bd->cmdlist);
free(bd);
}
bd = xcalloc(1, sizeof *bd); bd = xcalloc(1, sizeof *bd);
bd->key = key; bd->key = key;
@ -187,20 +188,16 @@ void
key_bindings_remove(const char *name, key_code key) key_bindings_remove(const char *name, key_code key)
{ {
struct key_table *table; struct key_table *table;
struct key_binding bd_find, *bd; struct key_binding *bd;
table = key_bindings_get_table(name, 0); table = key_bindings_get_table(name, 0);
if (table == NULL) if (table == NULL)
return; return;
bd_find.key = (key & ~KEYC_XTERM); bd = key_bindings_get(table, key & ~KEYC_XTERM);
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
if (bd == NULL) if (bd == NULL)
return; return;
key_bindings_free(table, bd);
RB_REMOVE(key_bindings, &table->key_bindings, bd);
cmd_list_free(bd->cmdlist);
free(bd);
if (RB_EMPTY(&table->key_bindings)) { if (RB_EMPTY(&table->key_bindings)) {
RB_REMOVE(key_tables, &key_tables, table); RB_REMOVE(key_tables, &key_tables, table);