Add "active" and "primary" options to the <monitor> placement option for per-app settings (bug #5180)

This commit is contained in:
Dana Jansens 2011-10-14 19:12:11 -04:00
parent a0d14c7d44
commit c590a83207
3 changed files with 29 additions and 4 deletions

View file

@ -111,6 +111,7 @@ ObAppSettings* config_create_app_settings(void)
settings->type = -1;
settings->decor = -1;
settings->shade = -1;
settings->monitor_type = 0;
settings->monitor = -1;
settings->focus = -1;
settings->desktop = 0;
@ -135,6 +136,7 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src,
copy_if(type, (ObClientType)-1);
copy_if(decor, -1);
copy_if(shade, -1);
copy_if(monitor_type, 0);
copy_if(monitor, -1);
copy_if(focus, -1);
copy_if(desktop, 0);
@ -200,8 +202,8 @@ void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
/* Manages settings for individual applications.
Some notes: monitor is the screen number in a multi monitor
(Xinerama) setup (starting from 0) or mouse, meaning the
monitor the pointer is on. Default: mouse.
(Xinerama) setup (starting from 0), or mouse: the monitor the pointer
is on, active: the active monitor, primary: the primary monitor.
Layer can be three values, above (Always on top), below
(Always on bottom) and everything else (normal behaviour).
Positions can be an integer value or center, which will
@ -294,7 +296,14 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
if (!obt_xml_node_contains(c, "default")) {
gchar *s = obt_xml_node_string(c);
if (!g_ascii_strcasecmp(s, "mouse"))
settings->monitor = 0;
settings->monitor_type =
OB_APP_SETTINGS_MONITOR_MOUSE;
else if (!g_ascii_strcasecmp(s, "active"))
settings->monitor_type =
OB_APP_SETTINGS_MONITOR_ACTIVE;
else if (!g_ascii_strcasecmp(s, "primary"))
settings->monitor_type =
OB_APP_SETTINGS_MONITOR_PRIMARY;
else
settings->monitor = obt_xml_node_int(c);
g_free(s);

View file

@ -33,6 +33,13 @@
typedef struct _ObAppSettings ObAppSettings;
typedef enum {
OB_APP_SETTINGS_MONITOR_FIXED,
OB_APP_SETTINGS_MONITOR_PRIMARY,
OB_APP_SETTINGS_MONITOR_ACTIVE,
OB_APP_SETTINGS_MONITOR_MOUSE
} ObAppSettingsMonitor;
struct _ObAppSettings
{
GPatternSpec *class;
@ -49,6 +56,7 @@ struct _ObAppSettings
gint shade;
gint decor;
gint focus;
ObAppSettingsMonitor monitor_type;
gint monitor;
gint iconic;
gint skip_pager;

View file

@ -451,7 +451,15 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
ob_debug("placing by per-app settings");
/* Find which head the pointer is on */
if (settings->monitor == 0) {
if (settings->monitor_type == OB_APP_SETTINGS_MONITOR_PRIMARY) {
guint m = screen_monitor_primary(TRUE);
screen = screen_area(client->desktop, m, NULL);
}
else if (settings->monitor_type == OB_APP_SETTINGS_MONITOR_ACTIVE) {
guint m = screen_monitor_active();
screen = screen_area(client->desktop, m, NULL);
}
else if (settings->monitor_type == OB_APP_SETTINGS_MONITOR_MOUSE) {
screen = pick_pointer_head(client);
g_assert(screen);
}