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 | \
|
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()
|
||||||
|
|
Loading…
Reference in a new issue