summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-01-11 19:32:45 -0500
committerDana Jansens <danakj@orodu.net>2008-01-11 19:32:45 -0500
commit22333336d3ba36784955c67444f996b557f3838a (patch)
tree579e484f5d0be3d5b6f51c1e972de5d8201eaf65
parent602a73c15ce22250a604e443a994ad6c8726f3f5 (diff)
add an <active> option for window placement, to try force new windows on the active monitor (for xinerama)
-rw-r--r--data/rc.xml3
-rw-r--r--data/rc.xsd1
-rw-r--r--openbox/config.c4
-rw-r--r--openbox/config.h4
-rw-r--r--openbox/place.c13
5 files changed, 20 insertions, 5 deletions
diff --git a/data/rc.xml b/data/rc.xml
index e3a59eb2..efbd8a9c 100644
--- a/data/rc.xml
+++ b/data/rc.xml
@@ -35,6 +35,9 @@
<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>
diff --git a/data/rc.xsd b/data/rc.xsd
index adafc5f4..ef610bfa 100644
--- a/data/rc.xsd
+++ b/data/rc.xsd
@@ -54,6 +54,7 @@
</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>
diff --git a/openbox/config.c b/openbox/config.c
index ff4c542b..25e30fff 100644
--- a/openbox/config.c
+++ b/openbox/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 @@ static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
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 @@ void config_startup(ObParseInst *i)
config_place_policy = OB_PLACE_POLICY_SMART;
config_place_center = TRUE;
+ config_place_active = FALSE;
parse_register(i, "placement", parse_placement, NULL);
diff --git a/openbox/config.h b/openbox/config.h
index 9d0602e2..2c4b4dba 100644
--- a/openbox/config.h
+++ b/openbox/config.h
@@ -75,9 +75,13 @@ extern gboolean config_focus_last;
*/
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;
diff --git a/openbox/place.c b/openbox/place.c
index aa572db2..276d9288 100644
--- a/openbox/place.c
+++ b/openbox/place.c
@@ -108,9 +108,9 @@ static Rect **pick_head(ObClient *c)
}
}
- 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 @@ static gboolean place_random(ObClient *client, gint *x, gint *y)
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 @@ static gboolean place_nooverlap(ObClient *c, gint *x, gint *y)
/* 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 */