From: Mikael Magnusson Date: Mon, 23 Jul 2007 23:44:15 +0000 (+0200) Subject: Add grab option to to not grab the keycombo. X-Git-Tag: mikabox-3.4.3~10 X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=d4d55e4907accf8a79d7995f3f5718390432aa40;p=mikachu%2Fopenbox.git Add grab option to to not grab the keycombo. 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. --- diff --git a/openbox/config.c b/openbox/config.c index 11797b85..1c6d6c7a 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -346,11 +346,13 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, 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); @@ -366,7 +368,7 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, action = actions_parse(i, doc, n); if (action) - keyboard_bind(keylist, action); + keyboard_bind(keylist, action, grab); n = parse_find_node("action", n->next); } } @@ -796,7 +798,7 @@ static void bind_default_keyboard() }; 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); } } diff --git a/openbox/keyboard.c b/openbox/keyboard.c index 6e45e5c4..bb4e4fce 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -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->grab) + grab_key(p->key, p->state, RootWindow(ob_display, ob_screen), + GrabModeAsync); p = p->next_sibling; } if (curpos) @@ -127,14 +128,14 @@ void keyboard_chroot(GList *keylist) 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; @@ -142,7 +143,7 @@ gboolean keyboard_bind(GList *keylist, ObActionsAct *action) 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) { diff --git a/openbox/keyboard.h b/openbox/keyboard.h index 1c55e050..b3fa43cf 100644 --- a/openbox/keyboard.h +++ b/openbox/keyboard.h @@ -35,7 +35,7 @@ void keyboard_startup(gboolean reconfig); 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); diff --git a/openbox/keytree.c b/openbox/keytree.c index fb26624d..c167495d 100644 --- a/openbox/keytree.c +++ b/openbox/keytree.c @@ -44,7 +44,7 @@ void tree_destroy(KeyBindingTree *tree) } } -KeyBindingTree *tree_build(GList *keylist) +KeyBindingTree *tree_build(GList *keylist, gboolean grab) { GList *it; KeyBindingTree *ret = NULL, *p; @@ -62,6 +62,7 @@ KeyBindingTree *tree_build(GList *keylist) 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); diff --git a/openbox/keytree.h b/openbox/keytree.h index 391cb154..cf9e8028 100644 --- a/openbox/keytree.h +++ b/openbox/keytree.h @@ -24,6 +24,7 @@ typedef struct KeyBindingTree { guint state; guint key; + gboolean grab; GList *keylist; GSList *actions; /* list of Action pointers */ gboolean chroot; @@ -37,7 +38,7 @@ typedef struct KeyBindingTree { } 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);