+ }
+}
+
+/* Manages settings for individual applications.
+ Some notes: monitor is the screen number in a multi monitor
+ (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
+ 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(xmlNodePtr node, gpointer d)
+{
+ xmlNodePtr app = obt_xml_find_node(node->children, "application");
+ for (; app; app = obt_xml_find_node(app->next, "application")) {
+ ObAppSettings *settings;
+
+ gboolean name_set, class_set, role_set, title_set,
+ type_set, group_name_set, group_class_set;
+ gchar *name = NULL, *class = NULL, *role = NULL, *title = NULL,
+ *type_str = NULL, *group_name = NULL, *group_class = NULL;
+ ObClientType type;
+
+ class_set = obt_xml_attr_string(app, "class", &class);
+ name_set = obt_xml_attr_string(app, "name", &name);
+ group_class_set = obt_xml_attr_string(app, "groupclass", &group_class);
+ group_name_set = obt_xml_attr_string(app, "groupname", &group_name);
+ type_set = obt_xml_attr_string(app, "type", &type_str);
+ role_set = obt_xml_attr_string(app, "role", &role);
+ title_set = obt_xml_attr_string(app, "title", &title);
+
+ /* 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 || title_set ||
+ type_set || group_class_set || group_name_set))
+ continue;
+
+ settings = config_create_app_settings();
+
+ if (name_set)
+ settings->name = g_pattern_spec_new(name);
+ if (class_set)
+ settings->class = g_pattern_spec_new(class);
+ if (group_name_set)
+ settings->group_name = g_pattern_spec_new(group_name);
+ if (group_class_set)
+ settings->group_class = g_pattern_spec_new(group_class);
+ if (role_set)
+ settings->role = g_pattern_spec_new(role);
+ if (title_set)
+ settings->title = g_pattern_spec_new(title);
+ if (type_set)
+ settings->type = type;
+
+ g_free(name);
+ g_free(class);
+ g_free(group_name);
+ g_free(group_class);
+ g_free(role);
+ g_free(title);
+ g_free(type_str);
+
+ parse_single_per_app_settings(app, settings);
+ config_per_app_settings = g_slist_append(config_per_app_settings,
+ (gpointer)settings);