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;
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();
}
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()