• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* GObject - GLib Type, Object, Parameter and Signal Library
2   * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc.
3   *
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.1 of the License, or (at your option) any later version.
8   *
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.
13   *
14   * You should have received a copy of the GNU Lesser General
15   * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
16   *
17   * gparam.h: GParamSpec base class implementation
18   */
19  #ifndef __G_PARAM_H__
20  #define __G_PARAM_H__
21  
22  #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
23  #error "Only <glib-object.h> can be included directly."
24  #endif
25  
26  #include	<gobject/gvalue.h>
27  
28  G_BEGIN_DECLS
29  
30  /* --- standard type macros --- */
31  /**
32   * G_TYPE_IS_PARAM:
33   * @type: a #GType ID
34   *
35   * Checks whether @type "is a" %G_TYPE_PARAM.
36   */
37  #define G_TYPE_IS_PARAM(type)		(G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM)
38  /**
39   * G_PARAM_SPEC:
40   * @pspec: a valid #GParamSpec
41   *
42   * Casts a derived #GParamSpec object (e.g. of type #GParamSpecInt) into
43   * a #GParamSpec object.
44   */
45  #define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
46  /**
47   * G_IS_PARAM_SPEC:
48   * @pspec: a #GParamSpec
49   *
50   * Checks whether @pspec "is a" valid #GParamSpec structure of type %G_TYPE_PARAM
51   * or derived.
52   */
53  #if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_42
54  #define G_IS_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE ((pspec), G_TYPE_PARAM))
55  #else
56  #define G_IS_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM))
57  #endif
58  /**
59   * G_PARAM_SPEC_CLASS:
60   * @pclass: a valid #GParamSpecClass
61   *
62   * Casts a derived #GParamSpecClass structure into a #GParamSpecClass structure.
63   */
64  #define G_PARAM_SPEC_CLASS(pclass)      (G_TYPE_CHECK_CLASS_CAST ((pclass), G_TYPE_PARAM, GParamSpecClass))
65  /**
66   * G_IS_PARAM_SPEC_CLASS:
67   * @pclass: a #GParamSpecClass
68   *
69   * Checks whether @pclass "is a" valid #GParamSpecClass structure of type
70   * %G_TYPE_PARAM or derived.
71   */
72  #define G_IS_PARAM_SPEC_CLASS(pclass)   (G_TYPE_CHECK_CLASS_TYPE ((pclass), G_TYPE_PARAM))
73  /**
74   * G_PARAM_SPEC_GET_CLASS:
75   * @pspec: a valid #GParamSpec
76   *
77   * Retrieves the #GParamSpecClass of a #GParamSpec.
78   */
79  #define G_PARAM_SPEC_GET_CLASS(pspec)	(G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass))
80  
81  
82  /* --- convenience macros --- */
83  /**
84   * G_PARAM_SPEC_TYPE:
85   * @pspec: a valid #GParamSpec
86   *
87   * Retrieves the #GType of this @pspec.
88   */
89  #define G_PARAM_SPEC_TYPE(pspec)	(G_TYPE_FROM_INSTANCE (pspec))
90  /**
91   * G_PARAM_SPEC_TYPE_NAME:
92   * @pspec: a valid #GParamSpec
93   *
94   * Retrieves the #GType name of this @pspec.
95   */
96  #define G_PARAM_SPEC_TYPE_NAME(pspec)	(g_type_name (G_PARAM_SPEC_TYPE (pspec)))
97  /**
98   * G_PARAM_SPEC_VALUE_TYPE:
99   * @pspec: a valid #GParamSpec
100   *
101   * Retrieves the #GType to initialize a #GValue for this parameter.
102   */
103  #define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
104  /**
105   * G_VALUE_HOLDS_PARAM:
106   * @value: a valid #GValue structure
107   *
108   * Checks whether the given #GValue can hold values derived from type %G_TYPE_PARAM.
109   *
110   * Returns: %TRUE on success.
111   */
112  #define G_VALUE_HOLDS_PARAM(value)	(G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
113  
114  
115  /* --- flags --- */
116  /**
117   * GParamFlags:
118   * @G_PARAM_READABLE: the parameter is readable
119   * @G_PARAM_WRITABLE: the parameter is writable
120   * @G_PARAM_READWRITE: alias for %G_PARAM_READABLE | %G_PARAM_WRITABLE
121   * @G_PARAM_CONSTRUCT: the parameter will be set upon object construction
122   * @G_PARAM_CONSTRUCT_ONLY: the parameter can only be set upon object construction
123   * @G_PARAM_LAX_VALIDATION: upon parameter conversion (see g_param_value_convert())
124   *  strict validation is not required
125   * @G_PARAM_STATIC_NAME: the string used as name when constructing the
126   *  parameter is guaranteed to remain valid and
127   *  unmodified for the lifetime of the parameter.
128   *  Since 2.8
129   * @G_PARAM_STATIC_NICK: the string used as nick when constructing the
130   *  parameter is guaranteed to remain valid and
131   *  unmmodified for the lifetime of the parameter.
132   *  Since 2.8
133   * @G_PARAM_STATIC_BLURB: the string used as blurb when constructing the
134   *  parameter is guaranteed to remain valid and
135   *  unmodified for the lifetime of the parameter.
136   *  Since 2.8
137   * @G_PARAM_EXPLICIT_NOTIFY: calls to g_object_set_property() for this
138   *   property will not automatically result in a "notify" signal being
139   *   emitted: the implementation must call g_object_notify() themselves
140   *   in case the property actually changes.  Since: 2.42.
141   * @G_PARAM_PRIVATE: internal
142   * @G_PARAM_DEPRECATED: the parameter is deprecated and will be removed
143   *  in a future version. A warning will be generated if it is used
144   *  while running with G_ENABLE_DIAGNOSTIC=1.
145   *  Since 2.26
146   *
147   * Through the #GParamFlags flag values, certain aspects of parameters
148   * can be configured. See also #G_PARAM_STATIC_STRINGS.
149   */
150  typedef enum
151  {
152    G_PARAM_READABLE            = 1 << 0,
153    G_PARAM_WRITABLE            = 1 << 1,
154    G_PARAM_READWRITE           = (G_PARAM_READABLE | G_PARAM_WRITABLE),
155    G_PARAM_CONSTRUCT	      = 1 << 2,
156    G_PARAM_CONSTRUCT_ONLY      = 1 << 3,
157    G_PARAM_LAX_VALIDATION      = 1 << 4,
158    G_PARAM_STATIC_NAME	      = 1 << 5,
159    G_PARAM_PRIVATE GLIB_DEPRECATED_ENUMERATOR_IN_2_26 = G_PARAM_STATIC_NAME,
160    G_PARAM_STATIC_NICK	      = 1 << 6,
161    G_PARAM_STATIC_BLURB	      = 1 << 7,
162    /* User defined flags go here */
163    G_PARAM_EXPLICIT_NOTIFY     = 1 << 30,
164    /* Avoid warning with -Wpedantic for gcc6 */
165    G_PARAM_DEPRECATED          = (gint)(1u << 31)
166  } GParamFlags;
167  
168  /**
169   * G_PARAM_STATIC_STRINGS:
170   *
171   * #GParamFlags value alias for %G_PARAM_STATIC_NAME | %G_PARAM_STATIC_NICK | %G_PARAM_STATIC_BLURB.
172   *
173   * Since 2.13.0
174   */
175  #define	G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
176  /* bits in the range 0xffffff00 are reserved for 3rd party usage */
177  /**
178   * G_PARAM_MASK:
179   *
180   * Mask containing the bits of #GParamSpec.flags which are reserved for GLib.
181   */
182  #define	G_PARAM_MASK		(0x000000ff)
183  /**
184   * G_PARAM_USER_SHIFT:
185   *
186   * Minimum shift count to be used for user defined flags, to be stored in
187   * #GParamSpec.flags. The maximum allowed is 10.
188   */
189  #define	G_PARAM_USER_SHIFT	(8)
190  
191  /* --- typedefs & structures --- */
192  typedef struct _GParamSpec      GParamSpec;
193  typedef struct _GParamSpecClass GParamSpecClass;
194  typedef struct _GParameter	GParameter GLIB_DEPRECATED_TYPE_IN_2_54;
195  typedef struct _GParamSpecPool  GParamSpecPool;
196  /**
197   * GParamSpec: (ref-func g_param_spec_ref_sink) (unref-func g_param_spec_uref) (set-value-func g_value_set_param) (get-value-func g_value_get_param)
198   * @g_type_instance: private #GTypeInstance portion
199   * @name: name of this parameter: always an interned string
200   * @flags: #GParamFlags flags for this parameter
201   * @value_type: the #GValue type for this parameter
202   * @owner_type: #GType type that uses (introduces) this parameter
203   *
204   * All other fields of the GParamSpec struct are private and
205   * should not be used directly.
206   */
207  struct _GParamSpec
208  {
209    GTypeInstance  g_type_instance;
210  
211    const gchar   *name;          /* interned string */
212    GParamFlags    flags;
213    GType		 value_type;
214    GType		 owner_type;	/* class or interface using this property */
215  
216    /*< private >*/
217    gchar         *_nick;
218    gchar         *_blurb;
219    GData		*qdata;
220    guint          ref_count;
221    guint		 param_id;	/* sort-criteria */
222  };
223  /**
224   * GParamSpecClass:
225   * @g_type_class: the parent class
226   * @value_type: the #GValue type for this parameter
227   * @finalize: The instance finalization function (optional), should chain
228   *  up to the finalize method of the parent class.
229   * @value_set_default: Resets a @value to the default value for this type
230   *  (recommended, the default is g_value_reset()), see
231   *  g_param_value_set_default().
232   * @value_validate: Ensures that the contents of @value comply with the
233   *  specifications set out by this type (optional), see
234   *  g_param_value_validate().
235   * @values_cmp: Compares @value1 with @value2 according to this type
236   *  (recommended, the default is memcmp()), see g_param_values_cmp().
237   *
238   * The class structure for the GParamSpec type.
239   * Normally, GParamSpec classes are filled by
240   * g_param_type_register_static().
241   */
242  struct _GParamSpecClass
243  {
244    GTypeClass      g_type_class;
245  
246    GType		  value_type;
247  
248    void	        (*finalize)		(GParamSpec   *pspec);
249  
250    /* GParam methods */
251    void          (*value_set_default)    (GParamSpec   *pspec,
252  					 GValue       *value);
253    gboolean      (*value_validate)       (GParamSpec   *pspec,
254  					 GValue       *value);
255    gint          (*values_cmp)           (GParamSpec   *pspec,
256  					 const GValue *value1,
257  					 const GValue *value2);
258    /*< private >*/
259    gpointer	  dummy[4];
260  };
261  /**
262   * GParameter:
263   * @name: the parameter name
264   * @value: the parameter value
265   *
266   * The GParameter struct is an auxiliary structure used
267   * to hand parameter name/value pairs to g_object_newv().
268   *
269   * Deprecated: 2.54: This type is not introspectable.
270   */
271  struct _GParameter /* auxiliary structure for _setv() variants */
272  {
273    const gchar *name;
274    GValue       value;
275  } GLIB_DEPRECATED_TYPE_IN_2_54;
276  
277  
278  /* --- prototypes --- */
279  GLIB_AVAILABLE_IN_ALL
280  GParamSpec*	g_param_spec_ref		(GParamSpec    *pspec);
281  GLIB_AVAILABLE_IN_ALL
282  void		g_param_spec_unref		(GParamSpec    *pspec);
283  GLIB_AVAILABLE_IN_ALL
284  void		g_param_spec_sink		(GParamSpec    *pspec);
285  GLIB_AVAILABLE_IN_ALL
286  GParamSpec*	g_param_spec_ref_sink   	(GParamSpec    *pspec);
287  GLIB_AVAILABLE_IN_ALL
288  gpointer        g_param_spec_get_qdata		(GParamSpec    *pspec,
289  						 GQuark         quark);
290  GLIB_AVAILABLE_IN_ALL
291  void            g_param_spec_set_qdata		(GParamSpec    *pspec,
292  						 GQuark         quark,
293  						 gpointer       data);
294  GLIB_AVAILABLE_IN_ALL
295  void            g_param_spec_set_qdata_full	(GParamSpec    *pspec,
296  						 GQuark         quark,
297  						 gpointer       data,
298  						 GDestroyNotify destroy);
299  GLIB_AVAILABLE_IN_ALL
300  gpointer        g_param_spec_steal_qdata	(GParamSpec    *pspec,
301  						 GQuark         quark);
302  GLIB_AVAILABLE_IN_ALL
303  GParamSpec*     g_param_spec_get_redirect_target (GParamSpec   *pspec);
304  
305  GLIB_AVAILABLE_IN_ALL
306  void		g_param_value_set_default	(GParamSpec    *pspec,
307  						 GValue	       *value);
308  GLIB_AVAILABLE_IN_ALL
309  gboolean	g_param_value_defaults		(GParamSpec    *pspec,
310  						 const GValue  *value);
311  GLIB_AVAILABLE_IN_ALL
312  gboolean	g_param_value_validate		(GParamSpec    *pspec,
313  						 GValue	       *value);
314  GLIB_AVAILABLE_IN_ALL
315  gboolean	g_param_value_convert		(GParamSpec    *pspec,
316  						 const GValue  *src_value,
317  						 GValue	       *dest_value,
318  						 gboolean	strict_validation);
319  GLIB_AVAILABLE_IN_ALL
320  gint		g_param_values_cmp		(GParamSpec    *pspec,
321  						 const GValue  *value1,
322  						 const GValue  *value2);
323  GLIB_AVAILABLE_IN_ALL
324  const gchar *   g_param_spec_get_name           (GParamSpec    *pspec);
325  GLIB_AVAILABLE_IN_ALL
326  const gchar *   g_param_spec_get_nick           (GParamSpec    *pspec);
327  GLIB_AVAILABLE_IN_ALL
328  const gchar *   g_param_spec_get_blurb          (GParamSpec    *pspec);
329  GLIB_AVAILABLE_IN_ALL
330  void            g_value_set_param               (GValue	       *value,
331  						 GParamSpec    *param);
332  GLIB_AVAILABLE_IN_ALL
333  GParamSpec*     g_value_get_param               (const GValue  *value);
334  GLIB_AVAILABLE_IN_ALL
335  GParamSpec*     g_value_dup_param               (const GValue  *value);
336  
337  
338  GLIB_AVAILABLE_IN_ALL
339  void           g_value_take_param               (GValue        *value,
340  					         GParamSpec    *param);
341  GLIB_DEPRECATED_FOR(g_value_take_param)
342  void           g_value_set_param_take_ownership (GValue        *value,
343                                                   GParamSpec    *param);
344  GLIB_AVAILABLE_IN_2_36
345  const GValue *  g_param_spec_get_default_value  (GParamSpec    *pspec);
346  
347  GLIB_AVAILABLE_IN_2_46
348  GQuark          g_param_spec_get_name_quark     (GParamSpec    *pspec);
349  
350  /* --- convenience functions --- */
351  typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo;
352  /**
353   * GParamSpecTypeInfo:
354   * @instance_size: Size of the instance (object) structure.
355   * @n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the [slice allocator][glib-Memory-Slices] now.
356   * @instance_init: Location of the instance initialization function (optional).
357   * @value_type: The #GType of values conforming to this #GParamSpec
358   * @finalize: The instance finalization function (optional).
359   * @value_set_default: Resets a @value to the default value for @pspec
360   *  (recommended, the default is g_value_reset()), see
361   *  g_param_value_set_default().
362   * @value_validate: Ensures that the contents of @value comply with the
363   *  specifications set out by @pspec (optional), see
364   *  g_param_value_validate().
365   * @values_cmp: Compares @value1 with @value2 according to @pspec
366   *  (recommended, the default is memcmp()), see g_param_values_cmp().
367   *
368   * This structure is used to provide the type system with the information
369   * required to initialize and destruct (finalize) a parameter's class and
370   * instances thereof.
371   * The initialized structure is passed to the g_param_type_register_static()
372   * The type system will perform a deep copy of this structure, so its memory
373   * does not need to be persistent across invocation of
374   * g_param_type_register_static().
375   */
376  struct _GParamSpecTypeInfo
377  {
378    /* type system portion */
379    guint16         instance_size;                               /* obligatory */
380    guint16         n_preallocs;                                 /* optional */
381    void		(*instance_init)	(GParamSpec   *pspec); /* optional */
382  
383    /* class portion */
384    GType           value_type;				       /* obligatory */
385    void          (*finalize)             (GParamSpec   *pspec); /* optional */
386    void          (*value_set_default)    (GParamSpec   *pspec,  /* recommended */
387  					 GValue       *value);
388    gboolean      (*value_validate)       (GParamSpec   *pspec,  /* optional */
389  					 GValue       *value);
390    gint          (*values_cmp)           (GParamSpec   *pspec,  /* recommended */
391  					 const GValue *value1,
392  					 const GValue *value2);
393  };
394  GLIB_AVAILABLE_IN_ALL
395  GType	g_param_type_register_static	(const gchar		  *name,
396  					 const GParamSpecTypeInfo *pspec_info);
397  
398  GLIB_AVAILABLE_IN_2_66
399  gboolean g_param_spec_is_valid_name    (const gchar              *name);
400  
401  /* For registering builting types */
402  GType  _g_param_type_register_static_constant (const gchar              *name,
403  					       const GParamSpecTypeInfo *pspec_info,
404  					       GType                     opt_type);
405  
406  
407  /* --- protected --- */
408  GLIB_AVAILABLE_IN_ALL
409  gpointer	g_param_spec_internal		(GType	        param_type,
410  						 const gchar   *name,
411  						 const gchar   *nick,
412  						 const gchar   *blurb,
413  						 GParamFlags    flags);
414  GLIB_AVAILABLE_IN_ALL
415  GParamSpecPool* g_param_spec_pool_new		(gboolean	type_prefixing);
416  GLIB_AVAILABLE_IN_ALL
417  void		g_param_spec_pool_insert	(GParamSpecPool	*pool,
418  						 GParamSpec	*pspec,
419  						 GType		 owner_type);
420  GLIB_AVAILABLE_IN_ALL
421  void		g_param_spec_pool_remove	(GParamSpecPool	*pool,
422  						 GParamSpec	*pspec);
423  GLIB_AVAILABLE_IN_ALL
424  GParamSpec*	g_param_spec_pool_lookup	(GParamSpecPool	*pool,
425  						 const gchar	*param_name,
426  						 GType		 owner_type,
427  						 gboolean	 walk_ancestors);
428  GLIB_AVAILABLE_IN_ALL
429  GList*		g_param_spec_pool_list_owned	(GParamSpecPool	*pool,
430  						 GType		 owner_type);
431  GLIB_AVAILABLE_IN_ALL
432  GParamSpec**	g_param_spec_pool_list		(GParamSpecPool	*pool,
433  						 GType		 owner_type,
434  						 guint		*n_pspecs_p);
435  
436  
437  /* contracts:
438   *
439   * gboolean value_validate (GParamSpec *pspec,
440   *                          GValue     *value):
441   *	modify value contents in the least destructive way, so
442   *	that it complies with pspec's requirements (i.e.
443   *	according to minimum/maximum ranges etc...). return
444   *	whether modification was necessary.
445   *
446   * gint values_cmp (GParamSpec   *pspec,
447   *                  const GValue *value1,
448   *                  const GValue *value2):
449   *	return value1 - value2, i.e. (-1) if value1 < value2,
450   *	(+1) if value1 > value2, and (0) otherwise (equality)
451   */
452  
453  G_END_DECLS
454  
455  #endif /* __G_PARAM_H__ */
456