]> Dogcows Code - chaz/openbox/blobdiff - openbox/screen.c
Don't record desktops for lastdesktop when switching away quickly again.
[chaz/openbox] / openbox / screen.c
index 9ebeffee80691b07e20f5e54609f6450ea6def57..e81b9590ee48e47253543736ed065ada47984d6e 100644 (file)
@@ -59,7 +59,9 @@ static void     screen_fallback_focus(void);
 guint    screen_num_desktops;
 guint    screen_num_monitors;
 guint    screen_desktop;
-guint    screen_last_desktop;
+guint    screen_last_desktop = 1;
+guint    screen_old_desktop;
+gboolean screen_desktop_timeout = TRUE;
 Size     screen_physical_size;
 gboolean screen_showing_desktop;
 ObDesktopLayout screen_desktop_layout;
@@ -577,23 +579,61 @@ static void screen_fallback_focus(void)
     }
 }
 
+static gboolean last_desktop_func(gpointer data)
+{
+    screen_desktop_timeout = TRUE;
+    return FALSE;
+}
+
 void screen_set_desktop(guint num, gboolean dofocus)
 {
     GList *it;
-    guint old;
+    guint previous;
     gulong ignore_start;
 
     g_assert(num < screen_num_desktops);
 
-    old = screen_desktop;
+    previous = screen_desktop;
     screen_desktop = num;
 
-    if (old == num) return;
+    if (previous == num) return;
 
     PROP_SET32(RootWindow(ob_display, ob_screen),
                net_current_desktop, cardinal, num);
 
-    screen_last_desktop = old;
+    if (screen_desktop_timeout) {
+        if (screen_desktop == screen_last_desktop) {
+            screen_last_desktop = previous;
+            screen_old_desktop = screen_desktop;
+        } else {
+            screen_old_desktop = screen_last_desktop;
+            screen_last_desktop = previous;
+        }
+    } else {
+        if (screen_desktop == screen_last_desktop) {
+            if (previous == screen_old_desktop) {
+                screen_last_desktop = screen_old_desktop;
+            } else if (screen_last_desktop == screen_old_desktop) {
+                screen_last_desktop = previous;
+            } else {
+                screen_last_desktop = screen_old_desktop;
+            }
+        } else {
+            if (screen_desktop == screen_old_desktop) {
+                /* do nothing */
+            } else if (previous == screen_old_desktop) {
+                /* do nothing */
+            } else if (screen_last_desktop == screen_old_desktop) {
+                screen_last_desktop = previous;
+            } else {
+                /* do nothing */
+            }
+        }
+    }
+    screen_desktop_timeout = FALSE;
+    ob_main_loop_timeout_remove(ob_main_loop, last_desktop_func);
+    ob_main_loop_timeout_add(ob_main_loop, 500000, last_desktop_func,
+            NULL, NULL, NULL);
 
     ob_debug("Moving to desktop %d\n", num+1);
 
@@ -1510,7 +1550,7 @@ Rect* screen_area(guint desktop, guint head, Rect *search)
 guint screen_find_monitor(Rect *search)
 {
     guint i;
-    guint most = 0;
+    guint most = screen_num_monitors;
     guint mostv = 0;
 
     for (i = 0; i < screen_num_monitors; ++i) {
This page took 0.022812 seconds and 4 git commands to generate.