X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=e81b9590ee48e47253543736ed065ada47984d6e;hb=b3764dd433f8e8511bf3045e4ea5e0e5df6b2a70;hp=9ebeffee80691b07e20f5e54609f6450ea6def57;hpb=556eb7b7fb20b3b0db03b6d92259ad3bb16dccde;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 9ebeffee..e81b9590 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -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) {