dont reparse the config file when the keyboard map changes. just rebind everything. yay for mika as inspiration
This commit is contained in:
parent
c2e495c720
commit
405d9a3e43
6 changed files with 28 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue