user-sepcified margins

This commit is contained in:
Dana Jansens 2007-07-10 23:59:17 +00:00
parent 976d406529
commit 0b97b6043c
5 changed files with 83 additions and 2 deletions

View file

@ -126,6 +126,17 @@
<!-- 'Center' or 'Top' -->
</resize>
<!-- You can reserve a portion of your screen where windows will not cover when
they are maximized, or when they are initially placed.
Many programs reserve space automatically, but you can use this in other
cases. -->
<margins>
<top>0</top>
<bottom>0</bottom>
<left>0</left>
<right>0</right>
</margins>
<dock>
<position>TopLeft</position>
<!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->

View file

@ -55,6 +55,15 @@
<xsd:element name="policy" type="ob:placementpolicy"/>
<xsd:element name="center" type="ob:bool"/>
</xsd:complexType>
<xsd:complexType name="margins">
<xsd:annotation>
<xsd:documentation>defines desktop margins</xsd:documentation>
</xsd:annotation>
<xsd:element minOccurs="0" name="top" type="xsd:integer"/>
<xsd:element minOccurs="0" name="left" type="xsd:integer"/>
<xsd:element minOccurs="0" name="right" type="xsd:integer"/>
<xsd:element minOccurs="0" name="bottom" type="xsd:integer"/>
</xsd:complexType>
<xsd:complexType name="theme">
<xsd:element minOccurs="0" name="name" type="xsd:string"/>
<xsd:element minOccurs="0" name="titleLayout" type="xsd:string"/>

View file

@ -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;

View file

@ -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;

View file

@ -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) {