From 743f49cec9f4696c9eba32966d6ac78cd96c586d Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Sun, 1 Apr 2001 04:04:46 +0000 Subject: [PATCH] applied patch from owen to implement GParamSpecUnichar. Sat Mar 31 23:55:58 2001 Tim Janik * gtype.h: * gparamspecs.[hc]: applied patch from owen to implement GParamSpecUnichar. Fri Mar 30 07:34:02 2001 Tim Janik * gtype.c (type_iface_retrive_holder_info_Wm): * gtypeplugin.c (g_type_plugin_complete_interface_info): * gtypemodule.c (g_type_module_complete_interface_info): change order of instance_type and interface_type so they match the g_type_add_interface_*() API. * gsignal.c (g_signal_emit_valist): always assign C return value location, people depending on unaltered return values after emissions that had no handlers to run need to use g_signal_emitv(). * gtype.[hc] (g_type_query): new function to allow querying of class and object size (semantics like g_signal_query()). currently the implementation is better held conservative so as to only support types that are classed and static. --- docs/reference/gobject/tmpl/types.sgml | 1 + gobject/ChangeLog | 23 ++++++++++ gobject/gparamspecs.c | 83 +++++++++++++++++++++++++++++++++- gobject/gparamspecs.h | 14 ++++++ gobject/gsignal.c | 10 ++-- gobject/gtype.c | 31 ++++++++++++- gobject/gtype.h | 33 +++++++++----- gobject/gtypemodule.c | 4 +- gobject/gtypeplugin.c | 4 +- 9 files changed, 179 insertions(+), 24 deletions(-) diff --git a/docs/reference/gobject/tmpl/types.sgml b/docs/reference/gobject/tmpl/types.sgml index 2eab8c3..67d845e 100644 --- a/docs/reference/gobject/tmpl/types.sgml +++ b/docs/reference/gobject/tmpl/types.sgml @@ -211,6 +211,7 @@ The predefined identifiers of the reserved fundamental types. @G_TYPE_PARAM_UINT: Identifier for the "#GParamSpecUInt" type. @G_TYPE_PARAM_LONG: Identifier for the "#GParamSpecLong" type. @G_TYPE_PARAM_ULONG: Identifier for the "#GParamSpecULong" type. +@G_TYPE_PARAM_UNICHAR: @G_TYPE_PARAM_ENUM: Identifier for the "#GParamSpecEnum" type. @G_TYPE_PARAM_FLAGS: Identifier for the "#GParamSpecFlags" type. @G_TYPE_PARAM_FLOAT: Identifier for the "#GParamSpecFloat" type. diff --git a/gobject/ChangeLog b/gobject/ChangeLog index dd31d14..7b2b7f5 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,26 @@ +Sat Mar 31 23:55:58 2001 Tim Janik + + * gtype.h: + * gparamspecs.[hc]: applied patch from owen to implement + GParamSpecUnichar. + +Fri Mar 30 07:34:02 2001 Tim Janik + + * gtype.c (type_iface_retrive_holder_info_Wm): + * gtypeplugin.c (g_type_plugin_complete_interface_info): + * gtypemodule.c (g_type_module_complete_interface_info): + change order of instance_type and interface_type so they match + the g_type_add_interface_*() API. + + * gsignal.c (g_signal_emit_valist): always assign C return value + location, people depending on unaltered return values after emissions + that had no handlers to run need to use g_signal_emitv(). + + * gtype.[hc] (g_type_query): new function to allow querying of + class and object size (semantics like g_signal_query()). + currently the implementation is better held conservative so as to + only support types that are classed and static. + 2001-03-29 Tor Lillqvist * gobject.def: Updates. diff --git a/gobject/gparamspecs.c b/gobject/gparamspecs.c index 5d61cf3..cc44728 100644 --- a/gobject/gparamspecs.c +++ b/gobject/gparamspecs.c @@ -279,6 +279,48 @@ param_ulong_values_cmp (GParamSpec *pspec, } static void +param_unichar_init (GParamSpec *pspec) +{ + GParamSpecUnichar *uspec = G_PARAM_SPEC_UNICHAR (pspec); + + uspec->default_value = 0; +} + +static void +param_unichar_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_uint = G_PARAM_SPEC_UNICHAR (pspec)->default_value; +} + +static gboolean +param_unichar_validate (GParamSpec *pspec, + GValue *value) +{ + gunichar oval = value->data[0].v_uint; + gboolean changed = FALSE; + + if (!g_unichar_validate (oval)) + { + value->data[0].v_uint = 0; + changed = TRUE; + } + + return changed; +} + +static gint +param_unichar_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_uint < value2->data[0].v_uint) + return -1; + else + return value1->data[0].v_uint > value2->data[0].v_uint; +} + +static void param_enum_init (GParamSpec *pspec) { GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec); @@ -999,8 +1041,25 @@ g_param_spec_types_init (void) /* sync with gtype.c */ type = g_param_type_register_static ("GParamULong", &pspec_info); g_assert (type == G_TYPE_PARAM_ULONG); } - - /* G_TYPE_PARAM_ENUM + + /* G_TYPE_PARAM_UNICHAR + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecUnichar), /* instance_size */ + 16, /* n_preallocs */ + param_unichar_init, /* instance_init */ + G_TYPE_UINT, /* value_type */ + NULL, /* finalize */ + param_unichar_set_default, /* value_set_default */ + param_unichar_validate, /* value_validate */ + param_unichar_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static ("GParamUnichar", &pspec_info); + g_assert (type == G_TYPE_PARAM_UNICHAR); + } + + /* G_TYPE_PARAM_ENUM */ { static const GParamSpecTypeInfo pspec_info = { @@ -1369,6 +1428,26 @@ g_param_spec_ulong (const gchar *name, } GParamSpec* +g_param_spec_unichar (const gchar *name, + const gchar *nick, + const gchar *blurb, + gunichar default_value, + GParamFlags flags) +{ + GParamSpecUnichar *uspec; + + uspec = g_param_spec_internal (G_TYPE_PARAM_UNICHAR, + name, + nick, + blurb, + flags); + + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +GParamSpec* g_param_spec_enum (const gchar *name, const gchar *nick, const gchar *blurb, diff --git a/gobject/gparamspecs.h b/gobject/gparamspecs.h index c4fffd3..3829d6c 100644 --- a/gobject/gparamspecs.h +++ b/gobject/gparamspecs.h @@ -43,6 +43,8 @@ G_BEGIN_DECLS #define G_IS_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG)) #define G_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong)) #define G_IS_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG)) +#define G_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar)) +#define G_IS_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR)) #define G_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong)) #define G_IS_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM)) #define G_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum)) @@ -76,6 +78,7 @@ typedef struct _GParamSpecInt GParamSpecInt; typedef struct _GParamSpecUInt GParamSpecUInt; typedef struct _GParamSpecLong GParamSpecLong; typedef struct _GParamSpecULong GParamSpecULong; +typedef struct _GParamSpecUnichar GParamSpecUnichar; typedef struct _GParamSpecEnum GParamSpecEnum; typedef struct _GParamSpecFlags GParamSpecFlags; typedef struct _GParamSpecFloat GParamSpecFloat; @@ -141,6 +144,12 @@ struct _GParamSpecULong gulong maximum; gulong default_value; }; +struct _GParamSpecUnichar +{ + GParamSpec parent_instance; + + gunichar default_value; +}; struct _GParamSpecEnum { GParamSpec parent_instance; @@ -260,6 +269,11 @@ GParamSpec* g_param_spec_ulong (const gchar *name, gulong maximum, gulong default_value, GParamFlags flags); +GParamSpec* g_param_spec_unichar (const gchar *name, + const gchar *nick, + const gchar *blurb, + gunichar default_value, + GParamFlags flags); GParamSpec* g_param_spec_enum (const gchar *name, const gchar *nick, const gchar *blurb, diff --git a/gobject/gsignal.c b/gobject/gsignal.c index c78563d..6043210 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -1783,11 +1783,11 @@ g_signal_emit_valist (gpointer instance, gchar *error = NULL; g_value_init (&return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE); - if (signal_emit_R (node, detail, instance, &return_value, instance_and_params)) - G_VALUE_LCOPY (&return_value, - var_args, - node->return_type & G_SIGNAL_TYPE_STATIC_SCOPE ? G_VALUE_NOCOPY_CONTENTS : 0, - &error); + signal_emit_R (node, detail, instance, &return_value, instance_and_params); + G_VALUE_LCOPY (&return_value, + var_args, + node->return_type & G_SIGNAL_TYPE_STATIC_SCOPE ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); if (!error) g_value_unset (&return_value); else diff --git a/gobject/gtype.c b/gobject/gtype.c index 3a181f0..8753059 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -162,7 +162,7 @@ struct _TypeNode #define MAX_N_PREREQUISITES (MAX_N_IFACES) #define NODE_TYPE(node) (node->supers[0]) #define NODE_PARENT_TYPE(node) (node->supers[1]) -#define NODE_NAME(node) ((gchar*)g_quark_to_string (node->qname)) +#define NODE_NAME(node) (g_quark_to_string (node->qname)) #define NODE_IS_IFACE(node) (G_TYPE_IS_INTERFACE (NODE_TYPE (node))) #define CLASSED_NODE_N_IFACES(node) ((node)->_prot_n_ifaces_prerequisites) #define CLASSED_NODE_IFACES_ENTRIES(node) ((node)->_prot.iface_entries) @@ -1225,7 +1225,7 @@ type_iface_retrive_holder_info_Wm (TypeNode *iface, G_WRITE_UNLOCK (&type_rw_lock); g_type_plugin_use (iholder->plugin); - g_type_plugin_complete_interface_info (iholder->plugin, NODE_TYPE (iface), instance_type, &tmp_info); + g_type_plugin_complete_interface_info (iholder->plugin, instance_type, NODE_TYPE (iface), &tmp_info); G_WRITE_LOCK (&type_rw_lock); if (iholder->info) INVALID_RECURSION ("g_type_plugin_*", iholder->plugin, NODE_NAME (iface)); @@ -2354,6 +2354,33 @@ type_add_flags_W (TypeNode *node, type_set_qdata_W (node, static_quark_type_flags, GUINT_TO_POINTER (dflags)); } +void +g_type_query (GType type, + GTypeQuery *query) +{ + TypeNode *node; + + g_return_if_fail (query != NULL); + + G_READ_LOCK (&type_rw_lock); + node = lookup_type_node_L (type); + if (node && node->is_classed && !node->plugin && node->data) + { + /* type is classed and static, probably even instantiatable */ + + query->type = NODE_TYPE (node); + query->type_name = NODE_NAME (node); + query->class_size = node->data->class.class_size; + query->instance_size = node->is_instantiatable ? node->data->instance.instance_size : 0; + } + else + { + /* node is not static and classed, won't allow query */ + query->type = 0; + } + G_READ_UNLOCK (&type_rw_lock); +} + /* --- implementation details --- */ gboolean diff --git a/gobject/gtype.h b/gobject/gtype.h index 9776edf..2c9ed2d 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -79,17 +79,18 @@ typedef enum /*< skip >*/ G_TYPE_PARAM_UINT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 5), G_TYPE_PARAM_LONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 6), G_TYPE_PARAM_ULONG = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 7), - G_TYPE_PARAM_ENUM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8), - G_TYPE_PARAM_FLAGS = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9), - G_TYPE_PARAM_FLOAT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10), - G_TYPE_PARAM_DOUBLE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11), - G_TYPE_PARAM_STRING = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12), - G_TYPE_PARAM_PARAM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13), - G_TYPE_PARAM_BOXED = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14), - G_TYPE_PARAM_POINTER = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15), - G_TYPE_PARAM_VALUE_ARRAY = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16), - G_TYPE_PARAM_CLOSURE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17), - G_TYPE_PARAM_OBJECT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18) + G_TYPE_PARAM_UNICHAR = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8), + G_TYPE_PARAM_ENUM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9), + G_TYPE_PARAM_FLAGS = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10), + G_TYPE_PARAM_FLOAT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11), + G_TYPE_PARAM_DOUBLE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12), + G_TYPE_PARAM_STRING = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13), + G_TYPE_PARAM_PARAM = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14), + G_TYPE_PARAM_BOXED = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15), + G_TYPE_PARAM_POINTER = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16), + G_TYPE_PARAM_VALUE_ARRAY = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17), + G_TYPE_PARAM_CLOSURE = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18), + G_TYPE_PARAM_OBJECT = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 19) } GTypeFundamentals; @@ -122,6 +123,7 @@ typedef struct _GTypeInfo GTypeInfo; typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo; typedef struct _GInterfaceInfo GInterfaceInfo; typedef struct _GTypeValueTable GTypeValueTable; +typedef struct _GTypeQuery GTypeQuery; /* Basic Type Structures @@ -142,6 +144,13 @@ struct _GTypeInterface GType g_type; /* iface type */ GType g_instance_type; }; +struct _GTypeQuery +{ + GType type; + const gchar *type_name; + guint class_size; + guint instance_size; +}; /* Casts, checks and accessors for structured types @@ -202,6 +211,8 @@ void g_type_set_qdata (GType type, gpointer data); gpointer g_type_get_qdata (GType type, GQuark quark); +void g_type_query (GType type, + GTypeQuery *query); /* --- type registration --- */ diff --git a/gobject/gtypemodule.c b/gobject/gtypemodule.c index 858af80..7dd53a5 100644 --- a/gobject/gtypemodule.c +++ b/gobject/gtypemodule.c @@ -47,8 +47,8 @@ static void g_type_module_complete_type_info (GTypePlugin *plugin, GTypeInfo *info, GTypeValueTable *value_table); static void g_type_module_complete_interface_info (GTypePlugin *plugin, + GType instance_type, GType interface_type, - GType instance_info, GInterfaceInfo *info); static GObjectClass *parent_class; @@ -293,8 +293,8 @@ g_type_module_complete_type_info (GTypePlugin *plugin, static void g_type_module_complete_interface_info (GTypePlugin *plugin, - GType interface_type, GType instance_type, + GType interface_type, GInterfaceInfo *info) { GTypeModule *module = G_TYPE_MODULE (plugin); diff --git a/gobject/gtypeplugin.c b/gobject/gtypeplugin.c index 51da5d8..5c4fcc0 100644 --- a/gobject/gtypeplugin.c +++ b/gobject/gtypeplugin.c @@ -83,8 +83,8 @@ g_type_plugin_complete_type_info (GTypePlugin *plugin, void g_type_plugin_complete_interface_info (GTypePlugin *plugin, - GType interface_type, GType instance_type, + GType interface_type, GInterfaceInfo *info) { GTypePluginClass *iface; @@ -94,7 +94,7 @@ g_type_plugin_complete_interface_info (GTypePlugin *plugin, iface = G_TYPE_PLUGIN_GET_CLASS (plugin); iface->complete_interface_info (plugin, - interface_type, instance_type, + interface_type, info); } -- 2.7.4