diff options
| author | Dana Jansens <danakj@orodu.net> | 2008-02-02 00:59:59 -0500 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2008-02-02 01:25:59 -0500 |
| commit | 3b0f41dc66da86aaad4f0343bbfb632c7bbfd0c7 (patch) | |
| tree | a4aed84e724d2c3a19392874a86bc22cd2c26b48 /openbox/keytree.c | |
| parent | 6a3ac556b9ed5fd6e578da20a144f22dd4769267 (diff) | |
fix a crash from chroot of invalid keys, and make keybindings reload better
since invalid(not translated) keybindings are allowed in the tree, the tree's structure may actually need to change when reconfiguring. actually, it could need to anyways. so when re-translating all the keybindings, actually rebuild the keybinding tree. also, make the chroot building code not fail when translate fails, to match the rest of the code and avoid segfaults with chroots on invalid keys.
Diffstat (limited to 'openbox/keytree.c')
| -rw-r--r-- | openbox/keytree.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/openbox/keytree.c b/openbox/keytree.c index 714fffda..56cc96d4 100644 --- a/openbox/keytree.c +++ b/openbox/keytree.c @@ -68,13 +68,6 @@ KeyBindingTree *tree_build(GList *keylist) return ret; } -void tree_rebind(KeyBindingTree *node) { - GList *it = g_list_last(node->keylist); - translate_key(it->data, &node->state, &node->key); - if (node->next_sibling) tree_rebind(node->next_sibling); - if (node->first_child) tree_rebind(node->first_child); -} - void tree_assimilate(KeyBindingTree *node) { KeyBindingTree *a, *b, *tmp, *last; @@ -139,16 +132,15 @@ KeyBindingTree *tree_find(KeyBindingTree *search, gboolean *conflict) gboolean tree_chroot(KeyBindingTree *tree, GList *keylist) { guint key, state; - if (translate_key(keylist->data, &state, &key)) { - while (tree != NULL && !(tree->state == state && tree->key == key)) - tree = tree->next_sibling; - if (tree != NULL) { - if (keylist->next == NULL) { - tree->chroot = TRUE; - return TRUE; - } else - return tree_chroot(tree->first_child, keylist->next); - } + translate_key(keylist->data, &state, &key); + while (tree != NULL && !(tree->state == state && tree->key == key)) + tree = tree->next_sibling; + if (tree != NULL) { + if (keylist->next == NULL) { + tree->chroot = TRUE; + return TRUE; + } else + return tree_chroot(tree->first_child, keylist->next); } return FALSE; } |
