1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
19 #include "gparamspecs.h"
21 #include "gvaluecollector.h"
23 #include "../config.h" /* for SIZEOF_LONG */
25 #define G_FLOAT_EPSILON (1e-30)
26 #define G_DOUBLE_EPSILON (1e-90)
29 /* --- param spec functions --- */
31 param_spec_char_init (GParamSpec *pspec)
33 GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
35 cspec->minimum = 0x7f;
36 cspec->maximum = 0x80;
37 cspec->default_value = 0;
41 param_char_set_default (GParamSpec *pspec,
44 value->data[0].v_int = G_PARAM_SPEC_CHAR (pspec)->default_value;
48 param_char_validate (GParamSpec *pspec,
51 GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
52 gint oval = value->data[0].v_int;
54 value->data[0].v_int = CLAMP (value->data[0].v_int, cspec->minimum, cspec->maximum);
56 return value->data[0].v_int != oval;
60 param_spec_uchar_init (GParamSpec *pspec)
62 GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
65 uspec->maximum = 0xff;
66 uspec->default_value = 0;
70 param_uchar_set_default (GParamSpec *pspec,
73 value->data[0].v_uint = G_PARAM_SPEC_UCHAR (pspec)->default_value;
77 param_uchar_validate (GParamSpec *pspec,
80 GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
81 guint oval = value->data[0].v_uint;
83 value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
85 return value->data[0].v_uint != oval;
89 param_boolean_set_default (GParamSpec *pspec,
92 value->data[0].v_int = G_PARAM_SPEC_BOOLEAN (pspec)->default_value;
96 param_boolean_validate (GParamSpec *pspec,
99 gint oval = value->data[0].v_int;
101 value->data[0].v_int = value->data[0].v_int != FALSE;
103 return value->data[0].v_int != oval;
107 param_spec_int_init (GParamSpec *pspec)
109 GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
111 ispec->minimum = 0x7fffffff;
112 ispec->maximum = 0x80000000;
113 ispec->default_value = 0;
117 param_int_set_default (GParamSpec *pspec,
120 value->data[0].v_int = G_PARAM_SPEC_INT (pspec)->default_value;
124 param_int_validate (GParamSpec *pspec,
127 GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
128 gint oval = value->data[0].v_int;
130 value->data[0].v_int = CLAMP (value->data[0].v_int, ispec->minimum, ispec->maximum);
132 return value->data[0].v_int != oval;
136 param_int_values_cmp (GParamSpec *pspec,
137 const GValue *value1,
138 const GValue *value2)
140 if (value1->data[0].v_int < value2->data[0].v_int)
143 return value1->data[0].v_int > value2->data[0].v_int;
147 param_spec_uint_init (GParamSpec *pspec)
149 GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
152 uspec->maximum = 0xffffffff;
153 uspec->default_value = 0;
157 param_uint_set_default (GParamSpec *pspec,
160 value->data[0].v_uint = G_PARAM_SPEC_UINT (pspec)->default_value;
164 param_uint_validate (GParamSpec *pspec,
167 GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
168 guint oval = value->data[0].v_uint;
170 value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
172 return value->data[0].v_uint != oval;
176 param_uint_values_cmp (GParamSpec *pspec,
177 const GValue *value1,
178 const GValue *value2)
180 if (value1->data[0].v_uint < value2->data[0].v_uint)
183 return value1->data[0].v_uint > value2->data[0].v_uint;
187 param_spec_long_init (GParamSpec *pspec)
189 GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
192 lspec->minimum = 0x7fffffff;
193 lspec->maximum = 0x80000000;
194 #else /* SIZEOF_LONG != 4 (8) */
195 lspec->minimum = 0x7fffffffffffffff;
196 lspec->maximum = 0x8000000000000000;
198 lspec->default_value = 0;
202 param_long_set_default (GParamSpec *pspec,
205 value->data[0].v_long = G_PARAM_SPEC_LONG (pspec)->default_value;
209 param_long_validate (GParamSpec *pspec,
212 GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
213 glong oval = value->data[0].v_long;
215 value->data[0].v_long = CLAMP (value->data[0].v_long, lspec->minimum, lspec->maximum);
217 return value->data[0].v_long != oval;
221 param_long_values_cmp (GParamSpec *pspec,
222 const GValue *value1,
223 const GValue *value2)
225 if (value1->data[0].v_long < value2->data[0].v_long)
228 return value1->data[0].v_long > value2->data[0].v_long;
232 param_spec_ulong_init (GParamSpec *pspec)
234 GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
238 uspec->maximum = 0xffffffff;
239 #else /* SIZEOF_LONG != 4 (8) */
240 uspec->maximum = 0xffffffffffffffff;
242 uspec->default_value = 0;
246 param_ulong_set_default (GParamSpec *pspec,
249 value->data[0].v_ulong = G_PARAM_SPEC_ULONG (pspec)->default_value;
253 param_ulong_validate (GParamSpec *pspec,
256 GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
257 gulong oval = value->data[0].v_ulong;
259 value->data[0].v_ulong = CLAMP (value->data[0].v_ulong, uspec->minimum, uspec->maximum);
261 return value->data[0].v_ulong != oval;
265 param_ulong_values_cmp (GParamSpec *pspec,
266 const GValue *value1,
267 const GValue *value2)
269 if (value1->data[0].v_ulong < value2->data[0].v_ulong)
272 return value1->data[0].v_ulong > value2->data[0].v_ulong;
276 param_spec_enum_init (GParamSpec *pspec)
278 GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
280 espec->enum_class = NULL;
281 espec->default_value = 0;
285 param_spec_enum_finalize (GParamSpec *pspec)
287 GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
288 GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_ENUM));
290 if (espec->enum_class)
292 g_type_class_unref (espec->enum_class);
293 espec->enum_class = NULL;
296 parent_class->finalize (pspec);
300 param_enum_set_default (GParamSpec *pspec,
303 value->data[0].v_long = G_PARAM_SPEC_ENUM (pspec)->default_value;
307 param_enum_validate (GParamSpec *pspec,
310 GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
311 glong oval = value->data[0].v_long;
313 if (!espec->enum_class ||
314 !g_enum_get_value (espec->enum_class, value->data[0].v_long))
315 value->data[0].v_long = espec->default_value;
317 return value->data[0].v_long != oval;
321 param_spec_flags_init (GParamSpec *pspec)
323 GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
325 fspec->flags_class = NULL;
326 fspec->default_value = 0;
330 param_spec_flags_finalize (GParamSpec *pspec)
332 GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
333 GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_FLAGS));
335 if (fspec->flags_class)
337 g_type_class_unref (fspec->flags_class);
338 fspec->flags_class = NULL;
341 parent_class->finalize (pspec);
345 param_flags_set_default (GParamSpec *pspec,
348 value->data[0].v_ulong = G_PARAM_SPEC_FLAGS (pspec)->default_value;
352 param_flags_validate (GParamSpec *pspec,
355 GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
356 gulong oval = value->data[0].v_ulong;
358 if (fspec->flags_class)
359 value->data[0].v_ulong &= fspec->flags_class->mask;
361 value->data[0].v_ulong = fspec->default_value;
363 return value->data[0].v_ulong != oval;
367 param_spec_float_init (GParamSpec *pspec)
369 GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
371 fspec->minimum = G_MINFLOAT;
372 fspec->maximum = G_MAXFLOAT;
373 fspec->default_value = 0;
374 fspec->epsilon = G_FLOAT_EPSILON;
378 param_float_set_default (GParamSpec *pspec,
381 value->data[0].v_float = G_PARAM_SPEC_FLOAT (pspec)->default_value;
385 param_float_validate (GParamSpec *pspec,
388 GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
389 gfloat oval = value->data[0].v_float;
391 value->data[0].v_float = CLAMP (value->data[0].v_float, fspec->minimum, fspec->maximum);
393 return value->data[0].v_float != oval;
397 param_float_values_cmp (GParamSpec *pspec,
398 const GValue *value1,
399 const GValue *value2)
401 gfloat epsilon = G_PARAM_SPEC_FLOAT (pspec)->epsilon;
403 if (value1->data[0].v_float < value2->data[0].v_float)
404 return - (value2->data[0].v_float - value1->data[0].v_float > epsilon);
406 return value1->data[0].v_float - value2->data[0].v_float > epsilon;
410 param_spec_double_init (GParamSpec *pspec)
412 GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
414 dspec->minimum = G_MINDOUBLE;
415 dspec->maximum = G_MAXDOUBLE;
416 dspec->default_value = 0;
417 dspec->epsilon = G_DOUBLE_EPSILON;
421 param_double_set_default (GParamSpec *pspec,
424 value->data[0].v_double = G_PARAM_SPEC_DOUBLE (pspec)->default_value;
428 param_double_validate (GParamSpec *pspec,
431 GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
432 gdouble oval = value->data[0].v_double;
434 value->data[0].v_double = CLAMP (value->data[0].v_double, dspec->minimum, dspec->maximum);
436 return value->data[0].v_double != oval;
440 param_double_values_cmp (GParamSpec *pspec,
441 const GValue *value1,
442 const GValue *value2)
444 gdouble epsilon = G_PARAM_SPEC_DOUBLE (pspec)->epsilon;
446 if (value1->data[0].v_double < value2->data[0].v_double)
447 return - (value2->data[0].v_double - value1->data[0].v_double > epsilon);
449 return value1->data[0].v_double - value2->data[0].v_double > epsilon;
453 param_spec_string_init (GParamSpec *pspec)
455 GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
457 sspec->default_value = NULL;
458 sspec->cset_first = NULL;
459 sspec->cset_nth = NULL;
460 sspec->substitutor = '_';
461 sspec->null_fold_if_empty = FALSE;
462 sspec->ensure_non_null = FALSE;
466 param_spec_string_finalize (GParamSpec *pspec)
468 GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
469 GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_STRING));
471 g_free (sspec->default_value);
472 g_free (sspec->cset_first);
473 g_free (sspec->cset_nth);
474 sspec->default_value = NULL;
475 sspec->cset_first = NULL;
476 sspec->cset_nth = NULL;
478 parent_class->finalize (pspec);
482 param_string_set_default (GParamSpec *pspec,
485 value->data[0].v_pointer = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value);
489 param_string_validate (GParamSpec *pspec,
492 GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
493 gchar *string = value->data[0].v_pointer;
496 if (string && string[0])
500 if (sspec->cset_first && !strchr (sspec->cset_first, string[0]))
502 string[0] = sspec->substitutor;
506 for (s = string + 1; *s; s++)
507 if (!strchr (sspec->cset_nth, *s))
509 *s = sspec->substitutor;
513 if (sspec->null_fold_if_empty && string && string[0] == 0)
515 g_free (value->data[0].v_pointer);
516 value->data[0].v_pointer = NULL;
518 string = value->data[0].v_pointer;
520 if (sspec->ensure_non_null && !string)
522 value->data[0].v_pointer = g_strdup ("");
524 string = value->data[0].v_pointer;
531 param_string_values_cmp (GParamSpec *pspec,
532 const GValue *value1,
533 const GValue *value2)
535 if (!value1->data[0].v_pointer)
536 return value2->data[0].v_pointer != NULL ? -1 : 0;
537 else if (!value2->data[0].v_pointer)
538 return value1->data[0].v_pointer != NULL;
540 return strcmp (value1->data[0].v_pointer, value2->data[0].v_pointer);
544 param_spec_param_init (GParamSpec *pspec)
546 GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec);
548 spec->param_type = G_TYPE_PARAM;
552 param_param_set_default (GParamSpec *pspec,
555 value->data[0].v_pointer = NULL;
559 param_param_validate (GParamSpec *pspec,
562 GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec);
563 GParamSpec *param = value->data[0].v_pointer;
566 if (param && !g_type_is_a (G_PARAM_SPEC_TYPE (param), spec->param_type))
568 g_param_spec_unref (param);
569 value->data[0].v_pointer = NULL;
577 param_spec_pointer_init (GParamSpec *pspec)
579 /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
583 param_pointer_set_default (GParamSpec *pspec,
586 value->data[0].v_pointer = NULL;
590 param_pointer_validate (GParamSpec *pspec,
593 /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
600 param_pointer_values_cmp (GParamSpec *pspec,
601 const GValue *value1,
602 const GValue *value2)
604 return value1->data[0].v_pointer != value2->data[0].v_pointer;
608 param_spec_ccallback_init (GParamSpec *pspec)
610 /* GParamSpecCCallback *spec = G_PARAM_SPEC_CCALLBACK (pspec); */
614 param_ccallback_set_default (GParamSpec *pspec,
617 value->data[0].v_pointer = NULL;
618 value->data[1].v_pointer = NULL;
622 param_ccallback_validate (GParamSpec *pspec,
625 /* GParamSpecCCallback *spec = G_PARAM_SPEC_CCALLBACK (pspec); */
632 param_ccallback_values_cmp (GParamSpec *pspec,
633 const GValue *value1,
634 const GValue *value2)
636 return (value1->data[0].v_pointer != value2->data[0].v_pointer ||
637 value1->data[1].v_pointer != value2->data[1].v_pointer);
641 param_spec_object_init (GParamSpec *pspec)
643 GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec);
645 ospec->object_type = G_TYPE_OBJECT;
649 param_object_set_default (GParamSpec *pspec,
652 value->data[0].v_pointer = NULL;
656 param_object_validate (GParamSpec *pspec,
659 GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec);
660 GObject *object = value->data[0].v_pointer;
663 if (object && !g_type_is_a (G_OBJECT_TYPE (object), ospec->object_type))
665 g_object_unref (object);
666 value->data[0].v_pointer = NULL;
674 param_object_values_cmp (GParamSpec *pspec,
675 const GValue *value1,
676 const GValue *value2)
678 return value1->data[0].v_pointer != value2->data[0].v_pointer;
682 value_exch_memcpy (GValue *value1,
686 memcpy (&tmp_value.data, &value1->data, sizeof (value1->data));
687 memcpy (&value1->data, &value2->data, sizeof (value1->data));
688 memcpy (&value2->data, &tmp_value.data, sizeof (value2->data));
692 value_exch_long_int (GValue *value1,
695 glong tmp = value1->data[0].v_long;
696 value1->data[0].v_long = value2->data[0].v_int;
697 value2->data[0].v_int = tmp;
701 value_exch_long_uint (GValue *value1,
704 glong tmp = value1->data[0].v_long;
705 value1->data[0].v_long = value2->data[0].v_uint;
706 value2->data[0].v_uint = tmp;
710 value_exch_ulong_int (GValue *value1,
713 gulong tmp = value1->data[0].v_ulong;
714 value1->data[0].v_ulong = value2->data[0].v_int;
715 value2->data[0].v_int = tmp;
719 value_exch_ulong_uint (GValue *value1,
722 gulong tmp = value1->data[0].v_ulong;
723 value1->data[0].v_ulong = value2->data[0].v_uint;
724 value2->data[0].v_uint = tmp;
728 value_exch_float_int (GValue *value1,
731 gfloat tmp = value1->data[0].v_float;
732 value1->data[0].v_float = value2->data[0].v_int;
733 value2->data[0].v_int = 0.5 + tmp;
737 value_exch_float_uint (GValue *value1,
740 gfloat tmp = value1->data[0].v_float;
741 value1->data[0].v_float = value2->data[0].v_uint;
742 value2->data[0].v_uint = 0.5 + tmp;
746 value_exch_float_long (GValue *value1,
749 gfloat tmp = value1->data[0].v_float;
750 value1->data[0].v_float = value2->data[0].v_long;
751 value2->data[0].v_long = 0.5 + tmp;
755 value_exch_float_ulong (GValue *value1,
758 gfloat tmp = value1->data[0].v_float;
759 value1->data[0].v_float = value2->data[0].v_ulong;
760 value2->data[0].v_ulong = 0.5 + tmp;
764 value_exch_double_int (GValue *value1,
767 gdouble tmp = value1->data[0].v_double;
768 value1->data[0].v_double = value2->data[0].v_int;
769 value2->data[0].v_int = 0.5 + tmp;
773 value_exch_double_uint (GValue *value1,
776 gdouble tmp = value1->data[0].v_double;
777 value1->data[0].v_double = value2->data[0].v_uint;
778 value2->data[0].v_uint = 0.5 + tmp;
782 value_exch_double_long (GValue *value1,
785 gdouble tmp = value1->data[0].v_double;
786 value1->data[0].v_double = value2->data[0].v_long;
787 value2->data[0].v_long = 0.5 + tmp;
791 value_exch_double_ulong (GValue *value1,
794 gdouble tmp = value1->data[0].v_double;
795 value1->data[0].v_double = value2->data[0].v_ulong;
796 value2->data[0].v_ulong = 0.5 + tmp;
800 value_exch_double_float (GValue *value1,
803 gdouble tmp = value1->data[0].v_double;
804 value1->data[0].v_double = value2->data[0].v_float;
805 value2->data[0].v_float = tmp;
809 /* --- type initialization --- */
811 g_param_spec_types_init (void) /* sync with gtype.c */
818 static const GParamSpecTypeInfo pspec_info = {
819 sizeof (GParamSpecChar), /* instance_size */
820 16, /* n_preallocs */
821 param_spec_char_init, /* instance_init */
822 G_TYPE_CHAR, /* value_type */
824 param_char_set_default, /* value_set_default */
825 param_char_validate, /* value_validate */
826 param_int_values_cmp, /* values_cmp */
828 type = g_param_type_register_static ("GParamChar", &pspec_info);
829 g_assert (type == G_TYPE_PARAM_CHAR);
832 /* G_TYPE_PARAM_UCHAR
835 static const GParamSpecTypeInfo pspec_info = {
836 sizeof (GParamSpecUChar), /* instance_size */
837 16, /* n_preallocs */
838 param_spec_uchar_init, /* instance_init */
839 G_TYPE_UCHAR, /* value_type */
841 param_uchar_set_default, /* value_set_default */
842 param_uchar_validate, /* value_validate */
843 param_uint_values_cmp, /* values_cmp */
845 type = g_param_type_register_static ("GParamUChar", &pspec_info);
846 g_assert (type == G_TYPE_PARAM_UCHAR);
849 /* G_TYPE_PARAM_BOOLEAN
852 static const GParamSpecTypeInfo pspec_info = {
853 sizeof (GParamSpecBoolean), /* instance_size */
854 16, /* n_preallocs */
855 NULL, /* instance_init */
856 G_TYPE_BOOLEAN, /* value_type */
858 param_boolean_set_default, /* value_set_default */
859 param_boolean_validate, /* value_validate */
860 param_int_values_cmp, /* values_cmp */
862 type = g_param_type_register_static ("GParamBoolean", &pspec_info);
863 g_assert (type == G_TYPE_PARAM_BOOLEAN);
869 static const GParamSpecTypeInfo pspec_info = {
870 sizeof (GParamSpecInt), /* instance_size */
871 16, /* n_preallocs */
872 param_spec_int_init, /* instance_init */
873 G_TYPE_INT, /* value_type */
875 param_int_set_default, /* value_set_default */
876 param_int_validate, /* value_validate */
877 param_int_values_cmp, /* values_cmp */
879 type = g_param_type_register_static ("GParamInt", &pspec_info);
880 g_assert (type == G_TYPE_PARAM_INT);
886 static const GParamSpecTypeInfo pspec_info = {
887 sizeof (GParamSpecUInt), /* instance_size */
888 16, /* n_preallocs */
889 param_spec_uint_init, /* instance_init */
890 G_TYPE_UINT, /* value_type */
892 param_uint_set_default, /* value_set_default */
893 param_uint_validate, /* value_validate */
894 param_uint_values_cmp, /* values_cmp */
896 type = g_param_type_register_static ("GParamUInt", &pspec_info);
897 g_assert (type == G_TYPE_PARAM_UINT);
903 static const GParamSpecTypeInfo pspec_info = {
904 sizeof (GParamSpecLong), /* instance_size */
905 16, /* n_preallocs */
906 param_spec_long_init, /* instance_init */
907 G_TYPE_LONG, /* value_type */
909 param_long_set_default, /* value_set_default */
910 param_long_validate, /* value_validate */
911 param_long_values_cmp, /* values_cmp */
913 type = g_param_type_register_static ("GParamLong", &pspec_info);
914 g_assert (type == G_TYPE_PARAM_LONG);
917 /* G_TYPE_PARAM_ULONG
920 static const GParamSpecTypeInfo pspec_info = {
921 sizeof (GParamSpecULong), /* instance_size */
922 16, /* n_preallocs */
923 param_spec_ulong_init, /* instance_init */
924 G_TYPE_ULONG, /* value_type */
926 param_ulong_set_default, /* value_set_default */
927 param_ulong_validate, /* value_validate */
928 param_ulong_values_cmp, /* values_cmp */
930 type = g_param_type_register_static ("GParamULong", &pspec_info);
931 g_assert (type == G_TYPE_PARAM_ULONG);
937 static const GParamSpecTypeInfo pspec_info = {
938 sizeof (GParamSpecEnum), /* instance_size */
939 16, /* n_preallocs */
940 param_spec_enum_init, /* instance_init */
941 G_TYPE_ENUM, /* value_type */
942 param_spec_enum_finalize, /* finalize */
943 param_enum_set_default, /* value_set_default */
944 param_enum_validate, /* value_validate */
945 param_long_values_cmp, /* values_cmp */
947 type = g_param_type_register_static ("GParamEnum", &pspec_info);
948 g_assert (type == G_TYPE_PARAM_ENUM);
951 /* G_TYPE_PARAM_FLAGS
954 static const GParamSpecTypeInfo pspec_info = {
955 sizeof (GParamSpecFlags), /* instance_size */
956 16, /* n_preallocs */
957 param_spec_flags_init, /* instance_init */
958 G_TYPE_FLAGS, /* value_type */
959 param_spec_flags_finalize,/* finalize */
960 param_flags_set_default, /* value_set_default */
961 param_flags_validate, /* value_validate */
962 param_ulong_values_cmp, /* values_cmp */
964 type = g_param_type_register_static ("GParamFlags", &pspec_info);
965 g_assert (type == G_TYPE_PARAM_FLAGS);
968 /* G_TYPE_PARAM_FLOAT
971 static const GParamSpecTypeInfo pspec_info = {
972 sizeof (GParamSpecFloat), /* instance_size */
973 16, /* n_preallocs */
974 param_spec_float_init, /* instance_init */
975 G_TYPE_FLOAT, /* value_type */
977 param_float_set_default, /* value_set_default */
978 param_float_validate, /* value_validate */
979 param_float_values_cmp, /* values_cmp */
981 type = g_param_type_register_static ("GParamFloat", &pspec_info);
982 g_assert (type == G_TYPE_PARAM_FLOAT);
985 /* G_TYPE_PARAM_DOUBLE
988 static const GParamSpecTypeInfo pspec_info = {
989 sizeof (GParamSpecDouble), /* instance_size */
990 16, /* n_preallocs */
991 param_spec_double_init, /* instance_init */
992 G_TYPE_DOUBLE, /* value_type */
994 param_double_set_default, /* value_set_default */
995 param_double_validate, /* value_validate */
996 param_double_values_cmp, /* values_cmp */
998 type = g_param_type_register_static ("GParamDouble", &pspec_info);
999 g_assert (type == G_TYPE_PARAM_DOUBLE);
1002 /* G_TYPE_PARAM_STRING
1005 static const GParamSpecTypeInfo pspec_info = {
1006 sizeof (GParamSpecString), /* instance_size */
1007 16, /* n_preallocs */
1008 param_spec_string_init, /* instance_init */
1009 G_TYPE_STRING, /* value_type */
1010 param_spec_string_finalize, /* finalize */
1011 param_string_set_default, /* value_set_default */
1012 param_string_validate, /* value_validate */
1013 param_string_values_cmp, /* values_cmp */
1015 type = g_param_type_register_static ("GParamString", &pspec_info);
1016 g_assert (type == G_TYPE_PARAM_STRING);
1019 /* G_TYPE_PARAM_PARAM
1022 static const GParamSpecTypeInfo pspec_info = {
1023 sizeof (GParamSpecParam), /* instance_size */
1024 16, /* n_preallocs */
1025 param_spec_param_init, /* instance_init */
1026 G_TYPE_PARAM, /* value_type */
1027 NULL, /* finalize */
1028 param_param_set_default, /* value_set_default */
1029 param_param_validate, /* value_validate */
1030 param_pointer_values_cmp, /* values_cmp */
1032 type = g_param_type_register_static ("GParamParam", &pspec_info);
1033 g_assert (type == G_TYPE_PARAM_PARAM);
1036 /* G_TYPE_PARAM_POINTER
1039 static const GParamSpecTypeInfo pspec_info = {
1040 sizeof (GParamSpecPointer), /* instance_size */
1041 0, /* n_preallocs */
1042 param_spec_pointer_init, /* instance_init */
1043 G_TYPE_POINTER, /* value_type */
1044 NULL, /* finalize */
1045 param_pointer_set_default, /* value_set_default */
1046 param_pointer_validate, /* value_validate */
1047 param_pointer_values_cmp, /* values_cmp */
1049 type = g_param_type_register_static ("GParamPointer", &pspec_info);
1050 g_assert (type == G_TYPE_PARAM_POINTER);
1053 /* G_TYPE_PARAM_CCALLBACK
1056 static const GParamSpecTypeInfo pspec_info = {
1057 sizeof (GParamSpecCCallback), /* instance_size */
1058 0, /* n_preallocs */
1059 param_spec_ccallback_init, /* instance_init */
1060 G_TYPE_CCALLBACK, /* value_type */
1061 NULL, /* finalize */
1062 param_ccallback_set_default, /* value_set_default */
1063 param_ccallback_validate, /* value_validate */
1064 param_ccallback_values_cmp, /* values_cmp */
1066 type = g_param_type_register_static ("GParamCCallback", &pspec_info);
1067 g_assert (type == G_TYPE_PARAM_CCALLBACK);
1070 /* G_TYPE_PARAM_OBJECT
1073 static const GParamSpecTypeInfo pspec_info = {
1074 sizeof (GParamSpecObject), /* instance_size */
1075 16, /* n_preallocs */
1076 param_spec_object_init, /* instance_init */
1077 G_TYPE_OBJECT, /* value_type */
1078 NULL, /* finalize */
1079 param_object_set_default, /* value_set_default */
1080 param_object_validate, /* value_validate */
1081 param_object_values_cmp, /* values_cmp */
1083 type = g_param_type_register_static ("GParamObject", &pspec_info);
1084 g_assert (type == G_TYPE_PARAM_OBJECT);
1087 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_UCHAR, value_exch_memcpy);
1088 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_BOOLEAN, value_exch_memcpy);
1089 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_INT, value_exch_memcpy);
1090 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_UINT, value_exch_memcpy);
1091 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_ENUM, value_exch_memcpy);
1092 g_value_register_exchange_func (G_TYPE_CHAR, G_TYPE_FLAGS, value_exch_memcpy);
1093 g_value_register_exchange_func (G_TYPE_UCHAR, G_TYPE_BOOLEAN, value_exch_memcpy);
1094 g_value_register_exchange_func (G_TYPE_UCHAR, G_TYPE_INT, value_exch_memcpy);
1095 g_value_register_exchange_func (G_TYPE_UCHAR, G_TYPE_UINT, value_exch_memcpy);
1096 g_value_register_exchange_func (G_TYPE_UCHAR, G_TYPE_ENUM, value_exch_memcpy);
1097 g_value_register_exchange_func (G_TYPE_UCHAR, G_TYPE_FLAGS, value_exch_memcpy);
1098 g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_INT, value_exch_memcpy);
1099 g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_UINT, value_exch_memcpy);
1100 g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_ENUM, value_exch_memcpy);
1101 g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_FLAGS, value_exch_memcpy);
1102 g_value_register_exchange_func (G_TYPE_INT, G_TYPE_UINT, value_exch_memcpy);
1103 g_value_register_exchange_func (G_TYPE_INT, G_TYPE_ENUM, value_exch_memcpy);
1104 g_value_register_exchange_func (G_TYPE_INT, G_TYPE_FLAGS, value_exch_memcpy);
1105 g_value_register_exchange_func (G_TYPE_UINT, G_TYPE_ENUM, value_exch_memcpy);
1106 g_value_register_exchange_func (G_TYPE_UINT, G_TYPE_FLAGS, value_exch_memcpy);
1107 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_CHAR, value_exch_long_int);
1108 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_UCHAR, value_exch_long_uint);
1109 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_BOOLEAN, value_exch_long_int);
1110 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_INT, value_exch_long_int);
1111 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_UINT, value_exch_long_uint);
1112 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_ULONG, value_exch_memcpy);
1113 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_ENUM, value_exch_long_int);
1114 g_value_register_exchange_func (G_TYPE_LONG, G_TYPE_FLAGS, value_exch_long_uint);
1115 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_CHAR, value_exch_ulong_int);
1116 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_UCHAR, value_exch_ulong_uint);
1117 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_BOOLEAN, value_exch_ulong_int);
1118 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_INT, value_exch_ulong_int);
1119 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_UINT, value_exch_ulong_uint);
1120 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_ENUM, value_exch_ulong_int);
1121 g_value_register_exchange_func (G_TYPE_ULONG, G_TYPE_FLAGS, value_exch_ulong_uint);
1122 g_value_register_exchange_func (G_TYPE_ENUM, G_TYPE_FLAGS, value_exch_memcpy);
1123 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_CHAR, value_exch_float_int);
1124 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_UCHAR, value_exch_float_uint);
1125 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_BOOLEAN, value_exch_float_int);
1126 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_INT, value_exch_float_int);
1127 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_UINT, value_exch_float_uint);
1128 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_LONG, value_exch_float_long);
1129 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_ULONG, value_exch_float_ulong);
1130 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_ENUM, value_exch_float_int);
1131 g_value_register_exchange_func (G_TYPE_FLOAT, G_TYPE_FLAGS, value_exch_float_uint);
1132 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_CHAR, value_exch_double_int);
1133 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_UCHAR, value_exch_double_uint);
1134 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_BOOLEAN, value_exch_double_int);
1135 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_INT, value_exch_double_int);
1136 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_UINT, value_exch_double_uint);
1137 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_LONG, value_exch_double_long);
1138 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_ULONG, value_exch_double_ulong);
1139 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_ENUM, value_exch_double_int);
1140 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_FLAGS, value_exch_double_uint);
1141 g_value_register_exchange_func (G_TYPE_DOUBLE, G_TYPE_FLOAT, value_exch_double_float);
1145 /* --- GParamSpec initialization --- */
1147 g_param_spec_char (const gchar *name,
1152 gint8 default_value,
1155 GParamSpecChar *cspec = g_param_spec_internal (G_TYPE_PARAM_CHAR,
1161 cspec->minimum = minimum;
1162 cspec->maximum = maximum;
1163 cspec->default_value = default_value;
1165 return G_PARAM_SPEC (cspec);
1169 g_param_spec_uchar (const gchar *name,
1174 guint8 default_value,
1177 GParamSpecUChar *uspec = g_param_spec_internal (G_TYPE_PARAM_UCHAR,
1183 uspec->minimum = minimum;
1184 uspec->maximum = maximum;
1185 uspec->default_value = default_value;
1187 return G_PARAM_SPEC (uspec);
1191 g_param_spec_boolean (const gchar *name,
1194 gboolean default_value,
1197 GParamSpecBoolean *bspec = g_param_spec_internal (G_TYPE_PARAM_BOOLEAN,
1203 bspec->default_value = default_value;
1205 return G_PARAM_SPEC (bspec);
1209 g_param_spec_int (const gchar *name,
1217 GParamSpecInt *ispec = g_param_spec_internal (G_TYPE_PARAM_INT,
1223 ispec->minimum = minimum;
1224 ispec->maximum = maximum;
1225 ispec->default_value = default_value;
1227 return G_PARAM_SPEC (ispec);
1231 g_param_spec_uint (const gchar *name,
1236 guint default_value,
1239 GParamSpecUInt *uspec = g_param_spec_internal (G_TYPE_PARAM_UINT,
1245 uspec->minimum = minimum;
1246 uspec->maximum = maximum;
1247 uspec->default_value = default_value;
1249 return G_PARAM_SPEC (uspec);
1253 g_param_spec_long (const gchar *name,
1258 glong default_value,
1261 GParamSpecLong *lspec = g_param_spec_internal (G_TYPE_PARAM_LONG,
1267 lspec->minimum = minimum;
1268 lspec->maximum = maximum;
1269 lspec->default_value = default_value;
1271 return G_PARAM_SPEC (lspec);
1275 g_param_spec_ulong (const gchar *name,
1280 gulong default_value,
1283 GParamSpecULong *uspec = g_param_spec_internal (G_TYPE_PARAM_ULONG,
1289 uspec->minimum = minimum;
1290 uspec->maximum = maximum;
1291 uspec->default_value = default_value;
1293 return G_PARAM_SPEC (uspec);
1297 g_param_spec_enum (const gchar *name,
1304 GParamSpecEnum *espec;
1306 g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
1308 espec = g_param_spec_internal (G_TYPE_PARAM_ENUM,
1314 espec->enum_class = g_type_class_ref (enum_type);
1315 espec->default_value = default_value;
1317 return G_PARAM_SPEC (espec);
1321 g_param_spec_flags (const gchar *name,
1325 guint default_value,
1328 GParamSpecFlags *fspec;
1330 g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL);
1332 fspec = g_param_spec_internal (G_TYPE_PARAM_FLAGS,
1338 fspec->flags_class = g_type_class_ref (flags_type);
1339 fspec->default_value = default_value;
1341 return G_PARAM_SPEC (fspec);
1345 g_param_spec_float (const gchar *name,
1350 gfloat default_value,
1353 GParamSpecFloat *fspec = g_param_spec_internal (G_TYPE_PARAM_FLOAT,
1359 fspec->minimum = minimum;
1360 fspec->maximum = maximum;
1361 fspec->default_value = default_value;
1363 return G_PARAM_SPEC (fspec);
1367 g_param_spec_double (const gchar *name,
1372 gdouble default_value,
1375 GParamSpecDouble *dspec = g_param_spec_internal (G_TYPE_PARAM_DOUBLE,
1381 dspec->minimum = minimum;
1382 dspec->maximum = maximum;
1383 dspec->default_value = default_value;
1385 return G_PARAM_SPEC (dspec);
1389 g_param_spec_string (const gchar *name,
1392 const gchar *default_value,
1395 GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING,
1400 g_free (sspec->default_value);
1401 sspec->default_value = g_strdup (default_value);
1403 return G_PARAM_SPEC (sspec);
1407 g_param_spec_string_c (const gchar *name,
1410 const gchar *default_value,
1413 GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING,
1418 g_free (sspec->default_value);
1419 sspec->default_value = g_strdup (default_value);
1420 g_free (sspec->cset_first);
1421 sspec->cset_first = g_strdup (G_CSET_a_2_z "_" G_CSET_A_2_Z);
1422 g_free (sspec->cset_nth);
1423 sspec->cset_nth = g_strdup (G_CSET_a_2_z
1425 /* G_CSET_LATINS G_CSET_LATINC */
1428 return G_PARAM_SPEC (sspec);
1432 g_param_spec_param (const gchar *name,
1438 GParamSpecParam *pspec;
1440 g_return_val_if_fail (G_TYPE_IS_PARAM (param_type), NULL);
1442 pspec = g_param_spec_internal (G_TYPE_PARAM_PARAM,
1447 pspec->param_type = param_type;
1449 return G_PARAM_SPEC (pspec);
1453 g_param_spec_pointer (const gchar *name,
1458 GParamSpecPointer *pspec;
1460 pspec = g_param_spec_internal (G_TYPE_PARAM_POINTER,
1465 return G_PARAM_SPEC (pspec);
1469 g_param_spec_ccallback (const gchar *name,
1474 GParamSpecCCallback *cspec;
1476 cspec = g_param_spec_internal (G_TYPE_PARAM_CCALLBACK,
1481 return G_PARAM_SPEC (cspec);
1485 g_param_spec_object (const gchar *name,
1491 GParamSpecObject *ospec;
1493 g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
1495 ospec = g_param_spec_internal (G_TYPE_PARAM_OBJECT,
1500 ospec->object_type = object_type;
1502 return G_PARAM_SPEC (ospec);