⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gobject.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -