all repos — openbox @ 7ffa091d5b464ce508023c3b5e5bc50a36be53fb

openbox fork - make it a bit more like ryudo

change the perapp settings "head" option to "monitor" i think its easier to understand.
some cleanup for perapp settings.
make monitor and desktop be specified starting at 1, like elsewhere in the config file.
Dana Jansens danakj@orodu.net
commit

7ffa091d5b464ce508023c3b5e5bc50a36be53fb

parent

6cd5f7ea380e155dbd7b29f01dd3fcfb5858ad61

5 files changed, 99 insertions(+), 77 deletions(-)

jump to
M data/rc.xml.indata/rc.xml.in

@@ -457,15 +457,16 @@ <x>center</x>

<!-- a number or 'center' to center on screen --> <y>200</y> <!-- a number or 'center' to center on screen --> - <head>0</head> - <!-- specifies the xinerama head, 'mouse' for wherever the mouse is --> + <monitor>1</monitor> + <!-- specifies the monitor in a xinerama setup. + 1 is the first head, or 'mouse' for wherever the mouse is --> </position> <focus>yes</focus> <!-- if the window should try be given focus when it appears --> <desktop>1</desktop> - <!-- 0 is the first desktop, 'all' for all desktops --> + <!-- 1 is the first desktop, 'all' for all desktops --> <layer>normal</layer> <!-- 'above', 'normal', or 'below' -->
M openbox/client.hopenbox/client.h

@@ -295,32 +295,6 @@

guint32 user_time; }; -struct _ObAppSettings -{ - gchar *class; - gchar *name; - gchar *role; - - Point position; - gboolean center_x; - gboolean center_y; - gboolean pos_given; - - guint desktop; - gint shade; - gint decor; - gint focus; - gint head; - gint iconic; - gint skip_pager; - gint skip_taskbar; - gint max_horz; - gint max_vert; - gint fullscreen; - - gint layer; -}; - extern GList *client_list; void client_startup(gboolean reconfig);
M openbox/config.copenbox/config.c

@@ -102,22 +102,23 @@ <layer>above</layer>

<position> <x>700</x> <y>0</y> - <head>1</head> + <monitor>1</monitor> </position> + .. there is a lot more settings available </application> </applications> */ /* Manages settings for individual applications. - Some notes: head is the screen number in a multi monitor + Some notes: monitor is the screen number in a multi monitor (Xinerama) setup (starting from 0) or mouse, meaning the - head the pointer is on. Default: mouse. + monitor the pointer is on. Default: mouse. 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 - center the window in the specified axis. Position is relative - from head, so <position><x>center</x></position><head>1</head> - will center the window on the second head. + center the window in the specified axis. Position is within + the monitor, so <position><x>center</x></position><monitor>2</monitor> + will center the window on the second monitor. */ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, gpointer d)

