Fix a minor issue with lastdesktop right after startup.
[mikachu/openbox.git] / openbox / screen.c
index 5e0f67d..5201f78 100644 (file)
@@ -59,16 +59,16 @@ static void     screen_fallback_focus(void);
 guint    screen_num_desktops;
 guint    screen_num_monitors;
 guint    screen_desktop;
-guint    screen_last_desktop = 1;
-guint    screen_old_desktop;
-gboolean screen_desktop_timeout = TRUE;
-Size     screen_physical_size;
+guint    screen_last_desktop;
 gboolean screen_showing_desktop;
 ObDesktopLayout screen_desktop_layout;
 gchar  **screen_desktop_names;
 Window   screen_support_win;
 Time     screen_desktop_user_time = CurrentTime;
 
+static Size     screen_physical_size;
+static guint    screen_old_desktop;
+static gboolean screen_desktop_timeout = TRUE;
 /*! An array of desktops, holding array of areas per monitor */
 static Rect  *monitor_area = NULL;
 /*! An array of desktops, holding an array of struts */
@@ -289,6 +289,8 @@ gboolean screen_annex(void)
     supported[i++] = prop_atoms.net_wm_sync_request;
     supported[i++] = prop_atoms.net_wm_sync_request_counter;
 #endif
+    supported[i++] = prop_atoms.net_wm_pid;
+    supported[i++] = prop_atoms.net_wm_ping;
 
     supported[i++] = prop_atoms.kde_wm_change_state;
     supported[i++] = prop_atoms.kde_net_wm_frame_strut;
@@ -298,6 +300,7 @@ gboolean screen_annex(void)
     supported[i++] = prop_atoms.ob_wm_state_undecorated;
     supported[i++] = prop_atoms.openbox_pid;
     supported[i++] = prop_atoms.ob_theme;
+    supported[i++] = prop_atoms.ob_config_file;
     supported[i++] = prop_atoms.ob_control;
     g_assert(i == num_support);
 
@@ -400,7 +403,13 @@ void screen_startup(gboolean reconfig)
     screen_num_desktops = 0;
     if (PROP_GET32(RootWindow(ob_display, ob_screen),
                    net_number_of_desktops, cardinal, &d))
+    {
+        if (d != config_desktops_num) {
+            g_warning(_("Openbox is configured for %d desktops, but the current session has %d.  Overriding the Openbox configuration."),
+                      config_desktops_num, d);
+        }
         screen_set_num_desktops(d);
+    }
     /* restore from session if possible */
     else if (session_num_desktops)
         screen_set_num_desktops(session_num_desktops);
@@ -605,32 +614,66 @@ void screen_set_desktop(guint num, gboolean dofocus)
     PROP_SET32(RootWindow(ob_display, ob_screen),
                net_current_desktop, cardinal, num);
 
+    /* This whole thing decides when/how to save the screen_last_desktop so
+       that it can be restored later if you want */
     if (screen_desktop_timeout) {
-        if (screen_desktop == screen_last_desktop) {
-            screen_last_desktop = previous;
+        /* If screen_desktop_timeout is true, then we've been on this desktop
+           long enough and we can save it as the last desktop. */
+
+        if (screen_last_desktop == previous)
+            /* this is the startup state only */
             screen_old_desktop = screen_desktop;
-        } else {
+        else {
+            /* save the "last desktop" as the "old desktop" */
             screen_old_desktop = screen_last_desktop;
+            /* save the desktop we're coming from as the "last desktop" */
             screen_last_desktop = previous;
         }
-    } else {
+    }
+    else {
+        /* If screen_desktop_timeout is false, then we just got to this desktop
+           and we are moving away again. */
+
         if (screen_desktop == screen_last_desktop) {
+            /* If we are moving to the "last desktop" .. */
             if (previous == screen_old_desktop) {
+                /* .. from the "old desktop", change the last desktop to
+                   be where we are coming from */
                 screen_last_desktop = screen_old_desktop;
-            } else if (screen_last_desktop == screen_old_desktop) {
+            }
+            else if (screen_last_desktop == screen_old_desktop) {
+                /* .. and also to the "old desktop", change the "last
+                   desktop" to be where we are coming from */
                 screen_last_desktop = previous;
-            } else {
+            }
+            else {
+                /* .. from some other desktop, then set the "last desktop" to
+                   be the saved "old desktop", i.e. where we were before the
+                   "last desktop" */
                 screen_last_desktop = screen_old_desktop;
             }
-        } else {
+        }
+        else {
+            /* If we are moving to any desktop besides the "last desktop"..
+               (this is the normal case) */
             if (screen_desktop == screen_old_desktop) {
-                /* do nothing */
-            } else if (previous == screen_old_desktop) {
-                /* do nothing */
-            } else if (screen_last_desktop == screen_old_desktop) {
+                /* If moving to the "old desktop", which is not the
+                   "last desktop", don't save anything */
+            }
+            else if (previous == screen_old_desktop) {
+                /* If moving from the "old desktop", and not to the
+                   "last desktop", don't save anything */
+            }
+            else if (screen_last_desktop == screen_old_desktop) {
+                /* If the "last desktop" is the same as "old desktop" and
+                   you're not moving to the "last desktop" then save where
+                   we're coming from as the "last desktop" */
                 screen_last_desktop = previous;
-            } else {
-                /* do nothing */
+            }
+            else {
+                /* If the "last desktop" is different from the "old desktop"
+                   and you're not moving to the "last desktop", then don't save
+                   anything */
             }
         }
     }