]> Dogcows Code - chaz/openbox/blobdiff - openbox/keyboard.c
export if an interactive grab is in progress
[chaz/openbox] / openbox / keyboard.c
index 8786cd2c05b82a2d9131ed44f1605f4226cd5046..1499421353597377dff61036373fef075a0eac3f 100644 (file)
@@ -39,7 +39,7 @@ KeyBindingTree *keyboard_firstnode;
 typedef struct {
     guint state;
     ObClient *client;
-    ObAction *action;
+    GSList *actions;
     ObFrameContext context;
 } ObInteractiveState;
 
@@ -98,6 +98,14 @@ void keyboard_reset_chains()
     }
 }
 
+void keyboard_unbind_all()
+{
+    tree_destroy(keyboard_firstnode);
+    keyboard_firstnode = NULL;
+    grab_keys(FALSE);
+    curpos = NULL;
+}
+
 gboolean keyboard_bind(GList *keylist, ObAction *action)
 {
     KeyBindingTree *tree, *t;
@@ -147,6 +155,11 @@ gboolean keyboard_bind(GList *keylist, ObAction *action)
     return TRUE;
 }
 
+gboolean keyboard_interactive_grab_in_progress()
+{
+    return interactive_states != NULL;
+}
+
 void keyboard_interactive_grab(guint state, ObClient *client,
                                ObAction *action)
 {
@@ -170,7 +183,7 @@ void keyboard_interactive_grab(guint state, ObClient *client,
 
     s->state = state;
     s->client = client;
-    s->action = action;
+    s->actions = g_slist_append(NULL, action);
 
     interactive_states = g_slist_append(interactive_states, s);
 }
@@ -178,8 +191,9 @@ void keyboard_interactive_grab(guint state, ObClient *client,
 void keyboard_interactive_end(ObInteractiveState *s,
                               guint state, gboolean cancel)
 {
-    action_run_interactive(s->action, s->client, state, cancel, TRUE);
+    action_run_interactive(s->actions, s->client, state, cancel, TRUE);
 
+    g_slist_free(s->actions);
     g_free(s);
 
     interactive_states = g_slist_remove(interactive_states, s);
@@ -268,13 +282,11 @@ void keyboard_event(ObClient *client, const XEvent *e)
                 curpos = p;
                 grab_keys(TRUE);
             } else {
-                GSList *it;
-
-                for (it = p->actions; it; it = it->next)
-                    action_run_key(it->data, client, e->xkey.state,
-                                   e->xkey.x_root, e->xkey.y_root);
 
                 keyboard_reset_chains();
+
+                action_run_key(p->actions, client, e->xkey.state,
+                               e->xkey.x_root, e->xkey.y_root);
             }
             break;
         }
@@ -297,16 +309,13 @@ void keyboard_shutdown(gboolean reconfig)
     if (!reconfig)
         client_remove_destructor(keyboard_interactive_end_client);
 
-    tree_destroy(keyboard_firstnode);
-    keyboard_firstnode = NULL;
-
     for (it = interactive_states; it; it = g_slist_next(it))
         g_free(it->data);
     g_slist_free(interactive_states);
     interactive_states = NULL;
 
     ob_main_loop_timeout_remove(ob_main_loop, chain_timeout);
-    grab_keys(FALSE);
-    curpos = NULL;
+
+    keyboard_unbind_all();
 }
 
This page took 0.022676 seconds and 4 git commands to generate.