From 22333336d3ba36784955c67444f996b557f3838a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 11 Jan 2008 19:32:45 -0500 Subject: [PATCH] add an option for window placement, to try force new windows on the active monitor (for xinerama) --- data/rc.xml | 3 +++ data/rc.xsd | 1 + openbox/config.c | 4 ++++ openbox/config.h | 4 ++++ openbox/place.c | 13 ++++++++----- 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 @@
yes
+ no + 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 @@ + 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 */ -- 2.39.2