]> Dogcows Code - chaz/openbox/commitdiff
Add "active" and "primary" options to the <monitor> placement option for per-app...
authorDana Jansens <danakj@orodu.net>
Fri, 14 Oct 2011 23:12:11 +0000 (19:12 -0400)
committerDana Jansens <danakj@orodu.net>
Sun, 16 Oct 2011 22:51:51 +0000 (18:51 -0400)
openbox/config.c
openbox/config.h
openbox/place.c

index 8e0e5ac3877bf4e5e21337164531df229e0fa59a..857255faf840635254cd61e903893488a94fcf74 100644 (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);
index 890b002a8ec95d9ff169f1f336ea860612b90107..1802179d3f6774d67bc96b3a60e00d16bbfb888d 100644 (file)
 
 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;
index a13bc2cbdbff41cdc7e3fe27994ad4ea4656e56a..8a4a42649b0569110c7b343892faccef2c98fd39 100644 (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);
     }
This page took 0.027369 seconds and 4 git commands to generate.