@@ -94,6 +94,30 @@ keybinding_equals(const struct keybinding *keybinding, const struct key key[],
94
94
return keybinding_matches (keybinding , key , keys , conflict_ptr );
95
95
}
96
96
97
+ static enum status_code
98
+ del_keybinding (const struct key key [], size_t keys )
99
+ {
100
+ bool found = false;
101
+ size_t i ;
102
+
103
+ for (i = 0 ; i < ARRAY_SIZE (keymaps ); i ++ ) {
104
+ struct keymap * table = & keymaps [i ];
105
+ size_t j ;
106
+
107
+ for (j = 0 ; j < table -> size ; j ++ )
108
+ if (keybinding_equals (table -> data [j ], key , keys , NULL )) {
109
+ found = true;
110
+ free (table -> data [j ]);
111
+ table -> size -- ;
112
+ for (; j < table -> size ; j ++ )
113
+ table -> data [j ] = table -> data [j + 1 ];
114
+ table -> data = realloc (table -> data , table -> size * sizeof (* table -> data ));
115
+ }
116
+ }
117
+
118
+ return found ? SUCCESS : error ("No keybinding found for %s" , get_key_name (key , keys , false));
119
+ }
120
+
97
121
enum status_code
98
122
add_keybinding (struct keymap * table , enum request request ,
99
123
const struct key key [], size_t keys )
@@ -103,6 +127,9 @@ add_keybinding(struct keymap *table, enum request request,
103
127
bool conflict = false;
104
128
size_t i ;
105
129
130
+ if (is_generic_keymap (table ) && request == REQ_NONE )
131
+ return del_keybinding (key , keys );
132
+
106
133
for (i = 0 ; i < table -> size ; i ++ ) {
107
134
if (keybinding_equals (table -> data [i ], key , keys , & conflict )) {
108
135
enum request old_request = table -> data [i ]-> request ;
0 commit comments