]> Dogcows Code - chaz/openbox/commitdiff
Allow non-interactive focus cycling.
authorDana Jansens <danakj@orodu.net>
Tue, 2 Oct 2012 02:32:59 +0000 (22:32 -0400)
committerDana Jansens <danakj@orodu.net>
Sun, 7 Oct 2012 02:30:02 +0000 (22:30 -0400)
Adds an <interactive>bool</interactive> option to the NextWindow and
PreviousWindow actions. When it is false, the action is not interactive and will
immediately switch focus to whatever the next focus target is.

Removing the "interactive" flag from the focus_cycle() method, as it was unused
previously, and the new code does not make use of it either. In order to be
non-interactive it simply starts a focus_cycle then immediately ends it when the
action ends.

The "interactive" flag in focus_cycle() forced a linear cycling order which may
not be what you want, so the new method is preferrable anyhow.

openbox/actions/cyclewindows.c
openbox/focus_cycle.c
openbox/focus_cycle.h

index a64d225694910b1f560a99eeeb03bc7b2803cc82..f834951502a0db96393ee3b21ccbd64071a9ee59 100644 (file)
@@ -16,6 +16,7 @@ typedef struct {
     gboolean forward;
     gboolean bar;
     gboolean raise;
+    gboolean interactive;
     ObFocusCyclePopupMode dialog_mode;
     GSList *actions;
 
@@ -69,6 +70,7 @@ static gpointer setup_func(xmlNodePtr node,
     o = g_slice_new0(Options);
     o->bar = TRUE;
     o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_LIST;
+    o->interactive = TRUE;
 
     if ((n = obt_xml_find_node(node, "linear")))
         o->linear = obt_xml_node_bool(n);
@@ -80,6 +82,8 @@ static gpointer setup_func(xmlNodePtr node,
         else if (obt_xml_node_contains(n, "icons"))
             o->dialog_mode = OB_FOCUS_CYCLE_POPUP_MODE_ICONS;
     }
+    if ((n = obt_xml_find_node(node, "interactive")))
+        o->interactive = obt_xml_node_bool(n);
     if ((n = obt_xml_find_node(node, "bar")))
         o->bar = obt_xml_node_bool(n);
     if ((n = obt_xml_find_node(node, "raise")))
@@ -157,21 +161,24 @@ static gboolean run_func(ObActionsData *data, gpointer options)
     Options *o = options;
     struct _ObClient *ft;
 
-    ft = focus_cycle(o->forward,
-                     o->all_desktops,
-                     !o->only_hilite_windows,
-                     o->dock_windows,
-                     o->desktop_windows,
-                     o->linear,
-                     TRUE,
-                     o->bar,
-                     o->dialog_mode,
-                     FALSE, FALSE);
+    gboolean done = FALSE;
+    gboolean cancel = FALSE;
+
+    ft = focus_cycle(
+        o->forward,
+        o->all_desktops,
+        !o->only_hilite_windows,
+        o->dock_windows,
+        o->desktop_windows,
+        o->linear,
+        (o->interactive ? o->bar : FALSE),
+        (o->interactive ? o->dialog_mode : OB_FOCUS_CYCLE_POPUP_MODE_NONE),
+        done, cancel);
 
     stacking_restore();
     if (o->raise && ft) stacking_temp_raise(CLIENT_AS_WINDOW(ft));
 
-    return TRUE;
+    return o->interactive;
 }
 
 static gboolean i_input_func(guint initial_state,
@@ -231,16 +238,17 @@ static void i_post_func(gpointer options)
     Options *o = options;
     struct _ObClient *ft;
 
+    gboolean done = TRUE;
+
     ft = focus_cycle(o->forward,
                      o->all_desktops,
                      !o->only_hilite_windows,
                      o->dock_windows,
                      o->desktop_windows,
                      o->linear,
-                     TRUE,
                      o->bar,
                      o->dialog_mode,
-                     TRUE, o->cancel);
+                     done, o->cancel);
 
     if (ft)
         actions_run_acts(o->actions, OB_USER_ACTION_KEYBOARD_KEY,
index 93a9a9930ee1884743372b1ac2ff314f8500fb1e..de176501e562de9844b8327e86a44a93e8bea11b 100644 (file)
@@ -93,7 +93,7 @@ void focus_cycle_reorder()
         focus_cycle_update_indicator(focus_cycle_target);
         if (!focus_cycle_target)
             focus_cycle(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
-                        TRUE, TRUE, OB_FOCUS_CYCLE_POPUP_MODE_NONE,
+                        TRUE, OB_FOCUS_CYCLE_POPUP_MODE_NONE,
                         TRUE, TRUE);
     }
 }
