| 1 | /* GObject - GLib Type, Object, Parameter and Signal Library |
| 2 | * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. |
| 3 | * |
| 4 | * SPDX-License-Identifier: LGPL-2.1-or-later |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General |
| 17 | * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. |
| 18 | */ |
| 19 | #ifndef __G_OBJECT_H__ |
| 20 | #define __G_OBJECT_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/gtype.h> |
| 27 | #include <gobject/gvalue.h> |
| 28 | #include <gobject/gparam.h> |
| 29 | #include <gobject/gclosure.h> |
| 30 | #include <gobject/gsignal.h> |
| 31 | #include <gobject/gboxed.h> |
| 32 | |
| 33 | G_BEGIN_DECLS |
| 34 | |
| 35 | /* --- type macros --- */ |
| 36 | /** |
| 37 | * G_TYPE_IS_OBJECT: |
| 38 | * @type: Type id to check |
| 39 | * |
| 40 | * Check if the passed in type id is a %G_TYPE_OBJECT or derived from it. |
| 41 | * |
| 42 | * Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT. |
| 43 | */ |
| 44 | #define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT) |
| 45 | /** |
| 46 | * G_OBJECT: |
| 47 | * @object: Object which is subject to casting. |
| 48 | * |
| 49 | * Casts a #GObject or derived pointer into a (GObject*) pointer. |
| 50 | * |
| 51 | * Depending on the current debugging level, this function may invoke |
| 52 | * certain runtime checks to identify invalid casts. |
| 53 | */ |
| 54 | #define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject)) |
| 55 | /** |
| 56 | * G_OBJECT_CLASS: |
| 57 | * @class: a valid #GObjectClass |
| 58 | * |
| 59 | * Casts a derived #GObjectClass structure into a #GObjectClass structure. |
| 60 | */ |
| 61 | #define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass)) |
| 62 | /** |
| 63 | * G_IS_OBJECT: |
| 64 | * @object: Instance to check for being a %G_TYPE_OBJECT. |
| 65 | * |
| 66 | * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT. |
| 67 | */ |
| 68 | #if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_42 |
| 69 | #define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE ((object), G_TYPE_OBJECT)) |
| 70 | #else |
| 71 | #define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT)) |
| 72 | #endif |
| 73 | /** |
| 74 | * G_IS_OBJECT_CLASS: |
| 75 | * @class: a #GObjectClass |
| 76 | * |
| 77 | * Checks whether @class "is a" valid #GObjectClass structure of type |
| 78 | * %G_TYPE_OBJECT or derived. |
| 79 | */ |
| 80 | #define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT)) |
| 81 | /** |
| 82 | * G_OBJECT_GET_CLASS: |
| 83 | * @object: a #GObject instance. |
| 84 | * |
| 85 | * Get the class structure associated to a #GObject instance. |
| 86 | * |
| 87 | * Returns: pointer to object class structure. |
| 88 | */ |
| 89 | #define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass)) |
| 90 | /** |
| 91 | * G_OBJECT_TYPE: |
| 92 | * @object: Object to return the type id for. |
| 93 | * |
| 94 | * Get the type id of an object. |
| 95 | * |
| 96 | * Returns: Type id of @object. |
| 97 | */ |
| 98 | #define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object)) |
| 99 | /** |
| 100 | * G_OBJECT_TYPE_NAME: |
| 101 | * @object: Object to return the type name for. |
| 102 | * |
| 103 | * Get the name of an object's type. |
| 104 | * |
| 105 | * Returns: Type name of @object. The string is owned by the type system and |
| 106 | * should not be freed. |
| 107 | */ |
| 108 | #define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object))) |
| 109 | /** |
| 110 | * G_OBJECT_CLASS_TYPE: |
| 111 | * @class: a valid #GObjectClass |
| 112 | * |
| 113 | * Get the type id of a class structure. |
| 114 | * |
| 115 | * Returns: Type id of @class. |
| 116 | */ |
| 117 | #define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class)) |
| 118 | /** |
| 119 | * G_OBJECT_CLASS_NAME: |
| 120 | * @class: a valid #GObjectClass |
| 121 | * |
| 122 | * Return the name of a class structure's type. |
| 123 | * |
| 124 | * Returns: Type name of @class. The string is owned by the type system and |
| 125 | * should not be freed. |
| 126 | */ |
| 127 | #define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class))) |
| 128 | /** |
| 129 | * G_VALUE_HOLDS_OBJECT: |
| 130 | * @value: a valid #GValue structure |
| 131 | * |
| 132 | * Checks whether the given #GValue can hold values derived from type %G_TYPE_OBJECT. |
| 133 | * |
| 134 | * Returns: %TRUE on success. |
| 135 | */ |
| 136 | #define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT)) |
| 137 | |
| 138 | /* --- type macros --- */ |
| 139 | /** |
| 140 | * G_TYPE_INITIALLY_UNOWNED: |
| 141 | * |
| 142 | * The type for #GInitiallyUnowned. |
| 143 | */ |
| 144 | #define G_TYPE_INITIALLY_UNOWNED (g_initially_unowned_get_type()) |
| 145 | /** |
| 146 | * G_INITIALLY_UNOWNED: |
| 147 | * @object: Object which is subject to casting. |
| 148 | * |
| 149 | * Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*) |
| 150 | * pointer. |
| 151 | * |
| 152 | * Depending on the current debugging level, this function may invoke |
| 153 | * certain runtime checks to identify invalid casts. |
| 154 | */ |
| 155 | #define G_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned)) |
| 156 | /** |
| 157 | * G_INITIALLY_UNOWNED_CLASS: |
| 158 | * @class: a valid #GInitiallyUnownedClass |
| 159 | * |
| 160 | * Casts a derived #GInitiallyUnownedClass structure into a |
| 161 | * #GInitiallyUnownedClass structure. |
| 162 | */ |
| 163 | #define G_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass)) |
| 164 | /** |
| 165 | * G_IS_INITIALLY_UNOWNED: |
| 166 | * @object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED. |
| 167 | * |
| 168 | * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_INITIALLY_UNOWNED. |
| 169 | */ |
| 170 | #define G_IS_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED)) |
| 171 | /** |
| 172 | * G_IS_INITIALLY_UNOWNED_CLASS: |
| 173 | * @class: a #GInitiallyUnownedClass |
| 174 | * |
| 175 | * Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type |
| 176 | * %G_TYPE_INITIALLY_UNOWNED or derived. |
| 177 | */ |
| 178 | #define G_IS_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED)) |
| 179 | /** |
| 180 | * G_INITIALLY_UNOWNED_GET_CLASS: |
| 181 | * @object: a #GInitiallyUnowned instance. |
| 182 | * |
| 183 | * Get the class structure associated to a #GInitiallyUnowned instance. |
| 184 | * |
| 185 | * Returns: pointer to object class structure. |
| 186 | */ |
| 187 | #define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass)) |
| 188 | /* GInitiallyUnowned ia a GObject with initially floating reference count */ |
| 189 | |
| 190 | |
| 191 | /* --- typedefs & structures --- */ |
| 192 | typedef struct _GObject GObject; |
| 193 | typedef struct _GObjectClass GObjectClass; |
| 194 | typedef struct _GObject GInitiallyUnowned; |
| 195 | typedef struct _GObjectClass GInitiallyUnownedClass; |
| 196 | typedef struct _GObjectConstructParam GObjectConstructParam; |
| 197 | /** |
| 198 | * GObjectGetPropertyFunc: |
| 199 | * @object: a #GObject |
| 200 | * @property_id: the numeric id under which the property was registered with |
| 201 | * g_object_class_install_property(). |
| 202 | * @value: a #GValue to return the property value in |
| 203 | * @pspec: the #GParamSpec describing the property |
| 204 | * |
| 205 | * The type of the @get_property function of #GObjectClass. |
| 206 | */ |
| 207 | typedef void (*GObjectGetPropertyFunc) (GObject *object, |
| 208 | guint property_id, |
| 209 | GValue *value, |
| 210 | GParamSpec *pspec); |
| 211 | /** |
| 212 | * GObjectSetPropertyFunc: |
| 213 | * @object: a #GObject |
| 214 | * @property_id: the numeric id under which the property was registered with |
| 215 | * g_object_class_install_property(). |
| 216 | * @value: the new value for the property |
| 217 | * @pspec: the #GParamSpec describing the property |
| 218 | * |
| 219 | * The type of the @set_property function of #GObjectClass. |
| 220 | */ |
| 221 | typedef void (*GObjectSetPropertyFunc) (GObject *object, |
| 222 | guint property_id, |
| 223 | const GValue *value, |
| 224 | GParamSpec *pspec); |
| 225 | /** |
| 226 | * GObjectFinalizeFunc: |
| 227 | * @object: the #GObject being finalized |
| 228 | * |
| 229 | * The type of the @finalize function of #GObjectClass. |
| 230 | */ |
| 231 | typedef void (*GObjectFinalizeFunc) (GObject *object); |
| 232 | /** |
| 233 | * GWeakNotify: |
| 234 | * @data: data that was provided when the weak reference was established |
| 235 | * @where_the_object_was: the object being disposed |
| 236 | * |
| 237 | * A #GWeakNotify function can be added to an object as a callback that gets |
| 238 | * triggered when the object is finalized. |
| 239 | * |
| 240 | * Since the object is already being disposed when the #GWeakNotify is called, |
| 241 | * there's not much you could do with the object, apart from e.g. using its |
| 242 | * address as hash-index or the like. |
| 243 | * |
| 244 | * In particular, this means it’s invalid to call g_object_ref(), |
| 245 | * g_weak_ref_init(), g_weak_ref_set(), g_object_add_toggle_ref(), |
| 246 | * g_object_weak_ref(), g_object_add_weak_pointer() or any function which calls |
| 247 | * them on the object from this callback. |
| 248 | */ |
| 249 | typedef void (*GWeakNotify) (gpointer data, |
| 250 | GObject *where_the_object_was); |
| 251 | |
| 252 | struct _GObject |
| 253 | { |
| 254 | GTypeInstance g_type_instance; |
| 255 | |
| 256 | /*< private >*/ |
| 257 | guint ref_count; /* (atomic) */ |
| 258 | GData *qdata; |
| 259 | }; |
| 260 | /** |
| 261 | * GObjectClass: |
| 262 | * @g_type_class: the parent class |
| 263 | * @constructor: the @constructor function is called by g_object_new () to |
| 264 | * complete the object initialization after all the construction properties are |
| 265 | * set. The first thing a @constructor implementation must do is chain up to the |
| 266 | * @constructor of the parent class. Overriding @constructor should be rarely |
| 267 | * needed, e.g. to handle construct properties, or to implement singletons. |
| 268 | * @set_property: the generic setter for all properties of this type. Should be |
| 269 | * overridden for every type with properties. If implementations of |
| 270 | * @set_property don't emit property change notification explicitly, this will |
| 271 | * be done implicitly by the type system. However, if the notify signal is |
| 272 | * emitted explicitly, the type system will not emit it a second time. |
| 273 | * @get_property: the generic getter for all properties of this type. Should be |
| 274 | * overridden for every type with properties. |
| 275 | * @dispose: the @dispose function is supposed to drop all references to other |
| 276 | * objects, but keep the instance otherwise intact, so that client method |
| 277 | * invocations still work. It may be run multiple times (due to reference |
| 278 | * loops). Before returning, @dispose should chain up to the @dispose method |
| 279 | * of the parent class. |
| 280 | * @finalize: instance finalization function, should finish the finalization of |
| 281 | * the instance begun in @dispose and chain up to the @finalize method of the |
| 282 | * parent class. |
| 283 | * @dispatch_properties_changed: emits property change notification for a bunch |
| 284 | * of properties. Overriding @dispatch_properties_changed should be rarely |
| 285 | * needed. |
| 286 | * @notify: the class closure for the notify signal |
| 287 | * @constructed: the @constructed function is called by g_object_new() as the |
| 288 | * final step of the object creation process. At the point of the call, all |
| 289 | * construction properties have been set on the object. The purpose of this |
| 290 | * call is to allow for object initialisation steps that can only be performed |
| 291 | * after construction properties have been set. @constructed implementors |
| 292 | * should chain up to the @constructed call of their parent class to allow it |
| 293 | * to complete its initialisation. |
| 294 | * |
| 295 | * The class structure for the GObject type. |
| 296 | * |
| 297 | * |[<!-- language="C" --> |
| 298 | * // Example of implementing a singleton using a constructor. |
| 299 | * static MySingleton *the_singleton = NULL; |
| 300 | * |
| 301 | * static GObject* |
| 302 | * my_singleton_constructor (GType type, |
| 303 | * guint n_construct_params, |
| 304 | * GObjectConstructParam *construct_params) |
| 305 | * { |
| 306 | * GObject *object; |
| 307 | * |
| 308 | * if (!the_singleton) |
| 309 | * { |
| 310 | * object = G_OBJECT_CLASS (parent_class)->constructor (type, |
| 311 | * n_construct_params, |
| 312 | * construct_params); |
| 313 | * the_singleton = MY_SINGLETON (object); |
| 314 | * } |
| 315 | * else |
| 316 | * object = g_object_ref (G_OBJECT (the_singleton)); |
| 317 | * |
| 318 | * return object; |
| 319 | * } |
| 320 | * ]| |
| 321 | */ |
| 322 | struct _GObjectClass |
| 323 | { |
| 324 | GTypeClass g_type_class; |
| 325 | |
| 326 | /*< private >*/ |
| 327 | GSList *construct_properties; |
| 328 | |
| 329 | /*< public >*/ |
| 330 | /* seldom overridden */ |
| 331 | GObject* (*constructor) (GType type, |
| 332 | guint n_construct_properties, |
| 333 | GObjectConstructParam *construct_properties); |
| 334 | /* overridable methods */ |
| 335 | void (*set_property) (GObject *object, |
| 336 | guint property_id, |
| 337 | const GValue *value, |
| 338 | GParamSpec *pspec); |
| 339 | void (*get_property) (GObject *object, |
| 340 | guint property_id, |
| 341 | GValue *value, |
| 342 | GParamSpec *pspec); |
| 343 | void (*dispose) (GObject *object); |
| 344 | void (*finalize) (GObject *object); |
| 345 | /* seldom overridden */ |
| 346 | void (*dispatch_properties_changed) (GObject *object, |
| 347 | guint n_pspecs, |
| 348 | GParamSpec **pspecs); |
| 349 | /* signals */ |
| 350 | void (*notify) (GObject *object, |
| 351 | GParamSpec *pspec); |
| 352 | |
| 353 | /* called when done constructing */ |
| 354 | void (*constructed) (GObject *object); |
| 355 | |
| 356 | /*< private >*/ |
| 357 | gsize flags; |
| 358 | |
| 359 | gsize n_construct_properties; |
| 360 | |
| 361 | gpointer pspecs; |
| 362 | gsize n_pspecs; |
| 363 | |
| 364 | /* padding */ |
| 365 | gpointer pdummy[3]; |
| 366 | }; |
| 367 | |
| 368 | /** |
| 369 | * GObjectConstructParam: |
| 370 | * @pspec: the #GParamSpec of the construct parameter |
| 371 | * @value: the value to set the parameter to |
| 372 | * |
| 373 | * The GObjectConstructParam struct is an auxiliary structure used to hand |
| 374 | * #GParamSpec/#GValue pairs to the @constructor of a #GObjectClass. |
| 375 | */ |
| 376 | struct _GObjectConstructParam |
| 377 | { |
| 378 | GParamSpec *pspec; |
| 379 | GValue *value; |
| 380 | }; |
| 381 | |
| 382 | /** |
| 383 | * GInitiallyUnowned: |
| 384 | * |
| 385 | * A type for objects that have an initially floating reference. |
| 386 | * |
| 387 | * All the fields in the `GInitiallyUnowned` structure are private to the |
| 388 | * implementation and should never be accessed directly. |
| 389 | */ |
| 390 | /** |
| 391 | * GInitiallyUnownedClass: |
| 392 | * |
| 393 | * The class structure for the GInitiallyUnowned type. |
| 394 | */ |
| 395 | |
| 396 | |
| 397 | /* --- prototypes --- */ |
| 398 | GOBJECT_AVAILABLE_IN_ALL |
| 399 | GType g_initially_unowned_get_type (void); |
| 400 | GOBJECT_AVAILABLE_IN_ALL |
| 401 | void g_object_class_install_property (GObjectClass *oclass, |
| 402 | guint property_id, |
| 403 | GParamSpec *pspec); |
| 404 | GOBJECT_AVAILABLE_IN_ALL |
| 405 | GParamSpec* g_object_class_find_property (GObjectClass *oclass, |
| 406 | const gchar *property_name); |
| 407 | GOBJECT_AVAILABLE_IN_ALL |
| 408 | GParamSpec**g_object_class_list_properties (GObjectClass *oclass, |
| 409 | guint *n_properties); |
| 410 | GOBJECT_AVAILABLE_IN_ALL |
| 411 | void g_object_class_override_property (GObjectClass *oclass, |
| 412 | guint property_id, |
| 413 | const gchar *name); |
| 414 | GOBJECT_AVAILABLE_IN_ALL |
| 415 | void g_object_class_install_properties (GObjectClass *oclass, |
| 416 | guint n_pspecs, |
| 417 | GParamSpec **pspecs); |
| 418 | |
| 419 | GOBJECT_AVAILABLE_IN_ALL |
| 420 | void g_object_interface_install_property (gpointer g_iface, |
| 421 | GParamSpec *pspec); |
| 422 | GOBJECT_AVAILABLE_IN_ALL |
| 423 | GParamSpec* g_object_interface_find_property (gpointer g_iface, |
| 424 | const gchar *property_name); |
| 425 | GOBJECT_AVAILABLE_IN_ALL |
| 426 | GParamSpec**g_object_interface_list_properties (gpointer g_iface, |
| 427 | guint *n_properties_p); |
| 428 | |
| 429 | GOBJECT_AVAILABLE_IN_ALL |
| 430 | GType g_object_get_type (void) G_GNUC_CONST; |
| 431 | GOBJECT_AVAILABLE_IN_ALL |
| 432 | gpointer g_object_new (GType object_type, |
| 433 | const gchar *first_property_name, |
| 434 | ...); |
| 435 | GOBJECT_AVAILABLE_IN_2_54 |
| 436 | GObject* g_object_new_with_properties (GType object_type, |
| 437 | guint n_properties, |
| 438 | const char *names[], |
| 439 | const GValue values[]); |
| 440 | |
| 441 | G_GNUC_BEGIN_IGNORE_DEPRECATIONS |
| 442 | |
| 443 | GOBJECT_DEPRECATED_IN_2_54_FOR(g_object_new_with_properties) |
| 444 | gpointer g_object_newv (GType object_type, |
| 445 | guint n_parameters, |
| 446 | GParameter *parameters); |
| 447 | |
| 448 | G_GNUC_END_IGNORE_DEPRECATIONS |
| 449 | |
| 450 | GOBJECT_AVAILABLE_IN_ALL |
| 451 | GObject* g_object_new_valist (GType object_type, |
| 452 | const gchar *first_property_name, |
| 453 | va_list var_args); |
| 454 | GOBJECT_AVAILABLE_IN_ALL |
| 455 | void g_object_set (gpointer object, |
| 456 | const gchar *first_property_name, |
| 457 | ...) G_GNUC_NULL_TERMINATED; |
| 458 | GOBJECT_AVAILABLE_IN_ALL |
| 459 | void g_object_get (gpointer object, |
| 460 | const gchar *first_property_name, |
| 461 | ...) G_GNUC_NULL_TERMINATED; |
| 462 | GOBJECT_AVAILABLE_IN_ALL |
| 463 | gpointer g_object_connect (gpointer object, |
| 464 | const gchar *signal_spec, |
| 465 | ...) G_GNUC_NULL_TERMINATED; |
| 466 | GOBJECT_AVAILABLE_IN_ALL |
| 467 | void g_object_disconnect (gpointer object, |
| 468 | const gchar *signal_spec, |
| 469 | ...) G_GNUC_NULL_TERMINATED; |
| 470 | GOBJECT_AVAILABLE_IN_2_54 |
| 471 | void g_object_setv (GObject *object, |
| 472 | guint n_properties, |
| 473 | const gchar *names[], |
| 474 | const GValue values[]); |
| 475 | GOBJECT_AVAILABLE_IN_ALL |
| 476 | void g_object_set_valist (GObject *object, |
| 477 | const gchar *first_property_name, |
| 478 | va_list var_args); |
| 479 | GOBJECT_AVAILABLE_IN_2_54 |
| 480 | void g_object_getv (GObject *object, |
| 481 | guint n_properties, |
| 482 | const gchar *names[], |
| 483 | GValue values[]); |
| 484 | GOBJECT_AVAILABLE_IN_ALL |
| 485 | void g_object_get_valist (GObject *object, |
| 486 | const gchar *first_property_name, |
| 487 | va_list var_args); |
| 488 | GOBJECT_AVAILABLE_IN_ALL |
| 489 | void g_object_set_property (GObject *object, |
| 490 | const gchar *property_name, |
| 491 | const GValue *value); |
| 492 | GOBJECT_AVAILABLE_IN_ALL |
| 493 | void g_object_get_property (GObject *object, |
| 494 | const gchar *property_name, |
| 495 | GValue *value); |
| 496 | GOBJECT_AVAILABLE_IN_ALL |
| 497 | void g_object_freeze_notify (GObject *object); |
| 498 | GOBJECT_AVAILABLE_IN_ALL |
| 499 | void g_object_notify (GObject *object, |
| 500 | const gchar *property_name); |
| 501 | GOBJECT_AVAILABLE_IN_ALL |
| 502 | void g_object_notify_by_pspec (GObject *object, |
| 503 | GParamSpec *pspec); |
| 504 | GOBJECT_AVAILABLE_IN_ALL |
| 505 | void g_object_thaw_notify (GObject *object); |
| 506 | GOBJECT_AVAILABLE_IN_ALL |
| 507 | gboolean g_object_is_floating (gpointer object); |
| 508 | GOBJECT_AVAILABLE_IN_ALL |
| 509 | gpointer g_object_ref_sink (gpointer object); |
| 510 | GOBJECT_AVAILABLE_IN_2_70 |
| 511 | gpointer g_object_take_ref (gpointer object); |
| 512 | GOBJECT_AVAILABLE_IN_ALL |
| 513 | gpointer g_object_ref (gpointer object); |
| 514 | GOBJECT_AVAILABLE_IN_ALL |
| 515 | void g_object_unref (gpointer object); |
| 516 | GOBJECT_AVAILABLE_IN_ALL |
| 517 | void g_object_weak_ref (GObject *object, |
| 518 | GWeakNotify notify, |
| 519 | gpointer data); |
| 520 | GOBJECT_AVAILABLE_IN_ALL |
| 521 | void g_object_weak_unref (GObject *object, |
| 522 | GWeakNotify notify, |
| 523 | gpointer data); |
| 524 | GOBJECT_AVAILABLE_IN_ALL |
| 525 | void g_object_add_weak_pointer (GObject *object, |
| 526 | gpointer *weak_pointer_location); |
| 527 | GOBJECT_AVAILABLE_IN_ALL |
| 528 | void g_object_remove_weak_pointer (GObject *object, |
| 529 | gpointer *weak_pointer_location); |
| 530 | |
| 531 | #if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56 |
| 532 | /* Make reference APIs type safe with macros */ |
| 533 | #define g_object_ref(Obj) ((glib_typeof (Obj)) (g_object_ref) (Obj)) |
| 534 | #define g_object_ref_sink(Obj) ((glib_typeof (Obj)) (g_object_ref_sink) (Obj)) |
| 535 | #endif |
| 536 | |
| 537 | /** |
| 538 | * GToggleNotify: |
| 539 | * @data: Callback data passed to g_object_add_toggle_ref() |
| 540 | * @object: The object on which g_object_add_toggle_ref() was called. |
| 541 | * @is_last_ref: %TRUE if the toggle reference is now the |
| 542 | * last reference to the object. %FALSE if the toggle |
| 543 | * reference was the last reference and there are now other |
| 544 | * references. |
| 545 | * |
| 546 | * A callback function used for notification when the state |
| 547 | * of a toggle reference changes. |
| 548 | * |
| 549 | * See also: g_object_add_toggle_ref() |
| 550 | */ |
| 551 | typedef void (*GToggleNotify) (gpointer data, |
| 552 | GObject *object, |
| 553 | gboolean is_last_ref); |
| 554 | |
| 555 | GOBJECT_AVAILABLE_IN_ALL |
| 556 | void g_object_add_toggle_ref (GObject *object, |
| 557 | GToggleNotify notify, |
| 558 | gpointer data); |
| 559 | GOBJECT_AVAILABLE_IN_ALL |
| 560 | void g_object_remove_toggle_ref (GObject *object, |
| 561 | GToggleNotify notify, |
| 562 | gpointer data); |
| 563 | |
| 564 | GOBJECT_AVAILABLE_IN_ALL |
| 565 | gpointer g_object_get_qdata (GObject *object, |
| 566 | GQuark quark); |
| 567 | GOBJECT_AVAILABLE_IN_ALL |
| 568 | void g_object_set_qdata (GObject *object, |
| 569 | GQuark quark, |
| 570 | gpointer data); |
| 571 | GOBJECT_AVAILABLE_IN_ALL |
| 572 | void g_object_set_qdata_full (GObject *object, |
| 573 | GQuark quark, |
| 574 | gpointer data, |
| 575 | GDestroyNotify destroy); |
| 576 | GOBJECT_AVAILABLE_IN_ALL |
| 577 | gpointer g_object_steal_qdata (GObject *object, |
| 578 | GQuark quark); |
| 579 | |
| 580 | GOBJECT_AVAILABLE_IN_2_34 |
| 581 | gpointer g_object_dup_qdata (GObject *object, |
| 582 | GQuark quark, |
| 583 | GDuplicateFunc dup_func, |
| 584 | gpointer user_data); |
| 585 | GOBJECT_AVAILABLE_IN_2_34 |
| 586 | gboolean g_object_replace_qdata (GObject *object, |
| 587 | GQuark quark, |
| 588 | gpointer oldval, |
| 589 | gpointer newval, |
| 590 | GDestroyNotify destroy, |
| 591 | GDestroyNotify *old_destroy); |
| 592 | |
| 593 | GOBJECT_AVAILABLE_IN_ALL |
| 594 | gpointer g_object_get_data (GObject *object, |
| 595 | const gchar *key); |
| 596 | GOBJECT_AVAILABLE_IN_ALL |
| 597 | void g_object_set_data (GObject *object, |
| 598 | const gchar *key, |
| 599 | gpointer data); |
| 600 | GOBJECT_AVAILABLE_IN_ALL |
| 601 | void g_object_set_data_full (GObject *object, |
| 602 | const gchar *key, |
| 603 | gpointer data, |
| 604 | GDestroyNotify destroy); |
| 605 | GOBJECT_AVAILABLE_IN_ALL |
| 606 | gpointer g_object_steal_data (GObject *object, |
| 607 | const gchar *key); |
| 608 | |
| 609 | GOBJECT_AVAILABLE_IN_2_34 |
| 610 | gpointer g_object_dup_data (GObject *object, |
| 611 | const gchar *key, |
| 612 | GDuplicateFunc dup_func, |
| 613 | gpointer user_data); |
| 614 | GOBJECT_AVAILABLE_IN_2_34 |
| 615 | gboolean g_object_replace_data (GObject *object, |
| 616 | const gchar *key, |
| 617 | gpointer oldval, |
| 618 | gpointer newval, |
| 619 | GDestroyNotify destroy, |
| 620 | GDestroyNotify *old_destroy); |
| 621 | |
| 622 | |
| 623 | GOBJECT_AVAILABLE_IN_ALL |
| 624 | void g_object_watch_closure (GObject *object, |
| 625 | GClosure *closure); |
| 626 | GOBJECT_AVAILABLE_IN_ALL |
| 627 | GClosure* g_cclosure_new_object (GCallback callback_func, |
| 628 | GObject *object); |
| 629 | GOBJECT_AVAILABLE_IN_ALL |
| 630 | GClosure* g_cclosure_new_object_swap (GCallback callback_func, |
| 631 | GObject *object); |
| 632 | GOBJECT_AVAILABLE_IN_ALL |
| 633 | GClosure* g_closure_new_object (guint sizeof_closure, |
| 634 | GObject *object); |
| 635 | GOBJECT_AVAILABLE_IN_ALL |
| 636 | void g_value_set_object (GValue *value, |
| 637 | gpointer v_object); |
| 638 | GOBJECT_AVAILABLE_IN_ALL |
| 639 | gpointer g_value_get_object (const GValue *value); |
| 640 | GOBJECT_AVAILABLE_IN_ALL |
| 641 | gpointer g_value_dup_object (const GValue *value); |
| 642 | GOBJECT_AVAILABLE_IN_ALL |
| 643 | gulong g_signal_connect_object (gpointer instance, |
| 644 | const gchar *detailed_signal, |
| 645 | GCallback c_handler, |
| 646 | gpointer gobject, |
| 647 | GConnectFlags connect_flags); |
| 648 | |
| 649 | /*< protected >*/ |
| 650 | GOBJECT_AVAILABLE_IN_ALL |
| 651 | void g_object_force_floating (GObject *object); |
| 652 | GOBJECT_AVAILABLE_IN_ALL |
| 653 | void g_object_run_dispose (GObject *object); |
| 654 | |
| 655 | |
| 656 | GOBJECT_AVAILABLE_IN_ALL |
| 657 | void g_value_take_object (GValue *value, |
| 658 | gpointer v_object); |
| 659 | GOBJECT_DEPRECATED_FOR(g_value_take_object) |
| 660 | void g_value_set_object_take_ownership (GValue *value, |
| 661 | gpointer v_object); |
| 662 | |
| 663 | GOBJECT_DEPRECATED |
| 664 | gsize g_object_compat_control (gsize what, |
| 665 | gpointer data); |
| 666 | |
| 667 | /* --- implementation macros --- */ |
| 668 | #define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \ |
| 669 | G_STMT_START { \ |
| 670 | GObject *_glib__object = (GObject*) (object); \ |
| 671 | GParamSpec *_glib__pspec = (GParamSpec*) (pspec); \ |
| 672 | guint _glib__property_id = (property_id); \ |
| 673 | g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'", \ |
| 674 | __FILE__, __LINE__, \ |
| 675 | (pname), \ |
| 676 | _glib__property_id, \ |
| 677 | _glib__pspec->name, \ |
| 678 | g_type_name (G_PARAM_SPEC_TYPE (_glib__pspec)), \ |
| 679 | G_OBJECT_TYPE_NAME (_glib__object)); \ |
| 680 | } G_STMT_END |
| 681 | /** |
| 682 | * G_OBJECT_WARN_INVALID_PROPERTY_ID: |
| 683 | * @object: the #GObject on which set_property() or get_property() was called |
| 684 | * @property_id: the numeric id of the property |
| 685 | * @pspec: the #GParamSpec of the property |
| 686 | * |
| 687 | * This macro should be used to emit a standard warning about unexpected |
| 688 | * properties in set_property() and get_property() implementations. |
| 689 | */ |
| 690 | #define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \ |
| 691 | G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec)) |
| 692 | |
| 693 | GOBJECT_AVAILABLE_IN_ALL |
| 694 | void g_clear_object (GObject **object_ptr); |
| 695 | #define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref) |
| 696 | |
| 697 | /** |
| 698 | * g_set_object: (skip) |
| 699 | * @object_ptr: (inout) (not optional) (nullable): a pointer to a #GObject reference |
| 700 | * @new_object: (nullable) (transfer none): a pointer to the new #GObject to |
| 701 | * assign to @object_ptr, or %NULL to clear the pointer |
| 702 | * |
| 703 | * Updates a #GObject pointer to refer to @new_object. |
| 704 | * |
| 705 | * It increments the reference count of @new_object (if non-%NULL), decrements |
| 706 | * the reference count of the current value of @object_ptr (if non-%NULL), and |
| 707 | * assigns @new_object to @object_ptr. The assignment is not atomic. |
| 708 | * |
| 709 | * @object_ptr must not be %NULL, but can point to a %NULL value. |
| 710 | * |
| 711 | * A macro is also included that allows this function to be used without |
| 712 | * pointer casts. The function itself is static inline, so its address may vary |
| 713 | * between compilation units. |
| 714 | * |
| 715 | * One convenient usage of this function is in implementing property setters: |
| 716 | * |[ |
| 717 | * void |
| 718 | * foo_set_bar (Foo *foo, |
| 719 | * Bar *new_bar) |
| 720 | * { |
| 721 | * g_return_if_fail (IS_FOO (foo)); |
| 722 | * g_return_if_fail (new_bar == NULL || IS_BAR (new_bar)); |
| 723 | * |
| 724 | * if (g_set_object (&foo->bar, new_bar)) |
| 725 | * g_object_notify (foo, "bar"); |
| 726 | * } |
| 727 | * ]| |
| 728 | * |
| 729 | * Returns: %TRUE if the value of @object_ptr changed, %FALSE otherwise |
| 730 | * |
| 731 | * Since: 2.44 |
| 732 | */ |
| 733 | static inline gboolean |
| 734 | (g_set_object) (GObject **object_ptr, |
| 735 | GObject *new_object) |
| 736 | { |
| 737 | GObject *old_object = *object_ptr; |
| 738 | |
| 739 | /* rely on g_object_[un]ref() to check the pointers are actually GObjects; |
| 740 | * elide a (object_ptr != NULL) check because most of the time we will be |
| 741 | * operating on struct members with a constant offset, so a NULL check would |
| 742 | * not catch bugs |
| 743 | */ |
| 744 | |
| 745 | if (old_object == new_object) |
| 746 | return FALSE; |
| 747 | |
| 748 | if (new_object != NULL) |
| 749 | g_object_ref (object: new_object); |
| 750 | |
| 751 | *object_ptr = new_object; |
| 752 | |
| 753 | if (old_object != NULL) |
| 754 | g_object_unref (object: old_object); |
| 755 | |
| 756 | return TRUE; |
| 757 | } |
| 758 | |
| 759 | /* We need GCC for __extension__, which we need to sort out strict aliasing of @object_ptr */ |
| 760 | #if defined(__GNUC__) |
| 761 | |
| 762 | #define g_set_object(object_ptr, new_object) \ |
| 763 | (G_GNUC_EXTENSION ({ \ |
| 764 | G_STATIC_ASSERT (sizeof *(object_ptr) == sizeof (new_object)); \ |
| 765 | /* Only one access, please; work around type aliasing */ \ |
| 766 | union { char *in; GObject **out; } _object_ptr; \ |
| 767 | _object_ptr.in = (char *) (object_ptr); \ |
| 768 | /* Check types match */ \ |
| 769 | (void) (0 ? *(object_ptr) = (new_object), FALSE : FALSE); \ |
| 770 | (g_set_object) (_object_ptr.out, (GObject *) new_object); \ |
| 771 | })) \ |
| 772 | GOBJECT_AVAILABLE_MACRO_IN_2_44 |
| 773 | |
| 774 | #else /* if !defined(__GNUC__) */ |
| 775 | |
| 776 | #define g_set_object(object_ptr, new_object) \ |
| 777 | (/* Check types match. */ \ |
| 778 | 0 ? *(object_ptr) = (new_object), FALSE : \ |
| 779 | (g_set_object) ((GObject **) (object_ptr), (GObject *) (new_object)) \ |
| 780 | ) |
| 781 | |
| 782 | #endif /* !defined(__GNUC__) */ |
| 783 | |
| 784 | /** |
| 785 | * g_assert_finalize_object: (skip) |
| 786 | * @object: (transfer full) (type GObject.Object): an object |
| 787 | * |
| 788 | * Assert that @object is non-%NULL, then release one reference to it with |
| 789 | * g_object_unref() and assert that it has been finalized (i.e. that there |
| 790 | * are no more references). |
| 791 | * |
| 792 | * If assertions are disabled via `G_DISABLE_ASSERT`, |
| 793 | * this macro just calls g_object_unref() without any further checks. |
| 794 | * |
| 795 | * This macro should only be used in regression tests. |
| 796 | * |
| 797 | * Since: 2.62 |
| 798 | */ |
| 799 | static inline void |
| 800 | (g_assert_finalize_object) (GObject *object) |
| 801 | { |
| 802 | gpointer weak_pointer = object; |
| 803 | |
| 804 | g_assert_true (G_IS_OBJECT (weak_pointer)); |
| 805 | g_object_add_weak_pointer (object, weak_pointer_location: &weak_pointer); |
| 806 | g_object_unref (object: weak_pointer); |
| 807 | g_assert_null (weak_pointer); |
| 808 | } |
| 809 | |
| 810 | #ifdef G_DISABLE_ASSERT |
| 811 | #define g_assert_finalize_object(object) g_object_unref (object) |
| 812 | #else |
| 813 | #define g_assert_finalize_object(object) (g_assert_finalize_object ((GObject *) object)) |
| 814 | #endif |
| 815 | |
| 816 | /** |
| 817 | * g_clear_weak_pointer: (skip) |
| 818 | * @weak_pointer_location: The memory address of a pointer |
| 819 | * |
| 820 | * Clears a weak reference to a #GObject. |
| 821 | * |
| 822 | * @weak_pointer_location must not be %NULL. |
| 823 | * |
| 824 | * If the weak reference is %NULL then this function does nothing. |
| 825 | * Otherwise, the weak reference to the object is removed for that location |
| 826 | * and the pointer is set to %NULL. |
| 827 | * |
| 828 | * A macro is also included that allows this function to be used without |
| 829 | * pointer casts. The function itself is static inline, so its address may vary |
| 830 | * between compilation units. |
| 831 | * |
| 832 | * Since: 2.56 |
| 833 | */ |
| 834 | static inline void |
| 835 | (g_clear_weak_pointer) (gpointer *weak_pointer_location) |
| 836 | { |
| 837 | GObject *object = (GObject *) *weak_pointer_location; |
| 838 | |
| 839 | if (object != NULL) |
| 840 | { |
| 841 | g_object_remove_weak_pointer (object, weak_pointer_location); |
| 842 | *weak_pointer_location = NULL; |
| 843 | } |
| 844 | } |
| 845 | |
| 846 | #define g_clear_weak_pointer(weak_pointer_location) \ |
| 847 | (/* Check types match. */ \ |
| 848 | (g_clear_weak_pointer) ((gpointer *) (weak_pointer_location)) \ |
| 849 | ) |
| 850 | |
| 851 | /** |
| 852 | * g_set_weak_pointer: (skip) |
| 853 | * @weak_pointer_location: the memory address of a pointer |
| 854 | * @new_object: (nullable) (transfer none): a pointer to the new #GObject to |
| 855 | * assign to it, or %NULL to clear the pointer |
| 856 | * |
| 857 | * Updates a pointer to weakly refer to @new_object. |
| 858 | * |
| 859 | * It assigns @new_object to @weak_pointer_location and ensures |
| 860 | * that @weak_pointer_location will automatically be set to %NULL |
| 861 | * if @new_object gets destroyed. The assignment is not atomic. |
| 862 | * The weak reference is not thread-safe, see g_object_add_weak_pointer() |
| 863 | * for details. |
| 864 | * |
| 865 | * The @weak_pointer_location argument must not be %NULL. |
| 866 | * |
| 867 | * A macro is also included that allows this function to be used without |
| 868 | * pointer casts. The function itself is static inline, so its address may vary |
| 869 | * between compilation units. |
| 870 | * |
| 871 | * One convenient usage of this function is in implementing property setters: |
| 872 | * |[ |
| 873 | * void |
| 874 | * foo_set_bar (Foo *foo, |
| 875 | * Bar *new_bar) |
| 876 | * { |
| 877 | * g_return_if_fail (IS_FOO (foo)); |
| 878 | * g_return_if_fail (new_bar == NULL || IS_BAR (new_bar)); |
| 879 | * |
| 880 | * if (g_set_weak_pointer (&foo->bar, new_bar)) |
| 881 | * g_object_notify (foo, "bar"); |
| 882 | * } |
| 883 | * ]| |
| 884 | * |
| 885 | * Returns: %TRUE if the value of @weak_pointer_location changed, %FALSE otherwise |
| 886 | * |
| 887 | * Since: 2.56 |
| 888 | */ |
| 889 | static inline gboolean |
| 890 | (g_set_weak_pointer) (gpointer *weak_pointer_location, |
| 891 | GObject *new_object) |
| 892 | { |
| 893 | GObject *old_object = (GObject *) *weak_pointer_location; |
| 894 | |
| 895 | /* elide a (weak_pointer_location != NULL) check because most of the time we |
| 896 | * will be operating on struct members with a constant offset, so a NULL |
| 897 | * check would not catch bugs |
| 898 | */ |
| 899 | |
| 900 | if (old_object == new_object) |
| 901 | return FALSE; |
| 902 | |
| 903 | if (old_object != NULL) |
| 904 | g_object_remove_weak_pointer (object: old_object, weak_pointer_location); |
| 905 | |
| 906 | *weak_pointer_location = new_object; |
| 907 | |
| 908 | if (new_object != NULL) |
| 909 | g_object_add_weak_pointer (object: new_object, weak_pointer_location); |
| 910 | |
| 911 | return TRUE; |
| 912 | } |
| 913 | |
| 914 | #define g_set_weak_pointer(weak_pointer_location, new_object) \ |
| 915 | (/* Check types match. */ \ |
| 916 | 0 ? *(weak_pointer_location) = (new_object), FALSE : \ |
| 917 | (g_set_weak_pointer) ((gpointer *) (weak_pointer_location), (GObject *) (new_object)) \ |
| 918 | ) |
| 919 | |
| 920 | typedef struct { |
| 921 | /*<private>*/ |
| 922 | union { gpointer p; } priv; |
| 923 | } GWeakRef; |
| 924 | |
| 925 | GOBJECT_AVAILABLE_IN_ALL |
| 926 | void g_weak_ref_init (GWeakRef *weak_ref, |
| 927 | gpointer object); |
| 928 | GOBJECT_AVAILABLE_IN_ALL |
| 929 | void g_weak_ref_clear (GWeakRef *weak_ref); |
| 930 | GOBJECT_AVAILABLE_IN_ALL |
| 931 | gpointer g_weak_ref_get (GWeakRef *weak_ref); |
| 932 | GOBJECT_AVAILABLE_IN_ALL |
| 933 | void g_weak_ref_set (GWeakRef *weak_ref, |
| 934 | gpointer object); |
| 935 | |
| 936 | G_END_DECLS |
| 937 | |
| 938 | #endif /* __G_OBJECT_H__ */ |
| 939 | |