From 0b97b6043c177bc4cb0bc982a84278120f31c58a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 10 Jul 2007 23:59:17 +0000 Subject: [PATCH] user-sepcified margins --- data/rc.xml | 11 +++++++++++ data/rc.xsd | 9 +++++++++ openbox/config.c | 23 +++++++++++++++++++++++ openbox/config.h | 3 +++ openbox/screen.c | 39 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 83 insertions(+), 2 deletions(-) diff --git a/data/rc.xml b/data/rc.xml index 3ad7994..1630de4 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -126,6 +126,17 @@ + + + 0 + 0 + 0 + 0 + + TopLeft diff --git a/data/rc.xsd b/data/rc.xsd index 89bed98..debac5b 100644 --- a/data/rc.xsd +++ b/data/rc.xsd @@ -55,6 +55,15 @@ + + + defines desktop margins + + + + + + diff --git a/openbox/config.c b/openbox/config.c index 96f3ba8..a7d44ed 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -39,6 +39,8 @@ gboolean config_focus_under_mouse; ObPlacePolicy config_place_policy; gboolean config_place_center; +StrutPartial config_margins; + gchar *config_theme; gboolean config_theme_keepborder; @@ -499,6 +501,23 @@ static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, config_place_center = parse_bool(doc, n); } +static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, + gpointer d) +{ + xmlNodePtr n; + + node = node->children; + + if ((n = parse_find_node("top", node))) + config_margins.top = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("left", node))) + config_margins.left = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("right", node))) + config_margins.right = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("bottom", node))) + config_margins.bottom = MAX(0, parse_int(doc, n)); +} + static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, gpointer d) { @@ -842,6 +861,10 @@ void config_startup(ObParseInst *i) parse_register(i, "placement", parse_placement, NULL); + STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + parse_register(i, "margins", parse_margins, NULL); + config_theme = NULL; config_animate_iconify = TRUE; diff --git a/openbox/config.h b/openbox/config.h index 8a365f8..42bf353 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -79,6 +79,9 @@ extern ObPlacePolicy config_place_policy; /*! Place windows in the center of the free area */ extern gboolean config_place_center; +/*! User-specified margins around the edge of the screen(s) */ +extern StrutPartial config_margins; + /*! When true windows' contents are refreshed while they are resized; otherwise they are not updated until the resize is complete */ extern gboolean config_resize_redraw; diff --git a/openbox/screen.c b/openbox/screen.c index 0dfca59..de3c9fb 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -1199,6 +1199,15 @@ typedef struct { sl = g_slist_prepend(sl, ss); \ } +#define VALIDATE_STRUTS(sl, side, max) \ +{ \ + GSList *it; \ + for (it = sl; it; it = g_slist_next(it)) { \ + ObScreenStrut *ss = it->data; \ + ss->strut->side = MIN(max, ss->strut->side); \ + } \ +} + void screen_update_areas() { guint i, j; @@ -1206,11 +1215,19 @@ void screen_update_areas() GList *it; GSList *sit; - ob_debug("updating screen areas\n"); - g_free(monitor_area); extensions_xinerama_screens(&monitor_area, &screen_num_monitors); + /* set up the user-specified margins */ + config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]); + config_margins.top_end = RECT_RIGHT(monitor_area[screen_num_monitors]); + config_margins.bottom_start = RECT_LEFT(monitor_area[screen_num_monitors]); + config_margins.bottom_end = RECT_RIGHT(monitor_area[screen_num_monitors]); + config_margins.left_start = RECT_TOP(monitor_area[screen_num_monitors]); + config_margins.left_end = RECT_BOTTOM(monitor_area[screen_num_monitors]); + config_margins.right_start = RECT_TOP(monitor_area[screen_num_monitors]); + config_margins.right_end = RECT_BOTTOM(monitor_area[screen_num_monitors]); + dims = g_new(gulong, 4 * screen_num_desktops * screen_num_monitors); RESET_STRUT_LIST(struts_left); @@ -1239,6 +1256,24 @@ void screen_update_areas() if (dock_strut.bottom) ADD_STRUT_TO_LIST(struts_bottom, DESKTOP_ALL, &dock_strut); + if (config_margins.left) + ADD_STRUT_TO_LIST(struts_left, DESKTOP_ALL, &config_margins); + if (config_margins.top) + ADD_STRUT_TO_LIST(struts_top, DESKTOP_ALL, &config_margins); + if (config_margins.right) + ADD_STRUT_TO_LIST(struts_right, DESKTOP_ALL, &config_margins); + if (config_margins.bottom) + ADD_STRUT_TO_LIST(struts_bottom, DESKTOP_ALL, &config_margins); + + VALIDATE_STRUTS(struts_left, left, + monitor_area[screen_num_monitors].width / 2); + VALIDATE_STRUTS(struts_right, right, + monitor_area[screen_num_monitors].width / 2); + VALIDATE_STRUTS(struts_top, top, + monitor_area[screen_num_monitors].height / 2); + VALIDATE_STRUTS(struts_bottom, bottom, + monitor_area[screen_num_monitors].height / 2); + /* set up the work areas to be full screen */ for (i = 0; i < screen_num_monitors; ++i) for (j = 0; j < screen_num_desktops; ++j) { -- 1.9.1