From a055fd9e57cc0715d491405c41494b5e155c795c Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 23 May 2007 13:58:51 +0000 Subject: [PATCH] validate the desktop layout loaded from session --- openbox/screen.c | 131 ++++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/openbox/screen.c b/openbox/screen.c index d92f18da..c566a908 100644 --- a/openbox/screen.c +++ b/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; } +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() -- 2.39.2