]> 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 7f608b3c86e2ece64e7698f64ba13ce9fd2b4cfb..e81b9590ee48e47253543736ed065ada47984d6e 100644 (file)
                         ButtonPressMask | ButtonReleaseMask)
 
 static gboolean screen_validate_layout(ObDesktopLayout *l);
-static gboolean replace_wm();
-static void     screen_tell_ksplash();
+static gboolean replace_wm(void);
+static void     screen_tell_ksplash(void);
+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;
@@ -76,7 +79,7 @@ static GSList *struts_bottom = NULL;
 
 static ObPagerPopup *desktop_popup;
 
-static gboolean replace_wm()
+static gboolean replace_wm(void)
 {
     gchar *wm_sn;
     Atom wm_sn_atom;
@@ -148,7 +151,7 @@ static gboolean replace_wm()
     return TRUE;
 }
 
-gboolean screen_annex()
+gboolean screen_annex(void)
 {
     XSetWindowAttributes attrib;
     pid_t pid;
@@ -303,7 +306,7 @@ gboolean screen_annex()
     return TRUE;
 }
 
-static void screen_tell_ksplash()
+static void screen_tell_ksplash(void)
 {
     XEvent e;
     char **argv;
@@ -343,7 +346,7 @@ void screen_startup(gboolean reconfig)
     guint32 d;
     gboolean namesexist = FALSE;
 
-    desktop_popup = pager_popup_new(FALSE);
+    desktop_popup = pager_popup_new();
     pager_popup_height(desktop_popup, POPUP_HEIGHT);
 
     if (reconfig) {
@@ -452,7 +455,7 @@ void screen_shutdown(gboolean reconfig)
     screen_desktop_names = NULL;
 }
 
-void screen_resize()
+void screen_resize(void)
 {
     static gint oldw = 0, oldh = 0;
     gint w, h;
@@ -535,44 +538,11 @@ void screen_set_num_desktops(guint num)
         screen_set_desktop(num - 1, TRUE);
 }
 
-void screen_set_desktop(guint num, gboolean dofocus)
+static void screen_fallback_focus(void)
 {
     ObClient *c;
-    GList *it;
-    guint old;
-    gulong ignore_start;
     gboolean allow_omni;
 
-    g_assert(num < screen_num_desktops);
-
-    old = screen_desktop;
-    screen_desktop = num;
-
-    if (old == num) return;
-
-    PROP_SET32(RootWindow(ob_display, ob_screen),
-               net_current_desktop, cardinal, num);
-
-    screen_last_desktop = old;
-
-    ob_debug("Moving to desktop %d\n", num+1);
-
-    /* ignore enter events caused by the move */
-    ignore_start = event_start_ignore_all_enters();
-
-    if (moveresize_client)
-        client_set_desktop(moveresize_client, num, TRUE, FALSE);
-
-    /* show windows before hiding the rest to lessen the enter/leave events */
-
-    /* show windows from top to bottom */
-    for (it = stacking_list; it; it = g_list_next(it)) {
-        if (WINDOW_IS_CLIENT(it->data)) {
-            ObClient *c = it->data;
-            client_show(c);
-        }
-    }
-
     /* only allow omnipresent windows to get focus on desktop change if
        an omnipresent window is already focused (it'll keep focus probably, but
        maybe not depending on mouse-focus options) */
@@ -582,7 +552,7 @@ void screen_set_desktop(guint num, gboolean dofocus)
     /* the client moved there already so don't move focus. prevent flicker
        on sendtodesktop + follow */
     if (focus_client && focus_client->desktop == screen_desktop)
-        dofocus = FALSE;
+        return;
 
     /* have to try focus here because when you leave an empty desktop
        there is no focus out to watch for. also, we have different rules
@@ -592,7 +562,8 @@ void screen_set_desktop(guint num, gboolean dofocus)
        do this before hiding the windows so if helper windows are coming
        with us, they don't get hidden
     */
-    if (dofocus && (c = focus_fallback(TRUE, !config_focus_last, allow_omni)))
+    if ((c = focus_fallback(TRUE, !config_focus_last, allow_omni,
+                            !allow_omni)))
     {
         /* only do the flicker reducing stuff ahead of time if we are going
            to call xsetinputfocus on the window ourselves. otherwise there is
@@ -606,6 +577,83 @@ void screen_set_desktop(guint num, gboolean dofocus)
             client_bring_helper_windows(c);
         }
     }
+}
+
+static gboolean last_desktop_func(gpointer data)
+{
+    screen_desktop_timeout = TRUE;
+    return FALSE;
+}
+
+void screen_set_desktop(guint num, gboolean dofocus)
+{
+    GList *it;
+    guint previous;
+    gulong ignore_start;
+
+    g_assert(num < screen_num_desktops);
+
+    previous = screen_desktop;
+    screen_desktop = num;
+
+    if (previous == num) return;
+
+    PROP_SET32(RootWindow(ob_display, ob_screen),
+               net_current_desktop, cardinal, num);
+
+    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);
+
+    /* ignore enter events caused by the move */
+    ignore_start = event_start_ignore_all_enters();
+
+    if (moveresize_client)
+        client_set_desktop(moveresize_client, num, TRUE, FALSE);
+
+    /* show windows before hiding the rest to lessen the enter/leave events */
+
+    /* show windows from top to bottom */
+    for (it = stacking_list; it; it = g_list_next(it)) {
+        if (WINDOW_IS_CLIENT(it->data)) {
+            ObClient *c = it->data;
+            client_show(c);
+        }
+    }
+
+    if (dofocus) screen_fallback_focus();
 
     /* hide windows from bottom to top */
     for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
@@ -626,6 +674,11 @@ void screen_set_desktop(guint num, gboolean dofocus)
 
 void screen_add_desktop(gboolean current)
 {
+    gulong ignore_start;
+
+    /* ignore enter events caused by this */
+    ignore_start = event_start_ignore_all_enters();
+
     screen_set_num_desktops(screen_num_desktops+1);
 
     /* move all the clients over */
@@ -644,15 +697,21 @@ void screen_add_desktop(gboolean current)
             }
         }
     }
+
+    event_end_ignore_all_enters(ignore_start);
 }
 
 void screen_remove_desktop(gboolean current)
 {
     guint rmdesktop, movedesktop;
     GList *it, *stacking_copy;
+    gulong ignore_start;
 
     if (screen_num_desktops <= 1) return;
 
+    /* ignore enter events caused by this */
+    ignore_start = event_start_ignore_all_enters();
+
     /* what desktop are we removing and moving to? */
     if (current)
         rmdesktop = screen_desktop;
@@ -689,15 +748,15 @@ void screen_remove_desktop(gboolean current)
         }
     }
 
