This is for example to let you bind stuff to the Alt key while alt-tabbing, but you don't want those keys to be grabbed in normal usage.
gchar *key;
xmlNodePtr n;
gboolean is_chroot = FALSE;
+ gboolean grab = TRUE;
if (!parse_attr_string("key", node, &key))
return;
parse_attr_bool("chroot", node, &is_chroot);
+ parse_attr_bool("grab", node, &grab);
keylist = g_list_append(keylist, key);
action = actions_parse(i, doc, n);
if (action)
- keyboard_bind(keylist, action);
+ keyboard_bind(keylist, action, grab);
n = parse_find_node("action", n->next);
}
}
};
for (it = binds; it->key; ++it) {
GList *l = g_list_append(NULL, g_strdup(it->key));
- keyboard_bind(l, actions_parse_string(it->actname));
+ keyboard_bind(l, actions_parse_string(it->actname), TRUE);
}
}
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->grab)
+ grab_key(p->key, p->state, RootWindow(ob_display, ob_screen),
+ GrabModeAsync);
p = p->next_sibling;
}
if (curpos)
chroot binding. so add it to the tree then. */
if (!tree_chroot(keyboard_firstnode, keylist)) {
KeyBindingTree *tree;
- if (!(tree = tree_build(keylist)))
+ if (!(tree = tree_build(keylist, TRUE)))
return;
tree_chroot(tree, keylist);
tree_assimilate(tree);
}
}
-gboolean keyboard_bind(GList *keylist, ObActionsAct *action)
+gboolean keyboard_bind(GList *keylist, ObActionsAct *action, gboolean grab)
{
KeyBindingTree *tree, *t;
gboolean conflict;
g_assert(keylist != NULL);
g_assert(action != NULL);
- if (!(tree = tree_build(keylist)))
+ if (!(tree = tree_build(keylist, grab)))
return FALSE;
if ((t = tree_find(tree, &conflict)) != NULL) {
void keyboard_shutdown(gboolean reconfig);
void keyboard_chroot(GList *keylist);
-gboolean keyboard_bind(GList *keylist, struct _ObActionsAct *action);
+gboolean keyboard_bind(GList *keylist, struct _ObActionsAct *action, gboolean grab);
void keyboard_unbind_all();
void keyboard_event(struct _ObClient *client, const XEvent *e);
}
}
-KeyBindingTree *tree_build(GList *keylist)
+KeyBindingTree *tree_build(GList *keylist, gboolean grab)
{
GList *it;
KeyBindingTree *ret = NULL, *p;
ret->keylist = g_list_prepend(ret->keylist,
g_strdup(kit->data)); /* deep copy */
ret->first_child = p;
+ ret->grab = grab;
if (p != NULL) p->parent = ret;
if (!translate_key(it->data, &ret->state, &ret->key)) {
tree_destroy(ret);
typedef struct KeyBindingTree {
guint state;
guint key;
+ gboolean grab;
GList *keylist;
GSList *actions; /* list of Action pointers */
gboolean chroot;
} KeyBindingTree;
void tree_destroy(KeyBindingTree *tree);
-KeyBindingTree *tree_build(GList *keylist);
+KeyBindingTree *tree_build(GList *keylist, gboolean grab);
void tree_assimilate(KeyBindingTree *node);
KeyBindingTree *tree_find(KeyBindingTree *search, gboolean *conflict);
gboolean tree_chroot(KeyBindingTree *tree, GList *keylist);