+
+static void
+g_themed_icon_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GThemedIcon *icon = G_THEMED_ICON (object);
+
+ switch (prop_id)
+ {
+ case PROP_NAMES:
+ g_value_set_boxed (value, icon->names);
+ break;
+
+ case PROP_USE_DEFAULT_FALLBACKS:
+ g_value_set_boolean (value, icon->use_default_fallbacks);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+g_themed_icon_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GThemedIcon *icon = G_THEMED_ICON (object);
+ gchar **names;
+ const gchar *name;
+
+ switch (prop_id)
+ {
+ case PROP_NAME:
+ name = g_value_get_string (value);
+
+ if (!name)
+ break;
+
+ if (icon->names)
+ g_strfreev (icon->names);
+
+ icon->names = g_new (char *, 2);
+ icon->names[0] = g_strdup (name);
+ icon->names[1] = NULL;
+ break;
+
+ case PROP_NAMES:
+ names = g_value_dup_boxed (value);
+
+ if (!names)
+ break;
+
+ if (icon->names)
+ g_strfreev (icon->names);
+
+ icon->names = names;
+ break;
+
+ case PROP_USE_DEFAULT_FALLBACKS:
+ icon->use_default_fallbacks = g_value_get_boolean (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+g_themed_icon_constructed (GObject *object)
+{
+ GThemedIcon *themed = G_THEMED_ICON (object);
+
+ g_return_if_fail (themed->names != NULL && themed->names[0] != NULL);
+
+ if (themed->use_default_fallbacks)
+ {
+ int i = 0, dashes = 0;
+ const char *p;
+ char *dashp;
+ char *last;
+ gboolean is_symbolic;
+ char *name;
+ char **names;
+
+ is_symbolic = g_str_has_suffix (themed->names[0], "-symbolic");
+ if (is_symbolic)
+ name = g_strndup (themed->names[0], strlen (themed->names[0]) - 9);
+ else
+ name = g_strdup (themed->names[0]);
+
+ p = name;
+ while (*p)
+ {
+ if (*p == '-')
+ dashes++;
+ p++;
+ }
+
+ last = name;
+
+ g_strfreev (themed->names);
+
+ names = g_new (char *, dashes + 1 + 1);
+ names[i++] = last;
+
+ while ((dashp = strrchr (last, '-')) != NULL)
+ names[i++] = last = g_strndup (last, dashp - last);
+
+ names[i++] = NULL;
+
+ if (is_symbolic)
+ {
+ themed->names = g_new (char *, 2 * dashes + 3);
+ for (i = 0; names[i] != NULL; i++)
+ {
+ themed->names[i] = g_strconcat (names[i], "-symbolic", NULL);
+ themed->names[dashes + 1 + i] = names[i];
+ }
+
+ themed->names[dashes + 1 + i] = NULL;
+ g_free (names);
+ }
+ else
+ {
+ themed->names = names;
+ }
+ }
+}
+