dont reparse the config file when the keyboard map changes. just rebind everything. yay for mika as inspiration
Dana Jansens danakj@orodu.net
6 files changed,
28 insertions(+),
9 deletions(-)
M
openbox/event.c
→
openbox/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.c
→
openbox/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.h
→
openbox/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.c
→
openbox/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.h
→
openbox/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.c
→
openbox/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)