return g_variant_new_signature (g_value_get_string (value));
}
+ else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
+ {
+ if (g_value_get_boxed (value) == NULL)
+ return NULL;
+ return g_variant_new_strv ((const gchar **) g_value_get_boxed (value),
+ -1);
+ }
+
else if (G_VALUE_HOLDS_ENUM (value))
{
GEnumValue *enumval;
}
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as")))
{
- if (G_VALUE_HOLDS_FLAGS (value))
+ if (G_VALUE_HOLDS (value, G_TYPE_STRV))
+ {
+ g_value_take_boxed (value, g_variant_dup_strv (variant, NULL));
+ return TRUE;
+ }
+
+ else if (G_VALUE_HOLDS_FLAGS (value))
{
GFlagsClass *fclass;
GFlagsValue *fvalue;
g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) ||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) ||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE));
+ else if (gvalue_type == G_TYPE_STRV)
+ ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
else if (G_TYPE_IS_ENUM (gvalue_type))
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING);
else if (G_TYPE_IS_FLAGS (gvalue_type))
PROP_STRING,
PROP_NO_READ,
PROP_NO_WRITE,
+ PROP_STRV,
PROP_ENUM
};
gchar *string_prop;
gchar *no_read_prop;
gchar *no_write_prop;
+ gchar **strv_prop;
guint enum_prop;
} TestObject;
test_object_finalize (GObject *object)
{
TestObject *testo = (TestObject*)object;
+ g_strfreev (testo->strv_prop);
g_free (testo->string_prop);
G_OBJECT_CLASS (test_object_parent_class)->finalize (object);
}
case PROP_NO_WRITE:
g_value_set_string (value, test_object->no_write_prop);
break;
+ case PROP_STRV:
+ g_value_set_boxed (value, test_object->strv_prop);
+ break;
case PROP_ENUM:
g_value_set_enum (value, test_object->enum_prop);
break;
g_free (test_object->no_read_prop);
test_object->no_read_prop = g_value_dup_string (value);
break;
+ case PROP_STRV:
+ g_strfreev (test_object->strv_prop);
+ test_object->strv_prop = g_value_dup_boxed (value);
+ break;
case PROP_ENUM:
test_object->enum_prop = g_value_get_enum (value);
break;
g_param_spec_string ("no-write", "", "", NULL, G_PARAM_READABLE));
g_object_class_install_property (gobject_class, PROP_NO_READ,
g_param_spec_string ("no-read", "", "", NULL, G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class, PROP_STRV,
+ g_param_spec_boxed ("strv", "", "", G_TYPE_STRV, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_ENUM,
g_param_spec_enum ("enum", "", "", test_enum_get_type (), TEST_ENUM_FOO, G_PARAM_READWRITE));
}
gdouble d;
gchar *s;
GVariant *value;
+ gchar **strv;
settings = g_settings_new ("org.gtk.test.binding");
obj = test_object_new ();
g_object_get (obj, "double", &d, NULL);
g_assert_cmpfloat (d, ==, -G_MINDOUBLE);
+ strv = g_strsplit ("plastic bag,middle class,polyethylene", ",", 0);
+ g_settings_bind (settings, "strv", obj, "strv", G_SETTINGS_BIND_DEFAULT);
+ g_object_set (obj, "strv", strv, NULL);
+ g_strfreev (strv);
+ strv = g_settings_get_strv (settings, "strv");
+ s = g_strjoinv (",", strv);
+ g_assert_cmpstr (s, ==, "plastic bag,middle class,polyethylene");
+ g_strfreev (strv);
+ g_free (s);
+ strv = g_strsplit ("decaffeinate,unleaded,keep all surfaces clean", ",", 0);
+ g_settings_set_strv (settings, "strv", (const gchar **) strv);
+ g_strfreev (strv);
+ g_object_get (obj, "strv", &strv, NULL);
+ s = g_strjoinv (",", strv);
+ g_assert_cmpstr (s, ==, "decaffeinate,unleaded,keep all surfaces clean");
+ g_strfreev (strv);
+ g_free (s);
+
g_settings_bind (settings, "enum", obj, "enum", G_SETTINGS_BIND_DEFAULT);
g_object_set (obj, "enum", TEST_ENUM_BAZ, NULL);
g_assert_cmpstr (g_settings_get_string (settings, "enum"), ==, "baz");