replace the <active> placement option with <placeOn>active/mouse/any</placeOn>
This commit is contained in:
parent
d409936faa
commit
dd740b5562
6 changed files with 39 additions and 16 deletions
|
@ -35,9 +35,10 @@
|
|||
<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 onto the active monitor on a multi-head system, unless
|
||||
they are part of an application already on another monitor -->
|
||||
<placeOn>Any</placeOn>
|
||||
<!-- with Smart placement on a multi-monitor system, try to place new windows
|
||||
on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
|
||||
the active window is -->
|
||||
</placement>
|
||||
|
||||
<theme>
|
||||
|
|
|
@ -54,7 +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:element name="placeOn" type="ob:placementmonitor"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="margins">
|
||||
<xsd:annotation>
|
||||
|
@ -402,6 +402,13 @@
|
|||
<xsd:enumeration value="UnderMouse"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="placementmonitor">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Any"/>
|
||||
<xsd:enumeration value="Mouse"/>
|
||||
<xsd:enumeration value="Active"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="popupposition">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Top"/>
|
||||
|
|
|
@ -36,9 +36,9 @@ gboolean config_focus_raise;
|
|||
gboolean config_focus_last;
|
||||
gboolean config_focus_under_mouse;
|
||||
|
||||
ObPlacePolicy config_place_policy;
|
||||
gboolean config_place_center;
|
||||
gboolean config_place_active;
|
||||
ObPlacePolicy config_place_policy;
|
||||
gboolean config_place_center;
|
||||
ObPlaceMonitor config_place_monitor;
|
||||
|
||||
StrutPartial config_margins;
|
||||
|
||||
|
@ -491,8 +491,12 @@ 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);
|
||||
if ((n = parse_find_node("placeOn", node))) {
|
||||
if (parse_contains("active", doc, n))
|
||||
config_place_monitor = OB_PLACE_MONITOR_ACTIVE;
|
||||
else if (parse_contains("mouse", doc, n))
|
||||
config_place_monitor = OB_PLACE_MONITOR_MOUSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
||||
|
@ -886,7 +890,7 @@ void config_startup(ObParseInst *i)
|
|||
|
||||
config_place_policy = OB_PLACE_POLICY_SMART;
|
||||
config_place_center = TRUE;
|
||||
config_place_active = FALSE;
|
||||
config_place_monitor = OB_PLACE_MONITOR_ANY;
|
||||
|
||||
parse_register(i, "placement", parse_placement, NULL);
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ extern ObPlacePolicy config_place_policy;
|
|||
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;
|
||||
extern ObPlaceMonitor config_place_monitor;
|
||||
|
||||
/*! User-specified margins around the edge of the screen(s) */
|
||||
extern StrutPartial config_margins;
|
||||
|
|
|
@ -108,7 +108,10 @@ static Rect **pick_head(ObClient *c)
|
|||
}
|
||||
}
|
||||
|
||||
if (focus_client && client_normal(focus_client)) {
|
||||
/* skip this if placing by the mouse position */
|
||||
if (focus_client && client_normal(focus_client) &&
|
||||
config_place_monitor != OB_PLACE_MONITOR_MOUSE)
|
||||
{
|
||||
add_choice(choice, client_monitor(focus_client));
|
||||
ob_debug("placement adding choice %d for normal focused window\n",
|
||||
client_monitor(focus_client));
|
||||
|
@ -146,7 +149,8 @@ static gboolean place_random(ObClient *client, gint *x, gint *y)
|
|||
guint i;
|
||||
|
||||
areas = pick_head(client);
|
||||
i = config_place_active ? 0 : g_random_int_range(0, screen_num_monitors);
|
||||
i = (config_place_monitor != OB_PLACE_MONITOR_ANY) ?
|
||||
0 : g_random_int_range(0, screen_num_monitors);
|
||||
|
||||
l = areas[i]->x;
|
||||
t = areas[i]->y;
|
||||
|
@ -255,9 +259,9 @@ 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, but only the first one
|
||||
if config_place_active is true */
|
||||
for (i = 0; (i < (config_place_active ? 1 : screen_num_monitors) &&
|
||||
!ret); ++i)
|
||||
if config_place_monitor is MOUSE or ACTIVE */
|
||||
for (i = 0; (i < (config_place_monitor != OB_PLACE_MONITOR_ANY ?
|
||||
1 : screen_num_monitors) && !ret); ++i)
|
||||
{
|
||||
GList *it;
|
||||
|
||||
|
|
|
@ -31,6 +31,13 @@ typedef enum
|
|||
OB_PLACE_POLICY_MOUSE
|
||||
} ObPlacePolicy;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OB_PLACE_MONITOR_ANY,
|
||||
OB_PLACE_MONITOR_ACTIVE,
|
||||
OB_PLACE_MONITOR_MOUSE
|
||||
} ObPlaceMonitor;
|
||||
|
||||
gboolean place_client(struct _ObClient *client, gint *x, gint *y,
|
||||
struct _ObAppSettings *settings);
|
||||
|
||||
|
|
Loading…
Reference in a new issue