@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.
+Sat Mar 31 23:55:58 2001 Tim Janik <timj@gtk.org>
+
+ * gtype.h:
+ * gparamspecs.[hc]: applied patch from owen to implement
+ GParamSpecUnichar.
+
+Fri Mar 30 07:34:02 2001 Tim Janik <timj@gtk.org>
+
+ * 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 <tml@iki.fi>
* gobject.def: Updates.
return value1->data[0].v_ulong > value2->data[0].v_ulong;
}
+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)
{
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 = {
return G_PARAM_SPEC (uspec);
}
+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,
#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))
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;
gulong maximum;
gulong default_value;
};
+struct _GParamSpecUnichar
+{
+ GParamSpec parent_instance;
+
+ gunichar default_value;
+};
struct _GParamSpecEnum
{
GParamSpec parent_instance;
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,
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
#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)
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));
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
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;
typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo;
typedef struct _GInterfaceInfo GInterfaceInfo;
typedef struct _GTypeValueTable GTypeValueTable;
+typedef struct _GTypeQuery GTypeQuery;
/* Basic Type Structures
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
gpointer data);
gpointer g_type_get_qdata (GType type,
GQuark quark);
+void g_type_query (GType type,
+ GTypeQuery *query);
/* --- type registration --- */
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;
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);
void
g_type_plugin_complete_interface_info (GTypePlugin *plugin,
- GType interface_type,
GType instance_type,
+ GType interface_type,
GInterfaceInfo *info)
{
GTypePluginClass *iface;
iface = G_TYPE_PLUGIN_GET_CLASS (plugin);
iface->complete_interface_info (plugin,
- interface_type,
instance_type,
+ interface_type,
info);
}