📄 gobject.c
字号:
g_object_unref (gpointer _object){ GObject *object = _object; g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (object->ref_count > 0); #ifdef G_ENABLE_DEBUG if (g_trap_object_ref == object) G_BREAKPOINT ();#endif /* G_ENABLE_DEBUG */ if (object->ref_count > 1) object->ref_count -= 1; else g_object_last_unref (object);}gpointerg_object_get_qdata (GObject *object, GQuark quark){ g_return_val_if_fail (G_IS_OBJECT (object), NULL); return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;}voidg_object_set_qdata (GObject *object, GQuark quark, gpointer data){ g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (quark > 0); g_datalist_id_set_data (&object->qdata, quark, data);}voidg_object_set_qdata_full (GObject *object, GQuark quark, gpointer data, GDestroyNotify destroy){ g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (quark > 0); g_datalist_id_set_data_full (&object->qdata, quark, data, data ? destroy : (GDestroyNotify) NULL);}gpointerg_object_steal_qdata (GObject *object, GQuark quark){ g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (quark > 0, NULL); return g_datalist_id_remove_no_notify (&object->qdata, quark);}gpointerg_object_get_data (GObject *object, const gchar *key){ GQuark quark; g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (key != NULL, NULL); quark = g_quark_try_string (key); return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL;}voidg_object_set_data (GObject *object, const gchar *key, gpointer data){ g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (key != NULL); g_datalist_id_set_data (&object->qdata, g_quark_from_string (key), data);}voidg_object_set_data_full (GObject *object, const gchar *key, gpointer data, GDestroyNotify destroy){ g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (key != NULL); g_datalist_id_set_data_full (&object->qdata, g_quark_from_string (key), data, data ? destroy : (GDestroyNotify) NULL);}gpointerg_object_steal_data (GObject *object, const gchar *key){ GQuark quark; g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (key != NULL, NULL); quark = g_quark_try_string (key); return quark ? g_datalist_id_remove_no_notify (&object->qdata, quark) : NULL;}static voidg_value_object_init (GValue *value){ value->data[0].v_pointer = NULL;}static voidg_value_object_free_value (GValue *value){ if (value->data[0].v_pointer) g_object_unref (value->data[0].v_pointer);}static voidg_value_object_copy_value (const GValue *src_value, GValue *dest_value){ if (src_value->data[0].v_pointer) dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer); else dest_value->data[0].v_pointer = NULL;}static voidg_value_object_transform_value (const GValue *src_value, GValue *dest_value){ if (src_value->data[0].v_pointer && g_type_is_a (G_OBJECT_TYPE (src_value->data[0].v_pointer), G_VALUE_TYPE (dest_value))) dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer); else dest_value->data[0].v_pointer = NULL;}static gpointerg_value_object_peek_pointer (const GValue *value){ return value->data[0].v_pointer;}static gchar*g_value_object_collect_value (GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags){ if (collect_values[0].v_pointer) { GObject *object = collect_values[0].v_pointer; if (object->g_type_instance.g_class == NULL) return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); else if (!g_value_type_compatible (G_OBJECT_TYPE (object), G_VALUE_TYPE (value))) return g_strconcat ("invalid object type `", G_OBJECT_TYPE_NAME (object), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); /* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */ value->data[0].v_pointer = g_object_ref (object); } else value->data[0].v_pointer = NULL; return NULL;}static gchar*g_value_object_lcopy_value (const GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags){ GObject **object_p = collect_values[0].v_pointer; if (!object_p) return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); if (!value->data[0].v_pointer) *object_p = NULL; else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) *object_p = value->data[0].v_pointer; else *object_p = g_object_ref (value->data[0].v_pointer); return NULL;}voidg_value_set_object (GValue *value, gpointer v_object){ g_return_if_fail (G_VALUE_HOLDS_OBJECT (value)); if (value->data[0].v_pointer) { g_object_unref (value->data[0].v_pointer); value->data[0].v_pointer = NULL; } if (v_object) { g_return_if_fail (G_IS_OBJECT (v_object)); g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value))); value->data[0].v_pointer = v_object; g_object_ref (value->data[0].v_pointer); }}voidg_value_set_object_take_ownership (GValue *value, gpointer v_object){ g_return_if_fail (G_VALUE_HOLDS_OBJECT (value)); if (value->data[0].v_pointer) { g_object_unref (value->data[0].v_pointer); value->data[0].v_pointer = NULL; } if (v_object) { g_return_if_fail (G_IS_OBJECT (v_object)); g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value))); value->data[0].v_pointer = v_object; /* we take over the reference count */ }}gpointerg_value_get_object (const GValue *value){ g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL); return value->data[0].v_pointer;}GObject*g_value_dup_object (const GValue *value){ g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL); return value->data[0].v_pointer ? g_object_ref (value->data[0].v_pointer) : NULL;}gulongg_signal_connect_object (gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer gobject, GConnectFlags connect_flags){ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); g_return_val_if_fail (detailed_signal != NULL, 0); g_return_val_if_fail (c_handler != NULL, 0); if (gobject) { GClosure *closure; g_return_val_if_fail (G_IS_OBJECT (gobject), 0); closure = ((connect_flags & G_CONNECT_SWAPPED) ? g_cclosure_new_object_swap : g_cclosure_new_object) (c_handler, gobject); return g_signal_connect_closure (instance, detailed_signal, closure, connect_flags & G_CONNECT_AFTER); } else return g_signal_connect_data (instance, detailed_signal, c_handler, NULL, NULL, connect_flags);}typedef struct { GObject *object; guint n_closures; GClosure *closures[1]; /* flexible array */} CArray;/* don't change this structure without supplying an accessor for * watched closures, e.g.: * GSList* g_object_list_watched_closures (GObject *object) * { * CArray *carray; * g_return_val_if_fail (G_IS_OBJECT (object), NULL); * carray = g_object_get_data (object, "GObject-closure-array"); * if (carray) * { * GSList *slist = NULL; * guint i; * for (i = 0; i < carray->n_closures; i++) * slist = g_slist_prepend (slist, carray->closures[i]); * return slist; * } * return NULL; * } */static voidobject_remove_closure (gpointer data, GClosure *closure){ GObject *object = data; CArray *carray = g_object_get_qdata (object, quark_closure_array); guint i; for (i = 0; i < carray->n_closures; i++) if (carray->closures[i] == closure) { carray->n_closures--; if (i < carray->n_closures) carray->closures[i] = carray->closures[carray->n_closures]; return; } g_assert_not_reached ();}static voiddestroy_closure_array (gpointer data){ CArray *carray = data; GObject *object = carray->object; guint i, n = carray->n_closures; for (i = 0; i < n; i++) { GClosure *closure = carray->closures[i]; /* removing object_remove_closure() upfront is probably faster than * letting it fiddle with quark_closure_array which is empty anyways */ g_closure_remove_invalidate_notifier (closure, object, object_remove_closure); g_closure_invalidate (closure); } g_free (carray);}voidg_object_watch_closure (GObject *object, GClosure *closure){ CArray *carray; guint i; g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (closure != NULL); g_return_if_fail (closure->is_invalid == FALSE); g_return_if_fail (closure->in_marshal == FALSE); g_return_if_fail (object->ref_count > 0); /* this doesn't work on finalizing objects */ g_closure_add_invalidate_notifier (closure, object, object_remove_closure); g_closure_add_marshal_guards (closure, object, (GClosureNotify) g_object_ref, object, (GClosureNotify) g_object_unref); carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array); if (!carray) { carray = g_renew (CArray, NULL, 1); carray->object = object; carray->n_closures = 1; i = 0; } else { i = carray->n_closures++; carray = g_realloc (carray, sizeof (*carray) + sizeof (carray->closures[0]) * i); } carray->closures[i] = closure; g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array);}GClosure*g_closure_new_object (guint sizeof_closure, GObject *object){ GClosure *closure; g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ closure = g_closure_new_simple (sizeof_closure, object); g_object_watch_closure (object, closure); return closure;}GClosure*g_cclosure_new_object (GCallback callback_func, GObject *object){ GClosure *closure; g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ g_return_val_if_fail (callback_func != NULL, NULL); closure = g_cclosure_new (callback_func, object, NULL); g_object_watch_closure (object, closure); return closure;}GClosure*g_cclosure_new_object_swap (GCallback callback_func, GObject *object){ GClosure *closure; g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ g_return_val_if_fail (callback_func != NULL, NULL); closure = g_cclosure_new_swap (callback_func, object, NULL); g_object_watch_closure (object, closure); return closure;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -