Merge branch 'param-value-default' into 'master'

Allow using an empty GValue with g_param_value_set_default()

See merge request GNOME/glib!1186
This commit is contained in:
Philip Withnall 2019-10-31 10:22:57 +00:00
commit 1503547766
4 changed files with 21 additions and 11 deletions

View File

@ -29,7 +29,6 @@ check_property (const char *output,
if (g_param_value_defaults (pspec, value)) if (g_param_value_defaults (pspec, value))
return; return;
g_value_init (&default_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
g_param_value_set_default (pspec, &default_value); g_param_value_set_default (pspec, &default_value);
v = g_strdup_value_contents (value); v = g_strdup_value_contents (value);

View File

@ -595,7 +595,8 @@ g_param_spec_get_redirect_target (GParamSpec *pspec)
/** /**
* g_param_value_set_default: * g_param_value_set_default:
* @pspec: a valid #GParamSpec * @pspec: a valid #GParamSpec
* @value: a #GValue of correct type for @pspec * @value: a #GValue of correct type for @pspec; since 2.64, you
* can also pass an empty #GValue, initialized with %G_VALUE_INIT
* *
* Sets @value to its default value as specified in @pspec. * Sets @value to its default value as specified in @pspec.
*/ */
@ -604,10 +605,18 @@ g_param_value_set_default (GParamSpec *pspec,
GValue *value) GValue *value)
{ {
g_return_if_fail (G_IS_PARAM_SPEC (pspec)); g_return_if_fail (G_IS_PARAM_SPEC (pspec));
if (G_VALUE_TYPE (value) == G_TYPE_INVALID)
{
g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec));
}
else
{
g_return_if_fail (G_IS_VALUE (value)); g_return_if_fail (G_IS_VALUE (value));
g_return_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value)); g_return_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value));
g_value_reset (value); g_value_reset (value);
}
G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, value); G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, value);
} }
@ -622,7 +631,7 @@ g_param_value_set_default (GParamSpec *pspec,
*/ */
gboolean gboolean
g_param_value_defaults (GParamSpec *pspec, g_param_value_defaults (GParamSpec *pspec,
GValue *value) const GValue *value)
{ {
GValue dflt_value = G_VALUE_INIT; GValue dflt_value = G_VALUE_INIT;
gboolean defaults; gboolean defaults;
@ -631,7 +640,6 @@ g_param_value_defaults (GParamSpec *pspec,
g_return_val_if_fail (G_IS_VALUE (value), FALSE); g_return_val_if_fail (G_IS_VALUE (value), FALSE);
g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE); g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE);
g_value_init (&dflt_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, &dflt_value); G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, &dflt_value);
defaults = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value, &dflt_value) == 0; defaults = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value, &dflt_value) == 0;
g_value_unset (&dflt_value); g_value_unset (&dflt_value);

View File

@ -307,7 +307,7 @@ void g_param_value_set_default (GParamSpec *pspec,
GValue *value); GValue *value);
GLIB_AVAILABLE_IN_ALL GLIB_AVAILABLE_IN_ALL
gboolean g_param_value_defaults (GParamSpec *pspec, gboolean g_param_value_defaults (GParamSpec *pspec,
GValue *value); const GValue *value);
GLIB_AVAILABLE_IN_ALL GLIB_AVAILABLE_IN_ALL
gboolean g_param_value_validate (GParamSpec *pspec, gboolean g_param_value_validate (GParamSpec *pspec,
GValue *value); GValue *value);

View File

@ -912,11 +912,14 @@ param_value_array_validate (GParamSpec *pspec,
g_param_value_set_default (element_spec, element); g_param_value_set_default (element_spec, element);
changed++; changed++;
} }
else
{
/* validate array value against element_spec */ /* validate array value against element_spec */
changed += g_param_value_validate (element_spec, element); changed += g_param_value_validate (element_spec, element);
} }
} }
} }
}
return changed; return changed;
} }