dont reparse the config file when the keyboard map changes. just rebind everything. yay for mika as inspiration

This commit is contained in:
Dana Jansens 2008-01-11 21:19:58 -05:00
parent c2e495c720
commit 405d9a3e43
6 changed files with 28 additions and 9 deletions

View file

@ -639,9 +639,12 @@ static void event_process(const XEvent *ec, gpointer data)
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

View file

@ -51,8 +51,9 @@ static void grab_keys(gboolean grab)
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)
@ -264,6 +265,12 @@ void keyboard_event(ObClient *client, const XEvent *e)
}
}
void keyboard_rebind()
{
tree_rebind(keyboard_firstnode);
grab_keys(TRUE);
}
void keyboard_startup(gboolean reconfig)
{
grab_keys(TRUE);

View file

@ -34,6 +34,8 @@ extern KeyBindingTree *keyboard_firstnode;
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();

View file

@ -63,14 +63,18 @@ KeyBindingTree *tree_build(GList *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)
{
KeyBindingTree *a, *b, *tmp, *last;

View file

@ -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

View file

@ -111,6 +111,8 @@ gboolean translate_key(const gchar *str, guint *state, guint *keycode)
parsed = g_strsplit(str, "-", -1);
*state = *keycode = 0;
/* first, find the key (last token) */
l = NULL;
for (i = 0; parsed[i] != NULL; ++i)