From b3cc8f48768c10db97fe18e0702285b110e5978b Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 8 Jan 2010 18:16:37 -0500 Subject: allow application rules to place transient/dialog/splash windows, and allow application rules to match only on the role or type if you wish. --- openbox/client.c | 20 +++++++++---------- openbox/config.c | 61 ++++++++++++++++++++++++++++++++------------------------ openbox/place.c | 4 ++-- 3 files changed, 47 insertions(+), 38 deletions(-) (limited to 'openbox') 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) || -- cgit v1.2.3