all repos — openbox @ 405d9a3e431b01a221be65f41bccb6c80c43b0a4

openbox fork - make it a bit more like ryudo

dont reparse the config file when the keyboard map changes. just rebind everything. yay for mika as inspiration
Dana Jansens danakj@orodu.net
commit

405d9a3e431b01a221be65f41bccb6c80c43b0a4

parent

c2e495c720d93521bdb0e1bfd7e76584a1b329b7

M openbox/event.copenbox/event.c

@@ -639,9 +639,12 @@ event_handle_root(e);

else if (e->type == MapRequest) client_manage(window); else if (e->type == MappingNotify) { - /* keyboard layout changes, reconfigure openbox. need to restart the - modkeys system, but also to reload the key bindings. */ - ob_reconfigure(); + /* keyboard layout changes for modifier mapping changes. reload the + modifier map, and rebind all the key bindings as appropriate */ + ob_debug("Kepboard map changed. Reloading keyboard bindings.\n"); + modkeys_shutdown(TRUE); + modkeys_startup(TRUE); + keyboard_rebind(); } else if (e->type == ClientMessage) { /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for
M openbox/keyboard.copenbox/keyboard.c

@@ -51,8 +51,9 @@

if (grab) { p = curpos ? curpos->first_child : keyboard_firstnode; while (p) { - grab_key(p->key, p->state, RootWindow(ob_display, ob_screen), - GrabModeAsync); + if (p->key) + grab_key(p->key, p->state, RootWindow(ob_display, ob_screen), + GrabModeAsync); p = p->next_sibling; } if (curpos)

@@ -262,6 +263,12 @@ break;

} p = p->next_sibling; } +} + +void keyboard_rebind() +{ + tree_rebind(keyboard_firstnode); + grab_keys(TRUE); } void keyboard_startup(gboolean reconfig)
M openbox/keyboard.hopenbox/keyboard.h

@@ -34,6 +34,8 @@

void keyboard_startup(gboolean reconfig); void keyboard_shutdown(gboolean reconfig); +void keyboard_rebind(); + void keyboard_chroot(GList *keylist); gboolean keyboard_bind(GList *keylist, struct _ObActionsAct *action); void keyboard_unbind_all();
M openbox/keytree.copenbox/keytree.c

@@ -63,12 +63,16 @@ ret->keylist = g_list_prepend(ret->keylist,

g_strdup(kit->data)); /* deep copy */ ret->first_child = p; if (p != NULL) p->parent = ret; - if (!translate_key(it->data, &ret->state, &ret->key)) { - tree_destroy(ret); - return NULL; - } + translate_key(it->data, &ret->state, &ret->key); } 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)
M openbox/keytree.hopenbox/keytree.h

@@ -41,6 +41,7 @@ KeyBindingTree *tree_build(GList *keylist);

void tree_assimilate(KeyBindingTree *node); KeyBindingTree *tree_find(KeyBindingTree *search, gboolean *conflict); gboolean tree_chroot(KeyBindingTree *tree, GList *keylist); +void tree_rebind(KeyBindingTree *node); #endif
M openbox/translate.copenbox/translate.c

@@ -111,6 +111,8 @@ KeySym sym;

parsed = g_strsplit(str, "-", -1); + *state = *keycode = 0; + /* first, find the key (last token) */ l = NULL; for (i = 0; parsed[i] != NULL; ++i)