@@ -101,8 +101,8 @@ void focus_cycle_reorder()
 ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
                       gboolean nonhilite_windows,
                       gboolean dock_windows, gboolean desktop_windows,
-                      gboolean linear, gboolean interactive,
-                      gboolean showbar, ObFocusCyclePopupMode mode,
+                      gboolean linear, gboolean showbar,
+                      ObFocusCyclePopupMode mode,
                       gboolean done, gboolean cancel)
 {
     static GList *order = NULL;
@@ -110,23 +110,17 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
     ObClient *ft = NULL;
     ObClient *ret = NULL;
 
-    if (interactive) {
-        if (cancel) {
-            focus_cycle_target = NULL;
-            goto done_cycle;
-        } else if (done)
-            goto done_cycle;
+    if (cancel) {
+        focus_cycle_target = NULL;
+        goto done_cycle;
+    } else if (done)
+        goto done_cycle;
 
-        if (!focus_order)
-            goto done_cycle;
+    if (!focus_order)
+        goto done_cycle;
 
-        if (linear) list = client_list;
-        else        list = focus_order;
-    } else {
-        if (!focus_order)
-            goto done_cycle;
-        list = client_list;
-    }
+    if (linear) list = client_list;
+    else        list = focus_order;
 
     if (focus_cycle_target == NULL) {
         focus_cycle_linear = linear;
@@ -153,21 +147,14 @@ ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
         }
         ft = it->data;
         if (focus_cycle_valid(ft)) {
-            if (interactive) {
-                if (ft != focus_cycle_target) { /* prevents flicker */
-                    focus_cycle_target = ft;
-                    focus_cycle_type = OB_CYCLE_NORMAL;
-                    focus_cycle_draw_indicator(showbar ? ft : NULL);
-                }
-                /* same arguments as focus_target_valid */
-                focus_cycle_popup_show(ft, mode, focus_cycle_linear);
-                return focus_cycle_target;
-            } else if (ft != focus_cycle_target) {
+            if (ft != focus_cycle_target) { /* prevents flicker */
                 focus_cycle_target = ft;
                 focus_cycle_type = OB_CYCLE_NORMAL;
-                done = TRUE;
-                break;
+                focus_cycle_draw_indicator(showbar ? ft : NULL);
             }
+            /* same arguments as focus_target_valid */
+            focus_cycle_popup_show(ft, mode, focus_cycle_linear);
+            return focus_cycle_target;
         }
     } while (it != start);
 
@@ -179,10 +166,8 @@ done_cycle:
     g_list_free(order);
     order = NULL;
 
-    if (interactive) {
-        focus_cycle_draw_indicator(NULL);
-        focus_cycle_popup_hide();
-    }
+    focus_cycle_draw_indicator(NULL);
+    focus_cycle_popup_hide();
 
     return ret;
 }
index 9394b3df8bb65ba187b4f1e37329a942d65900b5..8acb53d9bee6ab45424c5f29959a48aead5f0429 100644 (file)
@@ -38,8 +38,8 @@ void focus_cycle_shutdown(gboolean reconfig);
 struct _ObClient* focus_cycle(gboolean forward, gboolean all_desktops,
                               gboolean nonhilite_windows,
                               gboolean dock_windows, gboolean desktop_windows,
-                              gboolean linear, gboolean interactive,
-                              gboolean showbar, ObFocusCyclePopupMode mode,
+                              gboolean linear, gboolean showbar,
+                              ObFocusCyclePopupMode mode,
                               gboolean done, gboolean cancel);
 struct _ObClient* focus_directional_cycle(ObDirection dir,
                                           gboolean dock_windows,
This page took 0.027744 seconds and 4 git commands to generate.