validate the desktop layout loaded from session
authorDana Jansens <danakj@orodu.net>
Wed, 23 May 2007 13:58:51 +0000 (13:58 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 23 May 2007 13:58:51 +0000 (13:58 +0000)
openbox/screen.c

index d92f18d..c566a90 100644 (file)
@@ -50,6 +50,9 @@
                         SubstructureRedirectMask | FocusChangeMask | \
                         ButtonPressMask | ButtonReleaseMask | ButtonMotionMask)
 
+static gboolean screen_validate_layout(ObDesktopLayout *l);
+static gboolean replace_wm();
+
 guint    screen_num_desktops;
 guint    screen_num_monitors;
 guint    screen_desktop;
@@ -383,8 +386,11 @@ void screen_startup(gboolean reconfig)
     PROP_SET32(RootWindow(ob_display, ob_screen),
                net_showing_desktop, cardinal, screen_showing_desktop);
 
-    if (session_desktop_layout_present)
+    if (session_desktop_layout_present &&
+        screen_validate_layout(&session_desktop_layout))
+    {
         screen_desktop_layout = session_desktop_layout;
+    }
     else
         screen_update_layout();
 }
@@ -816,95 +822,90 @@ show_cycle_dialog:
     return ret;
 }
 
+static gboolean screen_validate_layout(ObDesktopLayout *l)
+{
+    if (l->columns == 0 && l->rows == 0) /* both 0's is bad data.. */
+        return FALSE;
+
+    /* fill in a zero rows/columns */
+    if (l->columns == 0) {
+        l->columns = screen_num_desktops / l->rows;
+        if (l->rows * l->columns < screen_num_desktops)
+            l->columns++;
+        if (l->rows * l->columns >= screen_num_desktops + l->columns)
+            l->rows--;
+    } else if (l->rows == 0) {
+        l->rows = screen_num_desktops / l->columns;
+        if (l->columns * l->rows < screen_num_desktops)
+            l->rows++;
+        if (l->columns * l->rows >= screen_num_desktops + l->rows)
+            l->columns--;
+    }
+
+    /* bounds checking */
+    if (l->orientation == OB_ORIENTATION_HORZ) {
+        l->columns = MIN(screen_num_desktops, l->columns);
+        l->rows = MIN(l->rows,
+                      (screen_num_desktops + l->columns - 1) / l->columns);
+        l->columns = screen_num_desktops / l->rows +
+            !!(screen_num_desktops % l->rows);
+    } else {
+        l->rows = MIN(screen_num_desktops, l->rows);
+        l->columns = MIN(l->columns,
+                         (screen_num_desktops + l->rows - 1) / l->rows);
+        l->rows = screen_num_desktops / l->columns +
+            !!(screen_num_desktops % l->columns);
+    }
+    return TRUE;
+}
+
 void screen_update_layout()
+
 {
-    ObOrientation orient;
-    ObCorner corner;
-    guint rows;
-    guint cols;
+    ObDesktopLayout l;
     guint32 *data;
     guint num;
-    gboolean valid = FALSE;
+
+    screen_desktop_layout.orientation = OB_ORIENTATION_HORZ;
+    screen_desktop_layout.start_corner = OB_CORNER_TOPLEFT;
+    screen_desktop_layout.rows = 1;
+    screen_desktop_layout.columns = screen_num_desktops;
 
     if (PROP_GETA32(RootWindow(ob_display, ob_screen),
                     net_desktop_layout, cardinal, &data, &num)) {
         if (num == 3 || num == 4) {
-
+            
             if (data[0] == prop_atoms.net_wm_orientation_vert)
-                orient = OB_ORIENTATION_VERT;
+                l.orientation = OB_ORIENTATION_VERT;
             else if (data[0] == prop_atoms.net_wm_orientation_horz)
-                orient = OB_ORIENTATION_HORZ;
+                l.orientation = OB_ORIENTATION_HORZ;
             else
-                goto screen_update_layout_bail;
+                return;
 
             if (num < 4)
-                corner = OB_CORNER_TOPLEFT;
+                l.start_corner = OB_CORNER_TOPLEFT;
             else {
                 if (data[3] == prop_atoms.net_wm_topleft)
-                    corner = OB_CORNER_TOPLEFT;
+                    l.start_corner = OB_CORNER_TOPLEFT;
                 else if (data[3] == prop_atoms.net_wm_topright)
-                    corner = OB_CORNER_TOPRIGHT;
+                    l.start_corner = OB_CORNER_TOPRIGHT;
                 else if (data[3] == prop_atoms.net_wm_bottomright)
-                    corner = OB_CORNER_BOTTOMRIGHT;
+                    l.start_corner = OB_CORNER_BOTTOMRIGHT;
                 else if (data[3] == prop_atoms.net_wm_bottomleft)
-                    corner = OB_CORNER_BOTTOMLEFT;
+                    l.start_corner = OB_CORNER_BOTTOMLEFT;
                 else
-                    goto screen_update_layout_bail;
+                    return;
             }
 
-            cols = data[1];
-            rows = data[2];
-
-            /* fill in a zero rows/columns */
-            if ((cols == 0 && rows == 0)) { /* both 0's is bad data.. */
-                goto screen_update_layout_bail;
-            } else {
-                if (cols == 0) {
-                    cols = screen_num_desktops / rows;
-                    if (rows * cols < screen_num_desktops)
-                        cols++;
-                    if (rows * cols >= screen_num_desktops + cols)
-                        rows--;
-                } else if (rows == 0) {
-                    rows = screen_num_desktops / cols;
-                    if (cols * rows < screen_num_desktops)
-                        rows++;
-                    if (cols * rows >= screen_num_desktops + rows)
-                        cols--;
-                }
-            }
+            l.columns = data[1];
+            l.rows = data[2];
 
-            /* bounds checking */
-            if (orient == OB_ORIENTATION_HORZ) {
-                cols = MIN(screen_num_desktops, cols);
-                rows = MIN(rows, (screen_num_desktops + cols - 1) / cols);
-                cols = screen_num_desktops / rows +
-                    !!(screen_num_desktops % rows);
-            } else {
-                rows = MIN(screen_num_desktops, rows);
-                cols = MIN(cols, (screen_num_desktops + rows - 1) / rows);
-                rows = screen_num_desktops / cols +
-                    !!(screen_num_desktops % cols);
-            }
+            if (screen_validate_layout(&l))
+                screen_desktop_layout = l;
 
-            valid = TRUE;
+            g_free(data);
         }
-    screen_update_layout_bail:
-        g_free(data);
     }
-
-    if (!valid) {
-        /* defaults */
-        orient = OB_ORIENTATION_HORZ;
-        corner = OB_CORNER_TOPLEFT;
-        rows = 1;
-        cols = screen_num_desktops;
-    }
-
-    screen_desktop_layout.orientation = orient;
-    screen_desktop_layout.start_corner = corner;
-    screen_desktop_layout.rows = rows;
-    screen_desktop_layout.columns = cols;
 }
 
 void screen_update_desktop_names()