-    /* act like we're changing desktops */
+    /* fallback focus like we're changing desktops */
     if (screen_desktop < screen_num_desktops - 1) {
-        gint d = screen_desktop;
-        screen_desktop = screen_last_desktop;
-        screen_set_desktop(d, TRUE);
+        screen_fallback_focus();
         ob_debug("fake desktop change\n");
     }
 
     screen_set_num_desktops(screen_num_desktops-1);
+
+    event_end_ignore_all_enters(ignore_start);
 }
 
 static void get_row_col(guint d, guint *r, guint *c)
@@ -836,6 +895,13 @@ void screen_show_desktop_popup(guint d)
     ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
     ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000,
                              hide_desktop_popup_func, NULL, NULL, NULL);
+    g_free(a);
+}
+
+void screen_hide_desktop_popup(void)
+{
+    ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
+    pager_popup_hide(desktop_popup);
 }
 
 guint screen_find_desktop(guint from, ObDirection dir,
@@ -981,7 +1047,7 @@ static gboolean screen_validate_layout(ObDesktopLayout *l)
     return TRUE;
 }
 
-void screen_update_layout()
+void screen_update_layout(void)
 
 {
     ObDesktopLayout l;
@@ -1030,7 +1096,7 @@ void screen_update_layout()
     }
 }
 
-void screen_update_desktop_names()
+void screen_update_desktop_names(void)
 {
     guint i;
 
@@ -1120,7 +1186,7 @@ void screen_show_desktop(gboolean show, ObClient *show_only)
     else if (!show_only) {
         ObClient *c;
 
-        if ((c = focus_fallback(TRUE, FALSE, TRUE))) {
+        if ((c = focus_fallback(TRUE, FALSE, TRUE, FALSE))) {
             /* only do the flicker reducing stuff ahead of time if we are going
                to call xsetinputfocus on the window ourselves. otherwise there
                is no guarantee the window will actually take focus.. */
@@ -1192,7 +1258,7 @@ typedef struct {
     } \
 }
 
-void screen_update_areas()
+void screen_update_areas(void)
 {
     guint i, j;
     gulong *dims;
@@ -1484,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) {
@@ -1506,7 +1572,7 @@ guint screen_find_monitor(Rect *search)
     return most;
 }
 
-Rect* screen_physical_area_all_monitors()
+Rect* screen_physical_area_all_monitors(void)
 {
     return screen_physical_area_monitor(screen_num_monitors);
 }
@@ -1528,7 +1594,7 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *search)
     return RECT_INTERSECTS_RECT(monitor_area[head], *search);
 }
 
-Rect* screen_physical_area_active()
+Rect* screen_physical_area_active(void)
 {
     Rect *a;
     gint x, y;
@@ -1548,7 +1614,7 @@ Rect* screen_physical_area_active()
     return a;
 }
 
-void screen_set_root_cursor()
+void screen_set_root_cursor(void)
 {
     if (sn_app_starting())
         XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),
This page took 0.028922 seconds and 4 git commands to generate.