validate the desktop layout loaded from session

This commit is contained in:
Dana Jansens 2007-05-23 13:58:51 +00:00
parent cec4b9df2e
commit a055fd9e57

View 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;
}
void screen_update_layout()
static gboolean screen_validate_layout(ObDesktopLayout *l)
{
ObOrientation orient;
ObCorner corner;
guint rows;
guint cols;
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()
{
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];
l.columns = data[1];
l.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--;
}
}
if (screen_validate_layout(&l))
screen_desktop_layout = l;
/* 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);
}
valid = TRUE;
}
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()