X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fopenbox;a=blobdiff_plain;f=openbox%2Fconfig.c;h=64bf981c1bf0371cd2718fb2b8b0f65b4f619976;hp=460a3f85f5a8d557568e144b97e8dae9557e893b;hb=HEAD;hpb=445056664fbd8501a47724cf3976a45fab2f448e diff --git a/openbox/config.c b/openbox/config.c index 460a3f85..64bf981c 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -124,6 +124,7 @@ ObAppSettings* config_create_app_settings(void) settings->fullscreen = -1; settings->max_horz = -1; settings->max_vert = -1; + settings->opacity = -1; return settings; } @@ -149,6 +150,7 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, copy_if(fullscreen, -1); copy_if(max_horz, -1); copy_if(max_vert, -1); + copy_if(opacity, -1); if (src->pos_given) { dst->pos_given = TRUE; @@ -156,6 +158,11 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, dst->position = src->position; /* monitor is copied above */ } + + dst->width_num = src->width_num; + dst->width_denom = src->width_denom; + dst->height_num = src->height_num; + dst->height_denom = src->height_denom; } void config_parse_relative_number(gchar *s, gint *num, gint *denom) @@ -202,6 +209,149 @@ void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c) */ +static void parse_single_per_app_settings(xmlNodePtr app, + ObAppSettings *settings) +{ + xmlNodePtr n, c; + gboolean x_pos_given = FALSE; + + if ((n = obt_xml_find_node(app->children, "decor"))) + if (!obt_xml_node_contains(n, "default")) + settings->decor = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "shade"))) + if (!obt_xml_node_contains(n, "default")) + settings->shade = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "position"))) { + if ((c = obt_xml_find_node(n->children, "x"))) { + if (!obt_xml_node_contains(c, "default")) { + config_parse_gravity_coord(c, &settings->position.x); + x_pos_given = TRUE; + } + } + + if (x_pos_given && (c = obt_xml_find_node(n->children, "y"))) { + if (!obt_xml_node_contains(c, "default")) { + config_parse_gravity_coord(c, &settings->position.y); + settings->pos_given = TRUE; + } + } + + /* monitor can be set without setting x or y */ + if ((c = obt_xml_find_node(n->children, "monitor"))) { + if (!obt_xml_node_contains(c, "default")) { + gchar *s = obt_xml_node_string(c); + if (!g_ascii_strcasecmp(s, "mouse")) + settings->monitor_type = OB_PLACE_MONITOR_MOUSE; + else if (!g_ascii_strcasecmp(s, "active")) + settings->monitor_type = OB_PLACE_MONITOR_ACTIVE; + else if (!g_ascii_strcasecmp(s, "primary")) + settings->monitor_type = OB_PLACE_MONITOR_PRIMARY; + else + settings->monitor = obt_xml_node_int(c); + g_free(s); + } + } + + obt_xml_attr_bool(n, "force", &settings->pos_force); + } + + if ((n = obt_xml_find_node(app->children, "size"))) { + if ((c = obt_xml_find_node(n->children, "width"))) { + if (!obt_xml_node_contains(c, "default")) { + gchar *s = obt_xml_node_string(c); + config_parse_relative_number(s, + &settings->width_num, + &settings->width_denom); + if (settings->width_num <= 0 || settings->width_denom < 0) + settings->width_num = settings->width_denom = 0; + g_free(s); + } + } + + if ((c = obt_xml_find_node(n->children, "height"))) { + if (!obt_xml_node_contains(c, "default")) { + gchar *s = obt_xml_node_string(c); + config_parse_relative_number(s, + &settings->height_num, + &settings->height_denom); + if (settings->height_num <= 0 || settings->height_denom < 0) + settings->height_num = settings->height_denom = 0; + g_free(s); + } + } + } + + if ((n = obt_xml_find_node(app->children, "focus"))) { + if (!obt_xml_node_contains(n, "default")) + settings->focus = obt_xml_node_bool(n); + } + + if ((n = obt_xml_find_node(app->children, "desktop"))) { + if (!obt_xml_node_contains(n, "default")) { + gchar *s = obt_xml_node_string(n); + if (!g_ascii_strcasecmp(s, "all")) + settings->desktop = DESKTOP_ALL; + else { + gint i = obt_xml_node_int(n); + if (i > 0) + settings->desktop = i; + } + g_free(s); + } + } + + if ((n = obt_xml_find_node(app->children, "layer"))) { + if (!obt_xml_node_contains(n, "default")) { + gchar *s = obt_xml_node_string(n); + if (!g_ascii_strcasecmp(s, "above")) + settings->layer = 1; + else if (!g_ascii_strcasecmp(s, "below")) + settings->layer = -1; + else + settings->layer = 0; + g_free(s); + } + } + + if ((n = obt_xml_find_node(app->children, "iconic"))) + if (!obt_xml_node_contains(n, "default")) + settings->iconic = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "skip_pager"))) + if (!obt_xml_node_contains(n, "default")) + settings->skip_pager = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "skip_taskbar"))) + if (!obt_xml_node_contains(n, "default")) + settings->skip_taskbar = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "fullscreen"))) + if (!obt_xml_node_contains(n, "default")) + settings->fullscreen = obt_xml_node_bool(n); + + if ((n = obt_xml_find_node(app->children, "maximized"))) { + if (!obt_xml_node_contains(n, "default")) { + gchar *s = obt_xml_node_string(n); + if (!g_ascii_strcasecmp(s, "horizontal")) { + settings->max_horz = TRUE; + settings->max_vert = FALSE; + } else if (!g_ascii_strcasecmp(s, "vertical")) { + settings->max_horz = FALSE; + settings->max_vert = TRUE; + } else + settings->max_horz = settings->max_vert = + obt_xml_node_bool(n); + g_free(s); + } + } + + if ((n = obt_xml_find_node(app->children, "opacity"))) + if (!obt_xml_node_contains(n, "default")) + settings->opacity = obt_xml_node_int(n); +} + /* 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 @@ -216,17 +366,19 @@ 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, *title = NULL, - *type_str = NULL; - gboolean name_set, class_set, type_set, role_set, title_set; - ObClientType type; - gboolean x_pos_given; + for (; app; app = obt_xml_find_node(app->next, "application")) { + ObAppSettings *settings; - while (app) { - x_pos_given = FALSE; + 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); @@ -253,139 +405,38 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) type_set = FALSE; /* not valid! */ } - if (class_set || name_set || role_set || title_set || type_set) { - xmlNodePtr n, c; - ObAppSettings *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 (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; - - if ((n = obt_xml_find_node(app->children, "decor"))) - if (!obt_xml_node_contains(n, "default")) - settings->decor = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "shade"))) - if (!obt_xml_node_contains(n, "default")) - settings->shade = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "position"))) { - if ((c = obt_xml_find_node(n->children, "x"))) - if (!obt_xml_node_contains(c, "default")) { - config_parse_gravity_coord(c, &settings->position.x); - x_pos_given = TRUE; - } - - if (x_pos_given && (c = obt_xml_find_node(n->children, "y"))) - if (!obt_xml_node_contains(c, "default")) { - config_parse_gravity_coord(c, &settings->position.y); - settings->pos_given = TRUE; - } - - /* monitor can be set without setting x or y */ - if ((c = obt_xml_find_node(n->children, "monitor"))) - if (!obt_xml_node_contains(c, "default")) { - gchar *s = obt_xml_node_string(c); - if (!g_ascii_strcasecmp(s, "mouse")) - settings->monitor_type = - OB_PLACE_MONITOR_MOUSE; - else if (!g_ascii_strcasecmp(s, "active")) - settings->monitor_type = - OB_PLACE_MONITOR_ACTIVE; - else if (!g_ascii_strcasecmp(s, "primary")) - settings->monitor_type = - OB_PLACE_MONITOR_PRIMARY; - else - settings->monitor = obt_xml_node_int(c); - g_free(s); - } - - obt_xml_attr_bool(n, "force", &settings->pos_force); - } - - if ((n = obt_xml_find_node(app->children, "focus"))) - if (!obt_xml_node_contains(n, "default")) - settings->focus = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "desktop"))) { - if (!obt_xml_node_contains(n, "default")) { - gchar *s = obt_xml_node_string(n); - if (!g_ascii_strcasecmp(s, "all")) - settings->desktop = DESKTOP_ALL; - else { - gint i = obt_xml_node_int(n); - if (i > 0) - settings->desktop = i; - } - g_free(s); - } - } - - if ((n = obt_xml_find_node(app->children, "layer"))) - if (!obt_xml_node_contains(n, "default")) { - gchar *s = obt_xml_node_string(n); - if (!g_ascii_strcasecmp(s, "above")) - settings->layer = 1; - else if (!g_ascii_strcasecmp(s, "below")) - settings->layer = -1; - else - settings->layer = 0; - g_free(s); - } - - if ((n = obt_xml_find_node(app->children, "iconic"))) - if (!obt_xml_node_contains(n, "default")) - settings->iconic = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "skip_pager"))) - if (!obt_xml_node_contains(n, "default")) - settings->skip_pager = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "skip_taskbar"))) - if (!obt_xml_node_contains(n, "default")) - settings->skip_taskbar = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "fullscreen"))) - if (!obt_xml_node_contains(n, "default")) - settings->fullscreen = obt_xml_node_bool(n); - - if ((n = obt_xml_find_node(app->children, "maximized"))) - if (!obt_xml_node_contains(n, "default")) { - gchar *s = obt_xml_node_string(n); - if (!g_ascii_strcasecmp(s, "horizontal")) { - settings->max_horz = TRUE; - settings->max_vert = FALSE; - } else if (!g_ascii_strcasecmp(s, "vertical")) { - settings->max_horz = FALSE; - settings->max_vert = TRUE; - } else - settings->max_horz = settings->max_vert = - obt_xml_node_bool(n); - g_free(s); - } + 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; - config_per_app_settings = g_slist_append(config_per_app_settings, - (gpointer) settings); - g_free(name); - g_free(class); - g_free(role); - g_free(title); - g_free(type_str); - name = class = role = title = type_str = NULL; - } - - app = obt_xml_find_node(app->next, "application"); + 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); } } @@ -583,11 +634,13 @@ static void parse_placement(xmlNodePtr node, gpointer d) node = node->children; - if ((n = obt_xml_find_node(node, "policy"))) + if ((n = obt_xml_find_node(node, "policy"))) { if (obt_xml_node_contains(n, "UnderMouse")) config_place_policy = OB_PLACE_POLICY_MOUSE; - if ((n = obt_xml_find_node(node, "center"))) + } + if ((n = obt_xml_find_node(node, "center"))) { config_place_center = obt_xml_node_bool(n); + } if ((n = obt_xml_find_node(node, "monitor"))) { if (obt_xml_node_contains(n, "active")) config_place_monitor = OB_PLACE_MONITOR_ACTIVE; @@ -892,9 +945,9 @@ static void parse_menu(xmlNodePtr node, gpointer d) config_menu_manage_desktops = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "showIcons"))) { config_menu_show_icons = obt_xml_node_bool(n); -#ifndef USE_IMLIB2 +#if !defined(USE_IMLIB2) && !defined(USE_LIBRSVG) if (config_menu_show_icons) - g_message(_("Openbox was compiled without Imlib2 image loading support. Icons in menus will not be loaded.")); + g_message(_("Openbox was compiled without image loading support. Icons in menus will not be loaded.")); #endif } @@ -1140,10 +1193,12 @@ void config_shutdown(void) for (it = config_per_app_settings; it; it = g_slist_next(it)) { ObAppSettings *itd = (ObAppSettings *)it->data; - if (itd->name) g_pattern_spec_free(itd->name); - if (itd->role) g_pattern_spec_free(itd->role); + if (itd->name) g_pattern_spec_free(itd->name); + if (itd->role) g_pattern_spec_free(itd->role); if (itd->title) g_pattern_spec_free(itd->title); if (itd->class) g_pattern_spec_free(itd->class); + if (itd->group_name) g_pattern_spec_free(itd->group_name); + if (itd->group_class) g_pattern_spec_free(itd->group_class); g_slice_free(ObAppSettings, it->data); } g_slist_free(config_per_app_settings);