all repos — openbox @ 22333336d3ba36784955c67444f996b557f3838a

openbox fork - make it a bit more like ryudo

add an <active> option for window placement, to try force new windows on the active monitor (for xinerama)
Dana Jansens danakj@orodu.net
commit

22333336d3ba36784955c67444f996b557f3838a

parent

602a73c15ce22250a604e443a994ad6c8726f3f5

5 files changed, 20 insertions(+), 5 deletions(-)

jump to
M data/rc.xmldata/rc.xml

@@ -35,6 +35,9 @@ <!-- 'Smart' or 'UnderMouse' -->

<center>yes</center> <!-- whether to place windows in the center of the free area found or the top left corner --> + <active>no</active> + <!-- force new windows ont the active monitor on a multi-head system, unless + they are part of an application already on another monitor --> </placement> <theme>
M data/rc.xsddata/rc.xsd

@@ -54,6 +54,7 @@ <xsd:documentation>defines how new windows are placed</xsd:documentation>

</xsd:annotation> <xsd:element name="policy" type="ob:placementpolicy"/> <xsd:element name="center" type="ob:bool"/> + <xsd:element name="active" type="ob:bool"/> </xsd:complexType> <xsd:complexType name="margins"> <xsd:annotation>
M openbox/config.copenbox/config.c

@@ -38,6 +38,7 @@ gboolean config_focus_under_mouse;

ObPlacePolicy config_place_policy; gboolean config_place_center; +gboolean config_place_active; StrutPartial config_margins;

@@ -500,6 +501,8 @@ if (parse_contains("UnderMouse", doc, n))

config_place_policy = OB_PLACE_POLICY_MOUSE; if ((n = parse_find_node("center", node))) config_place_center = parse_bool(doc, n); + if ((n = parse_find_node("active", node))) + config_place_active = parse_bool(doc, n); } static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,

@@ -880,6 +883,7 @@ parse_register(i, "focus", parse_focus, NULL);

config_place_policy = OB_PLACE_POLICY_SMART; config_place_center = TRUE; + config_place_active = FALSE; parse_register(i, "placement", parse_placement, NULL);
M openbox/config.hopenbox/config.h

@@ -75,9 +75,13 @@ /*! Try keep focus on the window under the mouse when the mouse is not moving

*/ extern gboolean config_focus_under_mouse; +/*! The algorithm to use for placing new windows */ extern ObPlacePolicy config_place_policy; /*! Place windows in the center of the free area */ extern gboolean config_place_center; +/*! Place windows on the active monitor (unless they are part of an application + already on another monitor) */ +extern gboolean config_place_active; /*! User-specified margins around the edge of the screen(s) */ extern StrutPartial config_margins;
M openbox/place.copenbox/place.c

@@ -108,9 +108,9 @@ }

} } - if (focus_client) { + if (focus_client && client_normal(focus_client)) { add_choice(choice, client_monitor(focus_client)); - ob_debug("placement adding choice %d for focused window\n", + ob_debug("placement adding choice %d for normal focused window\n", client_monitor(focus_client)); }

@@ -146,7 +146,7 @@ Rect **areas;

guint i; areas = pick_head(client); - i = g_random_int_range(0, screen_num_monitors); + i = config_place_active ? 0 : g_random_int_range(0, screen_num_monitors); l = areas[i]->x; t = areas[i]->y;

@@ -254,8 +254,11 @@ maxit = NULL;

/* try ignoring different things to find empty space */ for (ignore = 0; ignore < IGNORE_END && !ret; ignore++) { - /* try all monitors in order of preference */ - for (i = 0; i < screen_num_monitors && !ret; ++i) { + /* try all monitors in order of preference, but only the first one + if config_place_active is true */ + for (i = 0; (i < (config_place_active ? 1 : screen_num_monitors) && + !ret); ++i) + { GList *it; /* add the whole monitor */