]> Dogcows Code - chaz/openbox/commitdiff
try to fix focus switching with mouse actions up a bit
authorMikael Magnusson <mikachu@comhem.se>
Wed, 23 Jun 2004 13:50:26 +0000 (13:50 +0000)
committerMikael Magnusson <mikachu@comhem.se>
Wed, 23 Jun 2004 13:50:26 +0000 (13:50 +0000)
openbox/action.c
openbox/focus.c
openbox/focus.h

index fbfb0960f79b5526f2ef368f2bac46b470346652..0ab6120deabc149a1ca1d38b1e4d5de4c9c4a4f6 100644 (file)
@@ -1411,7 +1411,7 @@ void action_cycle_windows(union ActionData *data)
        on us */
     event_halt_focus_delay();
 
-    focus_cycle(data->cycle.forward, data->cycle.linear,
+    focus_cycle(data->cycle.forward, data->cycle.linear, data->any.interactive,
                 data->cycle.dialog,
                 data->cycle.inter.final, data->cycle.inter.cancel);
 }
@@ -1423,6 +1423,7 @@ void action_directional_focus(union ActionData *data)
     event_halt_focus_delay();
 
     focus_directional_cycle(data->interdiraction.direction,
+                            data->any.interactive,
                             data->interdiraction.dialog,
                             data->interdiraction.inter.final,
                             data->interdiraction.inter.cancel);
index 09d642c2b4bc57bd1e305acef0df59081f90b26c..9d16387bfb067549d0c60e3f2e5b14d2a87c0ac4 100644 (file)
@@ -538,7 +538,7 @@ static gboolean valid_focus_target(ObClient *ft)
     return FALSE;
 }
 
-void focus_cycle(gboolean forward, gboolean linear,
+void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
                  gboolean dialog, gboolean done, gboolean cancel)
 {
     static ObClient *first = NULL;
@@ -547,20 +547,26 @@ void focus_cycle(gboolean forward, gboolean linear,
     GList *it, *start, *list;
     ObClient *ft = NULL;
 
-    if (cancel) {
-        focus_cycle_target = NULL;
-        goto done_cycle;
-    } else if (done)
-        goto done_cycle;
+    if (interactive) {
+        if (cancel) {
+            focus_cycle_target = NULL;
+            goto done_cycle;
+        } else if (done)
+            goto done_cycle;
 
-    if (!focus_order[screen_desktop])
-        goto done_cycle;
+        if (!focus_order[screen_desktop])
+            goto done_cycle;
 
-    if (!first) first = focus_client;
-    if (!focus_cycle_target) focus_cycle_target = focus_client;
+        if (!first) first = focus_client;
 
-    if (linear) list = client_list;
-    else        list = focus_order[screen_desktop];
+        if (linear) list = client_list;
+        else        list = focus_order[screen_desktop];
+    } else {
+        if (!focus_order[screen_desktop])
+            goto done_cycle;
+        list = client_list;
+    }
+    if (!focus_cycle_target) focus_cycle_target = focus_client;
 
     start = it = g_list_find(list, focus_cycle_target);
     if (!start) /* switched desktops or something? */
@@ -577,12 +583,18 @@ void focus_cycle(gboolean forward, gboolean linear,
         }
         ft = it->data;
         if (valid_focus_target(ft)) {
-            if (ft != focus_cycle_target) { /* prevents flicker */
+            if (interactive) {
+                if (ft != focus_cycle_target) { /* prevents flicker */
+                    focus_cycle_target = ft;
+                    focus_cycle_draw_indicator();
+                }
+                popup_cycle(ft, dialog);
+                return;
+            } else if (ft != focus_cycle_target) {
                 focus_cycle_target = ft;
-                focus_cycle_draw_indicator();
+                done = TRUE;
+                break;
             }
-            popup_cycle(ft, dialog);
-            return;
         }
     } while (it != start);
 
@@ -596,18 +608,23 @@ done_cycle:
     g_list_free(order);
     order = NULL;
 
-    focus_cycle_draw_indicator();
-    popup_cycle(ft, FALSE);
+    if (interactive) {
+        focus_cycle_draw_indicator();
+        popup_cycle(ft, FALSE);
+    }
 
     return;
 }
 
-void focus_directional_cycle(ObDirection dir,
+void focus_directional_cycle(ObDirection dir, gboolean interactive,
                              gboolean dialog, gboolean done, gboolean cancel)
 {
     static ObClient *first = NULL;
     ObClient *ft = NULL;
 
+    if (!interactive)
+        return;
+
     if (cancel) {
         focus_cycle_target = NULL;
         goto done_cycle;
index 4a3f0b1a3c4fa2889514acdd19d68680970813f6..345685c0f52f08bb06744cdbdc0e88ace3cf01db 100644 (file)
@@ -57,9 +57,9 @@ struct _ObClient* focus_fallback_target(ObFocusFallbackType type);
 void focus_fallback(ObFocusFallbackType type);
 
 /*! Cycle focus amongst windows. */
-void focus_cycle(gboolean forward, gboolean linear,
+void focus_cycle(gboolean forward, gboolean linear, gboolean interactive,
                  gboolean dialog, gboolean done, gboolean cancel);
-void focus_directional_cycle(ObDirection dir,
+void focus_directional_cycle(ObDirection dir, gboolean interactive,
                              gboolean dialog, gboolean done, gboolean cancel);
 void focus_cycle_draw_indicator();
 
This page took 0.030559 seconds and 4 git commands to generate.