Add grab option to <keybind> to not grab the keycombo. This is for example to let...
authorMikael Magnusson <mikachu@comhem.se>
Mon, 23 Jul 2007 23:44:15 +0000 (01:44 +0200)
committerMikael Magnusson <mikachu@comhem.se>
Sat, 2 Feb 2008 20:50:18 +0000 (21:50 +0100)
openbox/config.c
openbox/keyboard.c
openbox/keyboard.h
openbox/keytree.c
openbox/keytree.h

index 7528b4d3cd829659c53f435303b6ca295c14b848..bc1ccf1e8936b621b0ba31b27a56b5256e3303fd 100644 (file)
@@ -332,11 +332,13 @@ static void parse_key(xmlNodePtr node, GList *keylist)
     gchar *key;
     xmlNodePtr n;
     gboolean is_chroot = FALSE;
+    gboolean grab = TRUE;
 
     if (!obt_parse_attr_string(node, "key", &key))
         return;
 
     obt_parse_attr_bool(node, "chroot", &is_chroot);
+    obt_parse_attr_bool(node, "grab", &grab);
 
     keylist = g_list_append(keylist, key);
 
@@ -352,7 +354,7 @@ static void parse_key(xmlNodePtr node, GList *keylist)
 
             action = actions_parse(n);
             if (action)
-                keyboard_bind(keylist, action);
+                keyboard_bind(keylist, action, grab);
             n = obt_parse_find_node(n->next, "action");
         }
     }
@@ -793,7 +795,7 @@ static void bind_default_keyboard(void)
     };
     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);
     }
 }
 
index 02ae6a304642ef4ce7a735ca0a55c827393f6e34..24d8dd23e1540f962ed8d6a48f7a56a1f4bd95c1 100644 (file)
@@ -49,7 +49,7 @@ static void grab_keys(gboolean grab)
     if (grab) {
         p = curpos ? curpos->first_child : keyboard_firstnode;
         while (p) {
-            if (p->key)
+            if (p->key && p->grab)
                 grab_key(p->key, p->state, obt_root(ob_screen),
                          GrabModeAsync);
             p = p->next_sibling;
@@ -126,14 +126,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;
@@ -141,7 +141,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) {
@@ -280,7 +280,7 @@ static void node_rebind(KeyBindingTree *node)
         while (node->actions) {
             /* add each action, and remove them from the original tree so
                they don't get free'd on us */
-            keyboard_bind(node->keylist, node->actions->data);
+            keyboard_bind(node->keylist, node->actions->data, node->grab);
             node->actions = g_slist_delete_link(node->actions, node->actions);
         }
 
index 995cdbc5f0757ad0246a95bfd4023954732f20f5..758e6367af93228bc28f69ab72f6c5b2542503a6 100644 (file)
@@ -37,7 +37,7 @@ void keyboard_shutdown(gboolean reconfig);
 void keyboard_rebind();
 
 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);
index 56cc96d41baf767dac67e8f9152e2fcb98475c60..af8bbaf81d5fd9595b36367e09532f3fabb164a5 100644 (file)
@@ -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;
         translate_key(it->data, &ret->state, &ret->key);
     }
index 391cb154fb91a5cc61c2f12ac8771dd8a17b91b3..cf9e802826beb03e4a7591d809d745ad90837d6a 100644 (file)
@@ -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);