summaryrefslogtreecommitdiff
path: root/openbox/screen.c
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 /openbox/screen.c
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.
Diffstat (limited to 'openbox/screen.c')
-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);