From e81e937a67fa9c3477e2de9d7f6a11bc1febb732 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Tue, 24 Jul 2007 01:44:15 +0200 Subject: [PATCH] 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. --- openbox/config.c | 6 ++++-- openbox/keyboard.c | 11 ++++++----- openbox/keyboard.h | 2 +- openbox/keytree.c | 3 ++- openbox/keytree.h | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/openbox/config.c b/openbox/config.c index 0f886cca..d7418e68 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -347,11 +347,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); @@ -367,7 +369,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); } } @@ -799,7 +801,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); -- 2.34.1