all repos — openbox @ b3cc8f48768c10db97fe18e0702285b110e5978b

openbox fork - make it a bit more like ryudo

allow application rules to place transient/dialog/splash windows, and allow application rules to match only on the role or type if you wish.
Dana Jansens danakj@orodu.net
commit

b3cc8f48768c10db97fe18e0702285b110e5978b

parent

8c9fb63baaf7d6245cccc584359bf09359663bea

4 files changed, 52 insertions(+), 39 deletions(-)

jump to
M data/rc.xmldata/rc.xml

@@ -693,12 +693,16 @@ <applications>

<!-- # this is an example with comments through out. use these to make your # own rules, but without the comments of course. + # you may use one or more of the name/class/role/type rules to specify + # windows to match <application name="the window's _OB_NAME property (see obxprop)" class="the window's _OB_CLASS property (see obxprop)" role="the window's _OB_ROLE property (see obxprop)" type="the window's _NET_WM_WINDOW_TYPE (see obxprob).. - (if unspecified, then it is 'dialog' for child windows)"> + (if unspecified, then it is 'dialog' for child windows) + one of: normal, dialog, splash, utility, menu, toolbar, + dock, desktop"> # the name or the class can be set, or both. this is used to match # windows when they appear. role can optionally be set as well, to # further restrict your matches.
M openbox/client.copenbox/client.c

@@ -327,9 +327,7 @@ (self->sized == (PSize | USSize) ?

"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 @@ off-screen and on xinerama divides (ie,

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 @@ for (it = config_per_app_settings; it; it = g_slist_next(it)) {

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 @@ else if (app->role &&

!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);
M openbox/config.copenbox/config.c

@@ -149,7 +149,7 @@ if (src->pos_given) {

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 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 @@ x_pos_given = FALSE;

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,27 +245,11 @@

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 (role_set) + settings->role = g_pattern_spec_new(role); - if (obt_xml_attr_string(app, "role", &role)) - 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"))

@@ -339,7 +348,7 @@ g_free(s);

} config_per_app_settings = g_slist_append(config_per_app_settings, - (gpointer) settings); + (gpointer) settings); g_free(name); g_free(class); g_free(role);
M openbox/place.copenbox/place.c

@@ -484,8 +484,8 @@ !(settings && settings->pos_given)))

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) ||