validate the desktop layout loaded from session
This commit is contained in:
parent
cec4b9df2e
commit
a055fd9e57
1 changed files with 67 additions and 66 deletions
133
openbox/screen.c
133
openbox/screen.c
|
@ -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;
|
||||
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()
|
||||
|
|
Loading…
Reference in a new issue