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