+ObAppSettings* config_create_app_settings(void)
+{
+ ObAppSettings *settings = g_slice_new0(ObAppSettings);
+ settings->type = -1;
+ settings->decor = -1;
+ settings->shade = -1;
+ settings->monitor_type = OB_PLACE_MONITOR_ANY;
+ settings->monitor = -1;
+ settings->focus = -1;
+ settings->desktop = 0;
+ settings->layer = -2;
+ settings->iconic = -1;
+ settings->skip_pager = -1;
+ settings->skip_taskbar = -1;
+ settings->fullscreen = -1;
+ settings->max_horz = -1;
+ settings->max_vert = -1;
+ return settings;
+}
+
+#define copy_if(setting, default) \
+ if (src->setting != default) dst->setting = src->setting
+void config_app_settings_copy_non_defaults(const ObAppSettings *src,
+ ObAppSettings *dst)
+{
+ g_assert(src != NULL);
+ g_assert(dst != NULL);
+
+ copy_if(type, (ObClientType)-1);
+ copy_if(decor, -1);
+ copy_if(shade, -1);
+ copy_if(monitor_type, OB_PLACE_MONITOR_ANY);
+ copy_if(monitor, -1);
+ copy_if(focus, -1);
+ copy_if(desktop, 0);
+ copy_if(layer, -2);
+ copy_if(iconic, -1);
+ copy_if(skip_pager, -1);
+ copy_if(skip_taskbar, -1);
+ copy_if(fullscreen, -1);
+ copy_if(max_horz, -1);
+ copy_if(max_vert, -1);
+
+ if (src->pos_given) {
+ dst->pos_given = TRUE;
+ dst->pos_force = src->pos_force;
+ dst->position = src->position;
+ /* monitor is copied above */
+ }
+
+ if (src->size_given) {
+ dst->size_given = TRUE;
+ 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)
+{
+ *num = strtol(s, &s, 10);
+
+ if (*s == '%') {
+ *denom = 100;
+ } else if (*s == '/') {
+ *denom = atoi(s+1);
+ }
+}
+
+void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
+{
+ gchar *s = obt_xml_node_string(node);
+ if (!g_ascii_strcasecmp(s, "center"))
+ c->center = TRUE;
+ else {
+ gchar *ps = s;
+ if (s[0] == '-')
+ c->opposite = TRUE;
+ if (s[0] == '-' || s[0] == '+')
+ ps++;
+ config_parse_relative_number(ps, &c->pos, &c->denom);
+ }
+ g_free(s);
+}
+