summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2010-01-08 18:16:37 -0500
committerMikael Magnusson <mikachu@gmail.com>2010-01-10 22:15:27 +0100
commitb3cc8f48768c10db97fe18e0702285b110e5978b (patch)
tree2acdd5e24bbef29d14cbe320de146a42380ddcc6 /openbox
parent8c9fb63baaf7d6245cccc584359bf09359663bea (diff)
allow application rules to place transient/dialog/splash windows, and allow application rules to match only on the role or type if you wish.
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c20
-rw-r--r--openbox/config.c61
-rw-r--r--openbox/place.c4
3 files changed, 47 insertions, 38 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 98a27dc9..4b703768 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -327,9 +327,7 @@ void client_manage(Window window, ObPrompt *prompt)
"program + user specified" :
"BADNESS !?")))), place.width, place.height);
- /* splash screens are also returned as TRUE for transient,
- and so will be forced on screen below */
- transient = place_client(self, &place.x, &place.y, settings);
+ place_client(self, &place.x, &place.y, settings);
/* make sure the window is visible. */
client_find_onscreen(self, &place.x, &place.y,
@@ -345,11 +343,13 @@ void client_manage(Window window, ObPrompt *prompt)
it is up to the placement routines to avoid
the xinerama divides)
- splash screens get "transient" set to TRUE by
- the place_client call
+ children and splash screens are forced on
+ screen, but i don't remember why i decided to
+ do that.
*/
ob_state() == OB_STATE_RUNNING &&
- (transient ||
+ (self->type == OB_CLIENT_TYPE_DIALOG ||
+ self->type == OB_CLIENT_TYPE_SPLASH ||
(!((self->positioned & USPosition) ||
(settings && settings->pos_given)) &&
client_normal(self) &&
@@ -791,10 +791,9 @@ static ObAppSettings *client_get_settings_state(ObClient *self)
ObAppSettings *app = it->data;
gboolean match = TRUE;
- g_assert(app->name != NULL || app->class != NULL);
+ g_assert(app->name != NULL || app->class != NULL ||
+ app->role != NULL || (signed)app->type >= 0);
- /* we know that either name or class is not NULL so it will have to
- match to use the rule */
if (app->name &&
!g_pattern_match(app->name, strlen(self->name), self->name, NULL))
match = FALSE;
@@ -806,8 +805,9 @@ static ObAppSettings *client_get_settings_state(ObClient *self)
!g_pattern_match(app->role,
strlen(self->role), self->role, NULL))
match = FALSE;
- else if ((signed)app->type >= 0 && app->type != self->type)
+ else if ((signed)app->type >= 0 && app->type != self->type) {
match = FALSE;
+ }
if (match) {
ob_debug("Window matching: %s", app->name);
diff --git a/openbox/config.c b/openbox/config.c
index 6963559d..6904759c 100644
--- a/openbox/config.c
+++ b/openbox/config.c
@@ -149,7 +149,7 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src,
dst->pos_given = TRUE;
dst->pos_force = src->pos_force;
dst->position = src->position;
- dst->monitor = src->monitor;
+ /* monitor is copied above */
}
}
@@ -200,8 +200,9 @@ static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
static void parse_per_app_settings(xmlNodePtr node, gpointer d)
{
xmlNodePtr app = obt_xml_find_node(node->children, "application");
- gchar *name = NULL, *class = NULL, *role = NULL, *type = NULL;
- gboolean name_set, class_set, type_set;
+ gchar *name = NULL, *class = NULL, *role = NULL, *type_str = NULL;
+ gboolean name_set, class_set, type_set, role_set;
+ ObClientType type;
gboolean x_pos_given;
while (app) {
@@ -209,8 +210,32 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
class_set = obt_xml_attr_string(app, "class", &class);
name_set = obt_xml_attr_string(app, "name", &name);
- type_set = obt_xml_attr_string(app, "type", &type);
- if (class_set || name_set) {
+ type_set = obt_xml_attr_string(app, "type", &type_str);
+ role_set = obt_xml_attr_string(app, "role", &role);
+
+ /* validate the type tho */
+ if (type_set) {
+ if (!g_ascii_strcasecmp(type_str, "normal"))
+ type = OB_CLIENT_TYPE_NORMAL;
+ else if (!g_ascii_strcasecmp(type_str, "dialog"))
+ type = OB_CLIENT_TYPE_DIALOG;
+ else if (!g_ascii_strcasecmp(type_str, "splash"))
+ type = OB_CLIENT_TYPE_SPLASH;
+ else if (!g_ascii_strcasecmp(type_str, "utility"))
+ type = OB_CLIENT_TYPE_UTILITY;
+ else if (!g_ascii_strcasecmp(type_str, "menu"))
+ type = OB_CLIENT_TYPE_MENU;
+ else if (!g_ascii_strcasecmp(type_str, "toolbar"))
+ type = OB_CLIENT_TYPE_TOOLBAR;
+ else if (!g_ascii_strcasecmp(type_str, "dock"))
+ type = OB_CLIENT_TYPE_DOCK;
+ else if (!g_ascii_strcasecmp(type_str, "desktop"))
+ type = OB_CLIENT_TYPE_DESKTOP;
+ else
+ type_set = FALSE; /* not valid! */
+ }
+
+ if (class_set || name_set || role_set || type_set) {
xmlNodePtr n, c;
ObAppSettings *settings = config_create_app_settings();;
@@ -220,28 +245,12 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
if (class_set)
settings->class = g_pattern_spec_new(class);
- if (type_set) {
- if (!g_ascii_strcasecmp(type, "normal"))
- settings->type = OB_CLIENT_TYPE_NORMAL;
- else if (!g_ascii_strcasecmp(type, "dialog"))
- settings->type = OB_CLIENT_TYPE_DIALOG;
- else if (!g_ascii_strcasecmp(type, "splash"))
- settings->type = OB_CLIENT_TYPE_SPLASH;
- else if (!g_ascii_strcasecmp(type, "utility"))
- settings->type = OB_CLIENT_TYPE_UTILITY;
- else if (!g_ascii_strcasecmp(type, "menu"))
- settings->type = OB_CLIENT_TYPE_MENU;
- else if (!g_ascii_strcasecmp(type, "toolbar"))
- settings->type = OB_CLIENT_TYPE_TOOLBAR;
- else if (!g_ascii_strcasecmp(type, "dock"))
- settings->type = OB_CLIENT_TYPE_DOCK;
- else if (!g_ascii_strcasecmp(type, "desktop"))
- settings->type = OB_CLIENT_TYPE_DESKTOP;
- }
-
- if (obt_xml_attr_string(app, "role", &role))
+ if (role_set)
settings->role = g_pattern_spec_new(role);
+ if (type_set)
+ settings->type = type;
+
if ((n = obt_xml_find_node(app->children, "decor")))
if (!obt_xml_node_contains(n, "default"))
settings->decor = obt_xml_node_bool(n);
@@ -339,7 +348,7 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
}
config_per_app_settings = g_slist_append(config_per_app_settings,
- (gpointer) settings);
+ (gpointer) settings);
g_free(name);
g_free(class);
g_free(role);
diff --git a/openbox/place.c b/openbox/place.c
index ee8bf7eb..36e977da 100644
--- a/openbox/place.c
+++ b/openbox/place.c
@@ -484,8 +484,8 @@ gboolean place_client(ObClient *client, gint *x, gint *y,
return FALSE;
/* try a number of methods */
- ret = place_transient_splash(client, x, y) ||
- (userplaced = place_per_app_setting(client, x, y, settings)) ||
+ ret = (userplaced = place_per_app_setting(client, x, y, settings)) ||
+ place_transient_splash(client, x, y) ||
(config_place_policy == OB_PLACE_POLICY_MOUSE &&
place_under_mouse(client, x, y)) ||
place_nooverlap(client, x, y) ||