summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@comhem.se>2008-01-05 12:40:46 +0100
committerDana Jansens <danakj@orodu.net>2008-01-11 16:37:23 -0500
commitb3764dd433f8e8511bf3045e4ea5e0e5df6b2a70 (patch)
tree4a817529bb263975b46c34a1d33e917d52c2657e
parente61f58462fe0cdd85090b621c6906b2885990071 (diff)
Don't record desktops for lastdesktop when switching away quickly again.
When switching desktops, only record the previous desktop as the last desktop if the user stayed there for a while. This way you can scroll over a couple desktops quickly, then go back to the previous desktop you _used_, not the last you scrolled past.
-rw-r--r--openbox/screen.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/openbox/screen.c b/openbox/screen.c
index a8da15c0..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);