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

📄 gtktypeutils.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
      if (node)	{	  GtkTypeNode *a_node;	  	  LOOKUP_TYPE_NODE (a_node, is_a_type);	  if (a_node)	    {	      if (a_node->n_supers <= node->n_supers)		return node->supers[node->n_supers - a_node->n_supers] == is_a_type;	    }	}    }    return FALSE;}static voidgtk_type_class_init (GtkType type){  GtkTypeNode *node;  /* we need to relookup nodes everytime we called an external function */  LOOKUP_TYPE_NODE (node, type);    if (!node->klass && node->type_info.class_size)    {      GtkTypeClass *type_class;      GtkTypeNode *base_node;      GSList *slist;            if (node->type_info.class_size < sizeof (GtkTypeClass))	g_warning ("The `%s' class is too small to inherit from GtkTypeClass",		   node->type_info.type_name);            node->klass = g_malloc0 (node->type_info.class_size);            if (node->parent_type)	{	  GtkTypeNode *parent;	  	  LOOKUP_TYPE_NODE (parent, node->parent_type);	  	  if (node->type_info.class_size < parent->type_info.class_size)	    g_warning ("The `%s' class is smaller than its parent class `%s'",		       node->type_info.type_name,		       parent->type_info.type_name);	  	  if (!parent->klass)	    {	      gtk_type_class_init (parent->type);	      LOOKUP_TYPE_NODE (node, type);	      LOOKUP_TYPE_NODE (parent, node->parent_type);	    }	  	  if (parent->klass)	    memcpy (node->klass, parent->klass, parent->type_info.class_size);	}            type_class = node->klass;      type_class->type = node->type;            /* stack all base class initialization functions, so we       * call them in ascending order.       */      base_node = node;      slist = NULL;      while (base_node)	{	  if (base_node->type_info.base_class_init_func)	    slist = g_slist_prepend (slist, base_node->type_info.base_class_init_func);	  LOOKUP_TYPE_NODE (base_node, base_node->parent_type);	}      if (slist)	{	  GSList *walk;	  	  for (walk = slist; walk; walk = walk->next)	    {	      GtkClassInitFunc base_class_init;	      	      base_class_init = walk->data;	      base_class_init (node->klass);	      LOOKUP_TYPE_NODE (node, type);	    }	  g_slist_free (slist);	}            if (node->type_info.class_init_func)	node->type_info.class_init_func (node->klass);    }}static inline gchar*gtk_type_descriptive_name (GtkType type){  gchar *name;  name = gtk_type_name (type);  if (!name)    name = "(unknown)";  return name;}GtkTypeObject*gtk_type_check_object_cast (GtkTypeObject  *type_object,			    GtkType         cast_type){  if (!type_object)    {      g_warning ("invalid cast from (NULL) pointer to `%s'",		 gtk_type_descriptive_name (cast_type));      return type_object;    }  if (!type_object->klass)    {      g_warning ("invalid unclassed pointer in cast to `%s'",		 gtk_type_descriptive_name (cast_type));      return type_object;    }  /* currently, GTK_TYPE_OBJECT is the lowest fundamental type   * dominator for types that introduce classes.   */  if (type_object->klass->type < GTK_TYPE_OBJECT)    {      g_warning ("invalid class type `%s' in cast to `%s'",		 gtk_type_descriptive_name (type_object->klass->type),		 gtk_type_descriptive_name (cast_type));      return type_object;    }  if (!gtk_type_is_a (type_object->klass->type, cast_type))    {      g_warning ("invalid cast from `%s' to `%s'",		 gtk_type_descriptive_name (type_object->klass->type),		 gtk_type_descriptive_name (cast_type));      return type_object;    }  return type_object;}GtkTypeClass*gtk_type_check_class_cast (GtkTypeClass   *klass,			   GtkType         cast_type){  if (!klass)    {      g_warning ("invalid class cast from (NULL) pointer to `%s'",		 gtk_type_descriptive_name (cast_type));      return klass;    }  /* currently, GTK_TYPE_OBJECT is the lowest fundamental type   * dominator for types that introduce classes.   */  if (klass->type < GTK_TYPE_OBJECT)    {      g_warning ("invalid class type `%s' in class cast to `%s'",		 gtk_type_descriptive_name (klass->type),		 gtk_type_descriptive_name (cast_type));      return klass;    }  if (!gtk_type_is_a (klass->type, cast_type))    {      g_warning ("invalid class cast from `%s' to `%s'",		 gtk_type_descriptive_name (klass->type),		 gtk_type_descriptive_name (cast_type));      return klass;    }  return klass;}GtkEnumValue*gtk_type_enum_get_values (GtkType      enum_type){  if (GTK_FUNDAMENTAL_TYPE (enum_type) == GTK_TYPE_ENUM ||      GTK_FUNDAMENTAL_TYPE (enum_type) == GTK_TYPE_FLAGS)    {      GtkTypeNode *node;            LOOKUP_TYPE_NODE (node, enum_type);      if (node)	return (GtkEnumValue*) node->type_info.reserved_1;    }    g_warning ("gtk_type_enum_get_values(): type `%s' is not derived from `GtkEnum' or `GtkFlags'",	     gtk_type_name (enum_type));    return NULL;}GtkFlagValue*gtk_type_flags_get_values (GtkType	  flags_type){  return gtk_type_enum_get_values (flags_type);}GtkEnumValue*gtk_type_enum_find_value (GtkType        enum_type,			  const gchar    *value_name){  g_return_val_if_fail (value_name != NULL, NULL);    if (GTK_FUNDAMENTAL_TYPE (enum_type) == GTK_TYPE_ENUM ||      GTK_FUNDAMENTAL_TYPE (enum_type) == GTK_TYPE_FLAGS)    {      GtkEnumValue *vals;      vals = gtk_type_enum_get_values (enum_type);      if (vals)	while (vals->value_name)	  {	    if (strcmp (vals->value_name, value_name) == 0 ||		strcmp (vals->value_nick, value_name) == 0)	      return vals;	    vals++;	  }    }  else    g_warning ("gtk_type_enum_find_value(): type `%s' is not derived from `GtkEnum' or `GtkFlags'",	       gtk_type_name (enum_type));    return NULL;}GtkFlagValue*gtk_type_flags_find_value (GtkType         flag_type,			   const gchar    *value_name){  g_return_val_if_fail (value_name != NULL, NULL);  return gtk_type_enum_find_value (flag_type, value_name);}typedef struct _GtkTypeVarargType GtkTypeVarargType;struct _GtkTypeVarargType{  GtkType foreign_type;  GtkType varargs_type;};static GtkTypeVarargType *vararg_types = NULL;static guint              n_vararg_types = 0;voidgtk_type_set_varargs_type (GtkType        foreign_type,			   GtkType        varargs_type){  g_return_if_fail (foreign_type == GTK_FUNDAMENTAL_TYPE (foreign_type));  g_return_if_fail (foreign_type > GTK_TYPE_FUNDAMENTAL_LAST);  if (!((varargs_type >= GTK_TYPE_STRUCTURED_FIRST &&	 varargs_type <= GTK_TYPE_STRUCTURED_LAST) ||	(varargs_type >= GTK_TYPE_FLAT_FIRST &&	 varargs_type <= GTK_TYPE_FLAT_LAST) ||	varargs_type == GTK_TYPE_NONE))    {      g_warning ("invalid varargs type `%s' for fundamental type `%s'",		 gtk_type_name (varargs_type),		 gtk_type_name (foreign_type));      return;    }  if (gtk_type_get_varargs_type (foreign_type))    {      g_warning ("varargs type is already registered for fundamental type `%s'",		 gtk_type_name (foreign_type));      return;    }  n_vararg_types++;  vararg_types = g_realloc (vararg_types, sizeof (GtkTypeVarargType) * n_vararg_types);  vararg_types[n_vararg_types - 1].foreign_type = foreign_type;  vararg_types[n_vararg_types - 1].varargs_type = varargs_type;}GtkTypegtk_type_get_varargs_type (GtkType foreign_type){  GtkType type;  guint i;  type = GTK_FUNDAMENTAL_TYPE (foreign_type);  if (type <= GTK_TYPE_FUNDAMENTAL_LAST)    return type;  for (i = 0; i < n_vararg_types; i++)    if (vararg_types[i].foreign_type == type)      return vararg_types[i].varargs_type;  return 0;}static inline GtkTypegtk_type_register_intern (gchar	             *name,			  GtkType  	      parent,			  const GtkEnumValue *values){  GtkType type_id;  GtkTypeInfo info;    info.type_name = name;  info.object_size = 0;  info.class_size = 0;  info.class_init_func = NULL;  info.object_init_func = NULL;  info.reserved_1 = (gpointer) values;  info.reserved_2 = NULL;    /* relookup pointers afterwards.   */  type_id = gtk_type_create (parent, name, &info);    if (type_id && values)    {      guint i;            /* check for proper type consistency and NULL termination       * of value array       */      g_assert (GTK_FUNDAMENTAL_TYPE (type_id) == GTK_TYPE_ENUM ||		GTK_FUNDAMENTAL_TYPE (type_id) == GTK_TYPE_FLAGS);            i = 0;      while (values[i].value_name)	i++;            g_assert (values[i].value_name == NULL && values[i].value_nick == NULL);    }    return type_id;}GtkTypegtk_type_register_enum (const gchar    *type_name,			GtkEnumValue   *values){  GtkType type_id;  gchar *name;    g_return_val_if_fail (type_name != NULL, 0);    name = g_strdup (type_name);    /* relookup pointers afterwards.   */  type_id = gtk_type_register_intern (name, GTK_TYPE_ENUM, values);    if (!type_id)    g_free (name);    return type_id;}GtkTypegtk_type_register_flags (const gchar	*type_name,			 GtkFlagValue	*values){  GtkType type_id;  gchar *name;    g_return_val_if_fail (type_name != NULL, 0);    name = g_strdup (type_name);    /* relookup pointers afterwards.   */  type_id = gtk_type_register_intern (name, GTK_TYPE_FLAGS, values);    if (!type_id)    g_free (name);    return type_id;}GtkTypeQuery*gtk_type_query (GtkType type){  GtkTypeNode *node;    LOOKUP_TYPE_NODE (node, type);  if (node)    {      GtkTypeQuery *query;      query = g_new0 (GtkTypeQuery, 1);      query->type = type;      query->type_name = node->type_info.type_name;      query->object_size = node->type_info.object_size;      query->class_size = node->type_info.class_size;      return query;    }    return NULL;}static guintgtk_type_name_hash (const char *key){  guint result;    result = 0;  while (*key)    result += (result << 3) + *key++;    return result;}static gintgtk_type_name_compare (const char *a,		       const char *b){  return (strcmp (a, b) == 0);}extern void gtk_object_init_type (void);#include "makeenums.h"			/* include for various places					 * with enum definitions					 */#include "gtktypebuiltins_vars.c"	/* type variable declarations					 */#include "gtktypebuiltins_evals.c"	/* enum value definition arrays					 */static voidgtk_type_init_builtin_types (void){  /* GTK_TYPE_INVALID has typeid 0.  The first type id returned by   * gtk_type_unique is 1, which is GTK_TYPE_NONE.  And so on.   */    static const struct {    GtkType type_id;    gchar *name;  } fundamental_info[] = {    { GTK_TYPE_NONE,		"void" },    { GTK_TYPE_CHAR,		"gchar" },    { GTK_TYPE_UCHAR,		"guchar" },    { GTK_TYPE_BOOL,		"gboolean" },    { GTK_TYPE_INT,		"gint" },    { GTK_TYPE_UINT,		"guint" },    { GTK_TYPE_LONG,		"glong" },    { GTK_TYPE_ULONG,		"gulong" },    { GTK_TYPE_FLOAT,		"gfloat" },    { GTK_TYPE_DOUBLE,		"gdouble" },    { GTK_TYPE_STRING,		"GtkString" },    { GTK_TYPE_ENUM,		"GtkEnum" },    { GTK_TYPE_FLAGS,		"GtkFlags" },    { GTK_TYPE_BOXED,		"GtkBoxed" },    { GTK_TYPE_POINTER,		"gpointer" },        { GTK_TYPE_SIGNAL,		"GtkSignal" },    { GTK_TYPE_ARGS,		"GtkArgs" },    { GTK_TYPE_CALLBACK,	"GtkCallback" },    { GTK_TYPE_C_CALLBACK,	"GtkCCallback" },    { GTK_TYPE_FOREIGN,		"GtkForeign" },  };  static struct {    gchar *type_name;    GtkType *type_id;    GtkType parent;    const GtkEnumValue *values;  } builtin_info[GTK_TYPE_NUM_BUILTINS + 1] = {#include "gtktypebuiltins_ids.c"	/* type entries */    { NULL }  };  guint i;    for (i = 0; i < sizeof (fundamental_info) / sizeof (fundamental_info[0]); i++)    {      GtkType type_id;            /* relookup pointers afterwards.       */      type_id = gtk_type_register_intern (fundamental_info[i].name, 0, NULL);            g_assert (type_id == fundamental_info[i].type_id);    }    gtk_object_init_type ();    for (i = 0; i < GTK_TYPE_NUM_BUILTINS; i++)    {      GtkType type_id;            g_assert (builtin_info[i].type_name != NULL);            /* relookup pointers afterwards.       */      type_id = gtk_type_register_intern (builtin_info[i].type_name,					  builtin_info[i].parent,					  builtin_info[i].values);            g_assert (GTK_TYPE_SEQNO (type_id) > GTK_TYPE_FUNDAMENTAL_MAX);            (*builtin_info[i].type_id) = type_id;    }}GtkTypegtk_identifier_get_type (void){  static GtkType identifier_type = 0;    if (!identifier_type)    identifier_type = gtk_type_register_intern ("GtkIdentifier", GTK_TYPE_STRING, NULL);    return identifier_type;}

⌨️ 快捷键说明

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