@@ -176,7 +177,7 @@ g_free(s);

} if (x_pos_given && (c = parse_find_node("y", n->children))) - if (!parse_contains("default", doc, )) { + if (!parse_contains("default", doc, c)) { gchar *s = parse_string(doc, c); if (!strcmp(s, "center")) { settings->center_y = TRUE;

@@ -189,13 +190,13 @@ g_free(s);

} if (settings->pos_given && - (c = parse_find_node("head", n->children))) - if (!parse_contains("default", doc, n)) { - gchar *s = parse_string(doc, n); + (c = parse_find_node("monitor", n->children))) + if (!parse_contains("default", doc, c)) { + gchar *s = parse_string(doc, c); if (!strcmp(s, "mouse")) - settings->head = -1; + settings->monitor = 0; else - settings->head = parse_int(doc, n); + settings->monitor = parse_int(doc, c) + 1; g_free(s); } }

@@ -205,61 +206,69 @@ if ((n = parse_find_node("focus", app->children)))

if (!parse_contains("default", doc, n)) settings->focus = parse_bool(doc, n); - if ((n = parse_find_node("desktop", app->children))) + if ((n = parse_find_node("desktop", app->children))) { if (!parse_contains("default", doc, n)) { gchar *s = parse_string(doc, n); if (!strcmp(s, "all")) settings->desktop = DESKTOP_ALL; - else - settings->desktop = parse_int(doc, n); + else { + gint i = parse_int(doc, n); + if (i > 0) + settings->desktop = i; g_free(s); } else - /* lets hope the user doesn't have 2^32 desktops */ - settings->desktop = DESKTOP_ALL - 1; + settings->desktop = 0; + } settings->layer = -2; - if ((n = parse_find_node("layer", app->children))) { - gchar *s = parse_string(doc, n); - if (!strcmp(s, "above")) - settings->layer = 1; - else if (!strcmp(s, "below")) - settings->layer = -1; - else - settings->layer = 0; - g_free(s); - } + if ((n = parse_find_node("layer", app->children))) + if (!parse_contains("default", doc, n)) { + gchar *s = parse_string(doc, n); + if (!strcmp(s, "above")) + settings->layer = 1; + else if (!strcmp(s, "below")) + settings->layer = -1; + else + settings->layer = 0; + g_free(s); + } settings->iconic = -1; if ((n = parse_find_node("iconic", app->children))) - settings->iconic = parse_bool(doc, n); + if (!parse_contains("default", doc, n)) + settings->iconic = parse_bool(doc, n); settings->skip_pager = -1; if ((n = parse_find_node("skip_pager", app->children))) - settings->skip_pager = parse_bool(doc, n); + if (!parse_contains("default", doc, n)) + settings->skip_pager = parse_bool(doc, n); settings->skip_taskbar = -1; if ((n = parse_find_node("skip_taskbar", app->children))) - settings->skip_taskbar = parse_bool(doc, n); + if (!parse_contains("default", doc, n)) + settings->skip_taskbar = parse_bool(doc, n); settings->fullscreen = -1; if ((n = parse_find_node("fullscreen", app->children))) - settings->fullscreen = parse_bool(doc, n); + if (!parse_contains("default", doc, n)) + settings->fullscreen = parse_bool(doc, n); settings->max_horz = -1; settings->max_vert = -1; - if ((n = parse_find_node("maximized", app->children))) { - gchar *s = parse_string(doc, n); - if (!strcmp(s, "horizontal")) { - settings->max_horz = TRUE; - settings->max_vert = FALSE; - } else if (!strcmp(s, "vertical")) { - settings->max_horz = FALSE; - settings->max_vert = TRUE; - } else - settings->max_horz = settings->max_vert = - parse_bool(doc, n); - g_free(s); - } + if ((n = parse_find_node("maximized", app->children))) + if (!parse_contains("default", doc, n)) { + gchar *s = parse_string(doc, n); + if (!strcmp(s, "horizontal")) { + settings->max_horz = TRUE; + settings->max_vert = FALSE; + } else if (!strcmp(s, "vertical")) { + settings->max_horz = FALSE; + settings->max_vert = TRUE; + } else + settings->max_horz = settings->max_vert = + parse_bool(doc, n); + g_free(s); + } config_per_app_settings = g_slist_append(config_per_app_settings, (gpointer) settings);
M openbox/config.hopenbox/config.h

@@ -23,11 +23,38 @@

#include "misc.h" #include "stacking.h" #include "place.h" +#include "geom.h" #include "render/render.h" #include <glib.h> struct _ObParseInst; + +struct _ObAppSettings +{ + gchar *class; + gchar *name; + gchar *role; + + Point position; + gboolean center_x; + gboolean center_y; + gboolean pos_given; + + guint desktop; + gint shade; + gint decor; + gint focus; + gint monitor; + gint iconic; + gint skip_pager; + gint skip_taskbar; + gint max_horz; + gint max_vert; + gint fullscreen; + + gint layer; +}; /*! Should new windows be focused */ extern gboolean config_focus_new;
M openbox/place.copenbox/place.c

@@ -52,6 +52,9 @@ }

g_assert_not_reached(); } +/*! Pick a monitor to place a window on. + The returned array value should be freed with g_free. The areas within the + array should not be freed. */ static Rect **pick_head(ObClient *c) { Rect **area;

@@ -388,16 +391,24 @@

static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y, ObAppSettings *settings) { - Rect *screen; + Rect *screen = NULL; if (!settings || (settings && !settings->pos_given)) return FALSE; /* Find which head the pointer is on */ - if (settings->head == -1) + if (settings->monitor == 0) screen = pick_pointer_head(client); - else - screen = screen_area_monitor(client->desktop, settings->head); + else if (settings->monitor > 0 && + (guint)settings->monitor <= screen_num_monitors) + screen = screen_area_monitor(client->desktop, + (guint)settings->monitor - 1); + else { + Rect **all = NULL; + all = pick_head(client); + screen = all[0]; + g_free(all); /* the areas themselves don't need to be freed */ + } if (settings->center_x) *x = screen->x + screen->width / 2 - client->area.width / 2;