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
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)
}
}
+void keyboard_rebind()
+{
+ tree_rebind(keyboard_firstnode);
+ grab_keys(TRUE);
+}
+
void keyboard_startup(gboolean reconfig)
{
grab_keys(TRUE);
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();
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;
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
parsed = g_strsplit(str, "-", -1);
+ *state = *keycode = 0;
+
/* first, find the key (last token) */
l = NULL;
for (i = 0; parsed[i] != NULL; ++i)