]> Dogcows Code - chaz/openbox/blobdiff - openbox/keyboard.c
export if an interactive grab is in progress
[chaz/openbox] / openbox / keyboard.c
index 8598cbf95fe620de26ff2877e212274503de13d9..1499421353597377dff61036373fef075a0eac3f 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   keyboard.c for the Openbox window manager
+   Copyright (c) 2003        Ben Jansens
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
 #include "mainloop.h"
 #include "focus.h"
 #include "screen.h"
@@ -21,7 +39,7 @@ KeyBindingTree *keyboard_firstnode;
 typedef struct {
     guint state;
     ObClient *client;
-    ObAction *action;
+    GSList *actions;
     ObFrameContext context;
 } ObInteractiveState;
 
@@ -80,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;
@@ -129,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)
 {
@@ -152,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);
 }
@@ -160,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);
@@ -250,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;
         }
@@ -279,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.027227 seconds and 4 git commands to generate.