X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fkeytree.c;h=676f3612f011f4b991335c9f80b5949426786057;hb=76f514cf52cb6a30de8a7d3a8132bd67118ea463;hp=02ad3cadd899298ee37b317c531980af49f81788;hpb=adb9bb700f3235728dacc1d3e3daad81abd93e9a;p=chaz%2Fopenbox diff --git a/openbox/keytree.c b/openbox/keytree.c index 02ad3cad..676f3612 100644 --- a/openbox/keytree.c +++ b/openbox/keytree.c @@ -25,20 +25,20 @@ void tree_destroy(KeyBindingTree *tree) KeyBindingTree *c; while (tree) { - tree_destroy(tree->next_sibling); - c = tree->first_child; - if (c == NULL) { - GList *it; + tree_destroy(tree->next_sibling); + c = tree->first_child; + if (c == NULL) { + GList *it; GSList *sit; - for (it = tree->keylist; it != NULL; it = it->next) - g_free(it->data); - g_list_free(tree->keylist); - for (sit = tree->actions; sit != NULL; sit = sit->next) + for (it = tree->keylist; it != NULL; it = it->next) + g_free(it->data); + g_list_free(tree->keylist); + for (sit = tree->actions; sit != NULL; sit = sit->next) action_unref(sit->data); - g_slist_free(tree->actions); - } - g_free(tree); - tree = c; + g_slist_free(tree->actions); + } + g_free(tree); + tree = c; } } @@ -48,24 +48,24 @@ KeyBindingTree *tree_build(GList *keylist) KeyBindingTree *ret = NULL, *p; if (g_list_length(keylist) <= 0) - return NULL; /* nothing in the list.. */ - - for (it = g_list_last(keylist); it != NULL; it = it->prev) { - p = ret; - ret = g_new0(KeyBindingTree, 1); - if (p == NULL) { - GList *it; - - /* this is the first built node, the bottom node of the tree */ - ret->keylist = g_list_copy(keylist); /* shallow copy */ - for (it = ret->keylist; it != NULL; it = it->next) /* deep copy */ - it->data = g_strdup(it->data); - } - ret->first_child = p; - if (!translate_key(it->data, &ret->state, &ret->key)) { - tree_destroy(ret); - return NULL; - } + return NULL; /* nothing in the list.. */ + + for (it = g_list_last(keylist); it; it = g_list_previous(it)) { + p = ret; + ret = g_new0(KeyBindingTree, 1); + if (p == NULL) { + GList *it; + + /* this is the first built node, the bottom node of the tree */ + ret->keylist = g_list_copy(keylist); /* shallow copy */ + for (it = ret->keylist; it; it = g_list_next(it)) /* deep copy */ + it->data = g_strdup(it->data); + } + ret->first_child = p; + if (!translate_key(it->data, &ret->state, &ret->key)) { + tree_destroy(ret); + return NULL; + } } return ret; } @@ -75,29 +75,29 @@ void tree_assimilate(KeyBindingTree *node) KeyBindingTree *a, *b, *tmp, *last; if (keyboard_firstnode == NULL) { - /* there are no nodes at this level yet */ - keyboard_firstnode = node; + /* there are no nodes at this level yet */ + keyboard_firstnode = node; } else { - a = keyboard_firstnode; - last = a; - b = node; - while (a) { - last = a; - if (!(a->state == b->state && a->key == b->key)) { - a = a->next_sibling; - } else { - tmp = b; - b = b->first_child; - g_free(tmp); - a = a->first_child; - } - } - if (!(last->state == b->state && last->key == b->key)) - last->next_sibling = b; - else { - last->first_child = b->first_child; - g_free(b); - } + a = keyboard_firstnode; + last = a; + b = node; + while (a) { + last = a; + if (!(a->state == b->state && a->key == b->key)) { + a = a->next_sibling; + } else { + tmp = b; + b = b->first_child; + g_free(tmp); + a = a->first_child; + } + } + if (!(last->state == b->state && last->key == b->key)) + last->next_sibling = b; + else { + last->first_child = b->first_child; + g_free(b); + } } } @@ -110,21 +110,21 @@ KeyBindingTree *tree_find(KeyBindingTree *search, gboolean *conflict) a = keyboard_firstnode; b = search; while (a && b) { - if (!(a->state == b->state && a->key == b->key)) { - a = a->next_sibling; - } else { - if ((a->first_child == NULL) == (b->first_child == NULL)) { - if (a->first_child == NULL) { - /* found it! (return the actual node, not the search's) */ - return a; - } - } else { - *conflict = TRUE; - return NULL; /* the chain status' don't match (conflict!) */ - } - b = b->first_child; - a = a->first_child; - } + if (!(a->state == b->state && a->key == b->key)) { + a = a->next_sibling; + } else { + if ((a->first_child == NULL) == (b->first_child == NULL)) { + if (a->first_child == NULL) { + /* found it! (return the actual node, not the search's) */ + return a; + } + } else { + *conflict = TRUE; + return NULL; /* the chain status' don't match (conflict!) */ + } + b = b->first_child; + a = a->first_child; + } } return NULL; /* it just isn't in here */ }