Make the Focus action stop all interactive actions (Fixes bug #4436)
authorDana Jansens <danakj@orodu.net>
Mon, 4 Jan 2010 21:25:13 +0000 (16:25 -0500)
committerDana Jansens <danakj@orodu.net>
Mon, 4 Jan 2010 21:25:13 +0000 (16:25 -0500)
Old < 3.4.8 Openbox versions would stop focus cycling when focus moved.  Now that is not the case, but you should be able to stop it by Choosing a window explicitly still.

openbox/actions/focus.c
openbox/focus_cycle.c

index 8da8ed5..1b54491 100644 (file)
@@ -6,6 +6,7 @@
 
 typedef struct {
     gboolean here;
+    gboolean stop_int;
 } Options;
 
 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
@@ -27,9 +28,12 @@ static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
     Options *o;
 
     o = g_new0(Options, 1);
+    o->stop_int = TRUE;
 
     if ((n = parse_find_node("here", node)))
         o->here = parse_bool(doc, n);
+    if ((n = parse_find_node("stopInteractive", node)))
+        o->stop_int = parse_bool(doc, n);
     return o;
 }
 
@@ -56,11 +60,17 @@ static gboolean run_func(ObActionsData *data, gpointer options)
             (data->context != OB_FRAME_CONTEXT_CLIENT &&
              data->context != OB_FRAME_CONTEXT_FRAME))
         {
+            if (o->stop_int)
+                actions_interactive_cancel_act();
+
             actions_client_move(data, TRUE);
             client_activate(data->client, TRUE, o->here, FALSE, FALSE, TRUE);
             actions_client_move(data, FALSE);
         }
     } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) {
+        if (o->stop_int)
+            actions_interactive_cancel_act();
+
         /* focus action on the root window. make keybindings work for this
            openbox instance, but don't focus any specific client */
         focus_nothing();
index 8d04749..c92b5a5 100644 (file)
@@ -55,9 +55,10 @@ void focus_cycle_stop(ObClient *ifclient)
 {
     /* stop focus cycling if the given client is a valid focus target,
        and so the cycling is being disrupted */
-    if (focus_cycle_target && ifclient &&
-        (ifclient == focus_cycle_target ||
-         focus_cycle_popup_is_showing(ifclient)))
+    if (focus_cycle_target &&
+        ((ifclient && (ifclient == focus_cycle_target ||
+                       focus_cycle_popup_is_showing(ifclient))) ||
+         !ifclient))
     {
         focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,TRUE);
         focus_directional_cycle(0, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);