diff options
author | Tim Janik <timj@src.gnome.org> | 1998-01-16 00:49:51 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-01-16 00:49:51 +0000 |
commit | dd77b5db5a14ff3707a65e1ae3326b9a013ac9b5 (patch) | |
tree | aa2c09fe62e8dbde0b16c33bceb7cc64ebad7c03 /gtk/gtkobject.c | |
parent | 18681dc653519b6ac515e48752e7c70dba80c81c (diff) | |
download | gtk+-dd77b5db5a14ff3707a65e1ae3326b9a013ac9b5.tar.gz |
main part for GtkArgSetFunc/GtkArgGetFunc implementation.
-timj
Diffstat (limited to 'gtk/gtkobject.c')
-rw-r--r-- | gtk/gtkobject.c | 112 |
1 files changed, 80 insertions, 32 deletions
diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c index 38257b9b4a..d61a73ede7 100644 --- a/gtk/gtkobject.c +++ b/gtk/gtkobject.c @@ -28,6 +28,11 @@ enum { DESTROY, LAST_SIGNAL }; +enum { + ARG_0, + ARG_USER_DATA, + ARG_SIGNAL +}; typedef struct _GtkObjectData GtkObjectData; @@ -44,13 +49,16 @@ struct _GtkArgInfo { char *name; GtkType type; + GtkType class_type; + guint arg_id; }; static void gtk_object_class_init (GtkObjectClass *klass); static void gtk_object_init (GtkObject *object); -static void gtk_object_arg (GtkObject *object, - GtkArg *arg); +static void gtk_object_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); static void gtk_real_object_destroy (GtkObject *object); static void gtk_object_data_init (void); static GtkObjectData* gtk_object_data_new (void); @@ -95,7 +103,8 @@ gtk_object_init_type () sizeof (GtkObjectClass), (GtkClassInitFunc) gtk_object_class_init, (GtkObjectInitFunc) gtk_object_init, - (GtkArgFunc) gtk_object_arg, + gtk_object_set_arg, + NULL, }; object_type = gtk_type_unique (0, &object_info); @@ -122,8 +131,8 @@ gtk_object_class_init (GtkObjectClass *class) class->signals = NULL; class->nsignals = 0; - gtk_object_add_arg_type ("GtkObject::user_data", GTK_TYPE_POINTER); - gtk_object_add_arg_type ("GtkObject::signal", GTK_TYPE_SIGNAL); + gtk_object_add_arg_type ("GtkObject::user_data", GTK_TYPE_POINTER, ARG_USER_DATA); + gtk_object_add_arg_type ("GtkObject::signal", GTK_TYPE_SIGNAL, ARG_SIGNAL); object_signals[DESTROY] = gtk_signal_new ("destroy", @@ -163,24 +172,27 @@ gtk_object_init (GtkObject *object) *****************************************/ static void -gtk_object_arg (GtkObject *object, - GtkArg *arg) +gtk_object_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id) { - if (strcmp (arg->name, "user_data") == 0) + switch (arg_id) { + case ARG_USER_DATA: gtk_object_set_user_data (object, GTK_VALUE_POINTER (*arg)); - } - else if (strncmp (arg->name, "signal", 6) == 0) - { - if ((arg->name[6] != ':') || (arg->name[7] != ':')) + break; + case ARG_SIGNAL: + if ((arg->name[11 + 6] != ':') || (arg->name[11 + 7] != ':')) { g_print ("invalid signal argument: \"%s\"\n", arg->name); return; } - - gtk_signal_connect (object, arg->name + 8, + gtk_signal_connect (object, arg->name + 11 + 8, (GtkSignalFunc) GTK_VALUE_SIGNAL (*arg).f, GTK_VALUE_SIGNAL (*arg).d); + break; + default: + g_assert_not_reached (); } } @@ -344,29 +356,40 @@ gtk_object_setv (GtkObject *obj, gint nargs, GtkArg *args) { - guint class_type; - char class_name[1024]; - char *arg_name; int i; g_return_if_fail (obj != NULL); + if (!arg_info_ht) + return; + for (i = 0; i < nargs; i++) { - arg_name = strchr (args[i].name, ':'); - if (!arg_name || (arg_name[0] != ':') || (arg_name[1] != ':')) + GtkArgInfo *info; + gchar *lookup_name; + gchar *d; + + lookup_name = g_strdup (args[i].name); + d = strchr (lookup_name, ':'); + if (d && d[1] == ':') { - g_print ("invalid arg name: \"%s\"\n", args[i].name); - continue; - } + d = strchr (d + 2, ':'); + if (d) + *d = 0; - strncpy (class_name, args[i].name, (long) (arg_name - args[i].name)); - class_name[(long) (arg_name - args[i].name)] = '\0'; + info = g_hash_table_lookup (arg_info_ht, lookup_name); + } + else + info = NULL; - args[i].name = arg_name + 2; + if (!info) + { + g_warning ("invalid arg name: \"%s\"\n", lookup_name); + continue; + } + g_free (lookup_name); - class_type = gtk_type_from_name (class_name); - gtk_type_set_arg (obj, class_type, &args[i]); + gtk_type_set_arg (obj, info->class_type, &args[i], info->arg_id); } } @@ -380,13 +403,38 @@ gtk_object_setv (GtkObject *obj, void gtk_object_add_arg_type (const char *arg_name, - GtkType arg_type) + GtkType arg_type, + guint arg_id) { GtkArgInfo *info; + gchar class_part[1024]; + gchar *arg_part; + GtkType class_type; + + g_return_if_fail (arg_id > 0); + + arg_part = strchr (arg_name, ':'); + if (!arg_part || (arg_part[0] != ':') || (arg_part[1] != ':')) + { + g_warning ("invalid arg name: \"%s\"\n", arg_name); + return; + } + + strncpy (class_part, arg_name, (glong) (arg_part - arg_name)); + class_part[(glong) (arg_part - arg_name)] = '\0'; + + class_type = gtk_type_from_name (class_part); + if (!class_type) + { + g_warning ("invalid class name in arg: \"%s\"\n", arg_name); + return; + } info = g_new (GtkArgInfo, 1); - info->name = g_strdup(arg_name); + info->name = g_strdup (arg_name); info->type = arg_type; + info->class_type = class_type; + info->arg_id = arg_id; if (!arg_info_ht) arg_info_ht = g_hash_table_new (g_string_hash, g_string_equal); @@ -415,7 +463,7 @@ gtk_object_get_arg_type (const char *arg_name) t = strchr (arg_name, ':'); if (!t || (t[0] != ':') || (t[1] != ':')) { - g_print ("invalid arg name: \"%s\"\n", arg_name); + g_warning ("invalid arg name: \"%s\"\n", arg_name); return GTK_TYPE_INVALID; } @@ -801,7 +849,7 @@ gtk_object_data_id_alloc () } /***************************************** - * gtk_object_data_id_alloc: + * gtk_object_collect_args: * * arguments: * @@ -836,7 +884,7 @@ gtk_object_collect_args (gint *nargs, switch (GTK_FUNDAMENTAL_TYPE (type)) { case GTK_TYPE_INVALID: - g_print ("invalid arg name: \"%s\" %x\n", name, type); + g_warning ("invalid arg name: \"%s\" %x\n", name, type); (void) va_arg (args1, long); continue; case GTK_TYPE_NONE: |