- 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;
+ /* check b->key != 0 for key bindings that didn't get translated */
+ if (!(a->state == b->state && a->key == b->key && b->key != 0)) {
+ a = a->next_sibling;
+ } else {
+ tmp = b;
+ b = b->first_child;
+ g_slice_free(KeyBindingTree, tmp);
+ a = a->first_child;
+ }
+ }
+ /* check b->key != 0, and save key bindings that didn't get translated
+ as siblings here */
+ if (!(last->state == b->state && last->key == b->key && b->key != 0)) {
+ last->next_sibling = b;
+ b->parent = last->parent;
+ } else {
+ last->first_child = b->first_child;
+ last->first_child->parent = last;
+ g_slice_free(KeyBindingTree, b);
+ }