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

📄 gobject.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 4 页
字号:
	  g_warning ("%s: %s", G_STRLOC, error);	  g_free (error);	  	  /* we purposely leak the value here, it might not be	   * in a sane state if an error condition occoured	   */	  break;	}            object_set_property (object, pspec, &value, nqueue);      g_value_unset (&value);            name = va_arg (var_args, gchar*);    }  g_object_notify_queue_thaw (object, nqueue);  g_object_unref (object);}voidg_object_get_valist (GObject	 *object,		     const gchar *first_property_name,		     va_list	  var_args){  const gchar *name;    g_return_if_fail (G_IS_OBJECT (object));    g_object_ref (object);    name = first_property_name;    while (name)    {      GValue value = { 0, };      GParamSpec *pspec;      gchar *error;            pspec = g_param_spec_pool_lookup (pspec_pool,					name,					G_OBJECT_TYPE (object),					TRUE);      if (!pspec)	{	  g_warning ("%s: object class `%s' has no property named `%s'",		     G_STRLOC,		     G_OBJECT_TYPE_NAME (object),		     name);	  break;	}      if (!(pspec->flags & G_PARAM_READABLE))	{	  g_warning ("%s: property `%s' of object class `%s' is not readable",		     G_STRLOC,		     pspec->name,		     G_OBJECT_TYPE_NAME (object));	  break;	}            g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));            object_get_property (object, pspec, &value);            G_VALUE_LCOPY (&value, var_args, 0, &error);      if (error)	{	  g_warning ("%s: %s", G_STRLOC, error);	  g_free (error);	  g_value_unset (&value);	  break;	}            g_value_unset (&value);            name = va_arg (var_args, gchar*);    }    g_object_unref (object);}voidg_object_set (gpointer     _object,	      const gchar *first_property_name,	      ...){  GObject *object = _object;  va_list var_args;    g_return_if_fail (G_IS_OBJECT (object));    va_start (var_args, first_property_name);  g_object_set_valist (object, first_property_name, var_args);  va_end (var_args);}voidg_object_get (gpointer     _object,	      const gchar *first_property_name,	      ...){  GObject *object = _object;  va_list var_args;    g_return_if_fail (G_IS_OBJECT (object));    va_start (var_args, first_property_name);  g_object_get_valist (object, first_property_name, var_args);  va_end (var_args);}voidg_object_set_property (GObject	    *object,		       const gchar  *property_name,		       const GValue *value){  GObjectNotifyQueue *nqueue;  GParamSpec *pspec;    g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (property_name != NULL);  g_return_if_fail (G_IS_VALUE (value));    g_object_ref (object);  nqueue = g_object_notify_queue_freeze (object, &property_notify_context);    pspec = g_param_spec_pool_lookup (pspec_pool,				    property_name,				    G_OBJECT_TYPE (object),				    TRUE);  if (!pspec)    g_warning ("%s: object class `%s' has no property named `%s'",	       G_STRLOC,	       G_OBJECT_TYPE_NAME (object),	       property_name);  else    object_set_property (object, pspec, value, nqueue);    g_object_notify_queue_thaw (object, nqueue);  g_object_unref (object);}voidg_object_get_property (GObject	   *object,		       const gchar *property_name,		       GValue	   *value){  GParamSpec *pspec;    g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (property_name != NULL);  g_return_if_fail (G_IS_VALUE (value));    g_object_ref (object);    pspec = g_param_spec_pool_lookup (pspec_pool,				    property_name,				    G_OBJECT_TYPE (object),				    TRUE);  if (!pspec)    g_warning ("%s: object class `%s' has no property named `%s'",	       G_STRLOC,	       G_OBJECT_TYPE_NAME (object),	       property_name);  else    {      GValue *prop_value, tmp_value = { 0, };            /* auto-conversion of the callers value type       */      if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))	{	  g_value_reset (value);	  prop_value = value;	}      else if (!g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))	{	  g_warning ("can't retrieve property `%s' of type `%s' as value of type `%s'",		     pspec->name,		     g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),		     G_VALUE_TYPE_NAME (value));	  g_object_unref (object);	  return;	}      else	{	  g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));	  prop_value = &tmp_value;	}      object_get_property (object, pspec, prop_value);      if (prop_value != value)	{	  g_value_transform (prop_value, value);	  g_value_unset (&tmp_value);	}    }    g_object_unref (object);}gpointerg_object_connect (gpointer     _object,		  const gchar *signal_spec,		  ...){  GObject *object = _object;  va_list var_args;  g_return_val_if_fail (G_IS_OBJECT (object), NULL);  g_return_val_if_fail (object->ref_count > 0, object);  va_start (var_args, signal_spec);  while (signal_spec)    {      GCallback callback = va_arg (var_args, GCallback);      gpointer data = va_arg (var_args, gpointer);      gulong sid;      if (strncmp (signal_spec, "signal::", 8) == 0)	sid = g_signal_connect_data (object, signal_spec + 8,				     callback, data, NULL,				     0);      else if (strncmp (signal_spec, "object_signal::", 15) == 0)	sid = g_signal_connect_object (object, signal_spec + 15,				       callback, data,				       0);      else if (strncmp (signal_spec, "swapped_signal::", 16) == 0)	sid = g_signal_connect_data (object, signal_spec + 16,				     callback, data, NULL,				     G_CONNECT_SWAPPED);      else if (strncmp (signal_spec, "swapped_object_signal::", 23) == 0)	sid = g_signal_connect_object (object, signal_spec + 23,				       callback, data,				       G_CONNECT_SWAPPED);      else if (strncmp (signal_spec, "signal_after::", 14) == 0)	sid = g_signal_connect_data (object, signal_spec + 14,				     callback, data, NULL,				     G_CONNECT_AFTER);      else if (strncmp (signal_spec, "object_signal_after::", 21) == 0)	sid = g_signal_connect_object (object, signal_spec + 21,				       callback, data,				       G_CONNECT_AFTER);      else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0)	sid = g_signal_connect_data (object, signal_spec + 22,				     callback, data, NULL,				     G_CONNECT_SWAPPED | G_CONNECT_AFTER);      else if (strncmp (signal_spec, "swapped_object_signal_after::", 29) == 0)	sid = g_signal_connect_object (object, signal_spec + 29,				       callback, data,				       G_CONNECT_SWAPPED | G_CONNECT_AFTER);      else	{	  g_warning ("%s: invalid signal spec \"%s\"", G_STRLOC, signal_spec);	  break;	}      signal_spec = va_arg (var_args, gchar*);    }  va_end (var_args);  return object;}voidg_object_disconnect (gpointer     _object,		     const gchar *signal_spec,		     ...){  GObject *object = _object;  va_list var_args;  g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (object->ref_count > 0);  va_start (var_args, signal_spec);  while (signal_spec)    {      GCallback callback = va_arg (var_args, GCallback);      gpointer data = va_arg (var_args, gpointer);      guint sid = 0, detail = 0, mask = 0;      if (strncmp (signal_spec, "any_signal::", 12) == 0)	{	  signal_spec += 12;	  mask = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;	}      else if (strcmp (signal_spec, "any_signal") == 0)	{	  signal_spec += 10;	  mask = G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA;	}      else	{	  g_warning ("%s: invalid signal spec \"%s\"", G_STRLOC, signal_spec);	  break;	}      if ((mask & G_SIGNAL_MATCH_ID) &&	  !g_signal_parse_name (signal_spec, G_OBJECT_TYPE (object), &sid, &detail, FALSE))	g_warning ("%s: invalid signal name \"%s\"", G_STRLOC, signal_spec);      else if (!g_signal_handlers_disconnect_matched (object, mask | (detail ? G_SIGNAL_MATCH_DETAIL : 0),						      sid, detail,						      NULL, (gpointer)callback, data))	g_warning (G_STRLOC ": signal handler %p(%p) is not connected", callback, data);      signal_spec = va_arg (var_args, gchar*);    }  va_end (var_args);}typedef struct {  GObject *object;  guint n_weak_refs;  struct {    GWeakNotify notify;    gpointer    data;  } weak_refs[1];  /* flexible array */} WeakRefStack;static voidweak_refs_notify (gpointer data){  WeakRefStack *wstack = data;  guint i;  for (i = 0; i < wstack->n_weak_refs; i++)    wstack->weak_refs[i].notify (wstack->weak_refs[i].data, wstack->object);  g_free (wstack);}voidg_object_weak_ref (GObject    *object,		   GWeakNotify notify,		   gpointer    data){  WeakRefStack *wstack;  guint i;    g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (notify != NULL);  g_return_if_fail (object->ref_count >= 1);  wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs);  if (wstack)    {      i = wstack->n_weak_refs++;      wstack = g_realloc (wstack, sizeof (*wstack) + sizeof (wstack->weak_refs[0]) * i);    }  else    {      wstack = g_renew (WeakRefStack, NULL, 1);      wstack->object = object;      wstack->n_weak_refs = 1;      i = 0;    }  wstack->weak_refs[i].notify = notify;  wstack->weak_refs[i].data = data;  g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify);}voidg_object_weak_unref (GObject    *object,		     GWeakNotify notify,		     gpointer    data){  WeakRefStack *wstack;  gboolean found_one = FALSE;  g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (notify != NULL);  wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs);  if (wstack)    {      guint i;      for (i = 0; i < wstack->n_weak_refs; i++)	if (wstack->weak_refs[i].notify == notify &&	    wstack->weak_refs[i].data == data)	  {	    found_one = TRUE;	    wstack->n_weak_refs -= 1;	    if (i != wstack->n_weak_refs)	      {		wstack->weak_refs[i].notify = wstack->weak_refs[wstack->n_weak_refs].notify;		wstack->weak_refs[i].data = wstack->weak_refs[wstack->n_weak_refs].data;	      }	    break;	  }    }  if (!found_one)    g_warning (G_STRLOC ": couldn't find weak ref %p(%p)", notify, data);}voidg_object_add_weak_pointer (GObject  *object,                            gpointer *weak_pointer_location){  g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (weak_pointer_location != NULL);  g_object_weak_ref (object,                      (GWeakNotify) g_nullify_pointer,                      weak_pointer_location);}voidg_object_remove_weak_pointer (GObject  *object,                               gpointer *weak_pointer_location){  g_return_if_fail (G_IS_OBJECT (object));  g_return_if_fail (weak_pointer_location != NULL);  g_object_weak_unref (object,                        (GWeakNotify) g_nullify_pointer,                        weak_pointer_location);}gpointerg_object_ref (gpointer _object){  GObject *object = _object;  g_return_val_if_fail (G_IS_OBJECT (object), NULL);  g_return_val_if_fail (object->ref_count > 0, NULL);  #ifdef  G_ENABLE_DEBUG  if (g_trap_object_ref == object)    G_BREAKPOINT ();#endif  /* G_ENABLE_DEBUG */  object->ref_count += 1;    return object;}void

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -