1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include "gtksignal.h"
26 #define GTK_RUN_TYPE(x) ((x) & GTK_RUN_MASK)
29 typedef struct _GtkSignal GtkSignal;
30 typedef struct _GtkSignalInfo GtkSignalInfo;
31 typedef struct _GtkHandler GtkHandler;
32 typedef struct _GtkHandlerInfo GtkHandlerInfo;
33 typedef struct _GtkEmission GtkEmission;
35 typedef void (*GtkSignalMarshaller0) (GtkObject *object,
49 GtkSignalRunType run_type;
50 GtkSignalMarshaller marshaller;
59 guint signal_type : 13;
60 guint object_signal : 1;
66 GtkSignalDestroy destroy_func;
70 struct _GtkHandlerInfo
73 GtkSignalMarshaller marshaller;
77 GtkSignalRunType run_type;
89 static void gtk_signal_init (void);
90 static guint gtk_signal_hash (gint *key);
91 static gint gtk_signal_compare (gint *a,
93 static guint gtk_signal_info_hash (GtkSignalInfo *a);
94 static gint gtk_signal_info_compare (GtkSignalInfo *a,
96 static GtkHandler* gtk_signal_handler_new (void);
97 static void gtk_signal_handler_destroy (GtkHandler *handler);
98 static void gtk_signal_handler_insert (GtkObject *object,
100 static gint gtk_signal_real_emit (GtkObject *object,
103 static GtkHandler* gtk_signal_get_handlers (GtkObject *object,
105 static gint gtk_signal_connect_by_type (GtkObject *object,
110 GtkSignalDestroy destroy_func,
113 static GtkEmission* gtk_emission_new (void);
114 static void gtk_emission_destroy (GtkEmission *emission);
115 static void gtk_emission_add (GList **emissions,
118 static void gtk_emission_remove (GList **emissions,
121 static gint gtk_emission_check (GList *emissions,
124 static gint gtk_handlers_run (GtkHandler *handlers,
125 GtkHandlerInfo *info,
127 static void gtk_params_get (GtkArg *params,
129 GtkType *param_types,
134 static gint initialize = TRUE;
135 static GHashTable *signal_hash_table = NULL;
136 static GHashTable *signal_info_hash_table = NULL;
137 static gint next_signal = 1;
138 static gint next_handler_id = 1;
140 static const char *handler_key = "signal_handlers";
142 static GMemChunk *handler_mem_chunk = NULL;
143 static GMemChunk *emission_mem_chunk = NULL;
145 static GList *current_emissions = NULL;
146 static GList *stop_emissions = NULL;
147 static GList *restart_emissions = NULL;
149 static GtkSignalMarshal marshal = NULL;
150 static GtkSignalDestroy destroy = NULL;
154 gtk_signal_new (const gchar *name,
155 GtkSignalRunType run_type,
157 gint function_offset,
158 GtkSignalMarshaller marshaller,
170 g_return_val_if_fail (name != NULL, 0);
171 g_return_val_if_fail (marshaller != NULL, 0);
172 g_return_val_if_fail (nparams < 10, 0);
177 info.name = (char*)name;
178 info.object_type = object_type;
180 type = g_hash_table_lookup (signal_info_hash_table, &info);
183 g_warning ("signal \"%s\" already exists in the \"%s\" class ancestry\n",
184 name, gtk_type_name (object_type));
188 signal = g_new (GtkSignal, 1);
189 signal->info.name = g_strdup(name);
190 signal->info.object_type = object_type;
191 signal->info.signal_type = next_signal++;
192 signal->function_offset = function_offset;
193 signal->run_type = run_type;
194 signal->marshaller = marshaller;
195 signal->return_val = return_val;
196 signal->params = NULL;
197 signal->nparams = nparams;
199 g_hash_table_insert (signal_hash_table, &signal->info.signal_type, signal);
200 g_hash_table_insert (signal_info_hash_table, &signal->info, &signal->info.signal_type);
204 signal->params = g_new (GtkType, nparams);
205 params = signal->params;
207 va_start (args, nparams);
209 for (i = 0; i < nparams; i++)
210 params[i] = va_arg (args, GtkType);
215 return signal->info.signal_type;
219 gtk_signal_lookup (const gchar *name,
225 g_return_val_if_fail (name != NULL, 0);
230 info.name = (char*)name;
234 info.object_type = object_type;
236 type = g_hash_table_lookup (signal_info_hash_table, &info);
240 object_type = gtk_type_parent (object_type);
247 gtk_signal_name (gint signal_num)
251 signal = g_hash_table_lookup (signal_hash_table, &signal_num);
253 return signal->info.name;
259 gtk_signal_emit (GtkObject *object,
267 g_return_val_if_fail (object != NULL, FALSE);
272 va_start (args, signal_type);
274 return_val = gtk_signal_real_emit (object, signal_type, args);
282 gtk_signal_emit_by_name (GtkObject *object,
290 g_return_val_if_fail (object != NULL, FALSE);
296 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
300 va_start (args, name);
302 return_val = gtk_signal_real_emit (object, type, args);
311 gtk_signal_emit_stop (GtkObject *object,
314 g_return_if_fail (object != NULL);
315 g_return_if_fail (signal_type >= 1);
320 if (gtk_emission_check (current_emissions, object, signal_type))
321 gtk_emission_add (&stop_emissions, object, signal_type);
325 gtk_signal_emit_stop_by_name (GtkObject *object,
330 g_return_if_fail (object != NULL);
331 g_return_if_fail (name != NULL);
336 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
338 gtk_signal_emit_stop (object, type);
342 gtk_signal_connect (GtkObject *object,
349 g_return_val_if_fail (object != NULL, 0);
354 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
357 g_warning ("could not find signal type \"%s\" in the \"%s\" class ancestry",
358 name, gtk_type_name (GTK_OBJECT_TYPE (object)));
362 return gtk_signal_connect_by_type (object, type, FALSE,
363 func, func_data, NULL,
368 gtk_signal_connect_after (GtkObject *object,
375 g_return_val_if_fail (object != NULL, 0);
380 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
383 g_warning ("could not find signal type \"%s\" in the \"%s\" class ancestry",
384 name, gtk_type_name (GTK_OBJECT_TYPE (object)));
388 return gtk_signal_connect_by_type (object, type, FALSE,
389 func, func_data, NULL,
394 gtk_signal_connect_interp (GtkObject *object,
396 GtkCallbackMarshal func,
398 GtkDestroyNotify destroy_func,
403 g_return_val_if_fail (object != NULL, 0);
408 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
411 g_warning ("could not find signal type \"%s\" in the \"%s\" class ancestry",
412 name, gtk_type_name (GTK_OBJECT_TYPE (object)));
416 return gtk_signal_connect_by_type (object, type, FALSE,
417 (GtkSignalFunc) func, func_data,
418 destroy_func, after, TRUE);
422 gtk_signal_connect_object (GtkObject *object,
425 GtkObject *slot_object)
429 g_return_val_if_fail (object != NULL, 0);
434 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
437 g_warning ("could not find signal type \"%s\" in the \"%s\" class ancestry",
438 name, gtk_type_name (GTK_OBJECT_TYPE (object)));
442 return gtk_signal_connect_by_type (object, type, TRUE,
443 func, slot_object, NULL,
448 gtk_signal_connect_object_after (GtkObject *object,
451 GtkObject *slot_object)
455 g_return_val_if_fail (object != NULL, 0);
460 type = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object));
463 g_warning ("could not find signal type \"%s\" in the \"%s\" class ancestry",
464 name, gtk_type_name (GTK_OBJECT_TYPE (object)));
468 return gtk_signal_connect_by_type (object, type, TRUE,
469 func, slot_object, NULL,
474 gtk_signal_disconnect (GtkObject *object,
480 g_return_if_fail (object != NULL);
486 tmp = gtk_object_get_data (object, handler_key);
493 prev->next = tmp->next;
495 gtk_object_set_data (object, handler_key, tmp->next);
496 gtk_signal_handler_destroy (tmp);
504 g_warning ("could not find handler (%d)", anid);
508 gtk_signal_disconnect_by_data (GtkObject *object,
516 g_return_if_fail (object != NULL);
522 start = gtk_object_get_data (object, handler_key);
528 if (tmp->func_data == data)
533 prev->next = tmp->next;
537 gtk_signal_handler_destroy (tmp);
556 gtk_object_set_data (object, handler_key, start);
559 g_warning ("could not find handler containing data (0x%0lX)", (long) data);
563 gtk_signal_handler_block (GtkObject *object,
568 g_return_if_fail (object != NULL);
573 tmp = gtk_object_get_data (object, handler_key);
586 g_warning ("could not find handler (%d)", anid);
590 gtk_signal_handler_block_by_data (GtkObject *object,
596 g_return_if_fail (object != NULL);
602 tmp = gtk_object_get_data (object, handler_key);
606 if (tmp->func_data == data)
616 g_warning ("could not find handler containing data (0x%0lX)", (long) data);
620 gtk_signal_handler_unblock (GtkObject *object,
625 g_return_if_fail (object != NULL);
630 tmp = gtk_object_get_data (object, handler_key);
636 tmp->blocked = FALSE;
643 g_warning ("could not find handler (%d)", anid);
647 gtk_signal_handler_unblock_by_data (GtkObject *object,
653 g_return_if_fail (object != NULL);
659 tmp = gtk_object_get_data (object, handler_key);
663 if (tmp->func_data == data)
665 tmp->blocked = FALSE;
673 g_warning ("could not find handler containing data (0x%0lX)", (long) data);
677 gtk_signal_handlers_destroy (GtkObject *object)
682 list = gtk_object_get_data (object, handler_key);
687 handler = list->next;
688 gtk_signal_handler_destroy (list);
692 gtk_object_remove_data (object, handler_key);
697 gtk_signal_default_marshaller (GtkObject *object,
702 GtkSignalMarshaller0 rfunc;
704 rfunc = (GtkSignalMarshaller0) func;
706 (* rfunc) (object, func_data);
710 gtk_signal_set_funcs (GtkSignalMarshal marshal_func,
711 GtkSignalDestroy destroy_func)
713 marshal = marshal_func;
714 destroy = destroy_func;
724 signal_hash_table = g_hash_table_new ((GHashFunc) gtk_signal_hash,
725 (GCompareFunc) gtk_signal_compare);
726 signal_info_hash_table = g_hash_table_new ((GHashFunc) gtk_signal_info_hash,
727 (GCompareFunc) gtk_signal_info_compare);
732 gtk_signal_hash (gint *key)
738 gtk_signal_compare (gint *a,
745 gtk_signal_info_hash (GtkSignalInfo *a)
747 return (g_string_hash (a->name) + a->object_type);
751 gtk_signal_info_compare (GtkSignalInfo *a,
754 return ((a->object_type == b->object_type) &&
755 g_string_equal (a->name, b->name));
759 gtk_signal_handler_new ()
763 if (!handler_mem_chunk)
764 handler_mem_chunk = g_mem_chunk_new ("handler mem chunk", sizeof (GtkHandler),
765 1024, G_ALLOC_AND_FREE);
767 handler = g_chunk_new (GtkHandler, handler_mem_chunk);
770 handler->signal_type = 0;
771 handler->object_signal = FALSE;
772 handler->blocked = FALSE;
773 handler->after = FALSE;
774 handler->no_marshal = FALSE;
775 handler->func = NULL;
776 handler->func_data = NULL;
777 handler->destroy_func = NULL;
778 handler->next = NULL;
784 gtk_signal_handler_destroy (GtkHandler *handler)
786 if (!handler->func && destroy)
787 (* destroy) (handler->func_data);
788 else if (handler->destroy_func)
789 (* handler->destroy_func) (handler->func_data);
790 g_mem_chunk_free (handler_mem_chunk, handler);
794 gtk_signal_handler_insert (GtkObject *object,
801 start = gtk_object_get_data (object, handler_key);
804 gtk_object_set_data (object, handler_key, handler);
813 if (tmp->signal_type < handler->signal_type)
816 prev->next = handler;
818 gtk_object_set_data (object, handler_key, handler);
836 gtk_signal_real_emit (GtkObject *object,
842 GtkHandler *handlers;
844 guchar **signal_func_offset;
845 gint being_destroyed;
846 GtkArg params[MAX_PARAMS];
848 g_return_val_if_fail (object != NULL, FALSE);
849 g_return_val_if_fail (signal_type >= 1, TRUE);
851 being_destroyed = GTK_OBJECT_BEING_DESTROYED (object);
852 if (!GTK_OBJECT_NEED_DESTROY (object))
854 signal = g_hash_table_lookup (signal_hash_table, &signal_type);
855 g_return_val_if_fail (signal != NULL, TRUE);
856 g_return_val_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->info.object_type), TRUE);
858 if ((signal->run_type & GTK_RUN_NO_RECURSE) &&
859 gtk_emission_check (current_emissions, object, signal_type))
861 gtk_emission_add (&restart_emissions, object, signal_type);
865 old_value = GTK_OBJECT_IN_CALL (object);
866 GTK_OBJECT_SET_FLAGS (object, GTK_IN_CALL);
868 gtk_params_get (params, signal->nparams, signal->params, signal->return_val, args);
870 gtk_emission_add (¤t_emissions, object, signal_type);
873 if (GTK_RUN_TYPE (signal->run_type) != GTK_RUN_LAST)
875 signal_func_offset = (guchar**) ((guchar*) object->klass + signal->function_offset);
876 if (*signal_func_offset)
877 (* signal->marshaller) (object, (GtkSignalFunc) *signal_func_offset, NULL, params);
878 if (GTK_OBJECT_NEED_DESTROY (object))
882 info.object = object;
883 info.marshaller = signal->marshaller;
884 info.params = params;
885 info.param_types = signal->params;
886 info.return_val = signal->return_val;
887 info.nparams = signal->nparams;
888 info.run_type = signal->run_type;
889 info.signal_type = signal_type;
891 handlers = gtk_signal_get_handlers (object, signal_type);
892 switch (gtk_handlers_run (handlers, &info, FALSE))
900 if (GTK_RUN_TYPE (signal->run_type) != GTK_RUN_FIRST)
902 signal_func_offset = (guchar**) ((guchar*) object->klass + signal->function_offset);
903 if (*signal_func_offset)
904 (* signal->marshaller) (object, (GtkSignalFunc) *signal_func_offset, NULL, params);
905 if (being_destroyed || GTK_OBJECT_NEED_DESTROY (object))
909 switch (gtk_handlers_run (handlers, &info, TRUE))
918 gtk_emission_remove (¤t_emissions, object, signal_type);
920 if (signal->run_type & GTK_RUN_NO_RECURSE)
921 gtk_emission_remove (&restart_emissions, object, signal_type);
923 if (!being_destroyed && !old_value)
924 GTK_OBJECT_UNSET_FLAGS (object, GTK_IN_CALL);
927 if (!being_destroyed && GTK_OBJECT_NEED_DESTROY (object) && !GTK_OBJECT_IN_CALL (object))
929 gtk_object_destroy (object);
937 gtk_signal_get_handlers (GtkObject *object,
940 GtkHandler *handlers;
942 g_return_val_if_fail (object != NULL, NULL);
943 g_return_val_if_fail (signal_type >= 1, NULL);
945 handlers = gtk_object_get_data (object, handler_key);
949 if (handlers->signal_type == signal_type)
951 handlers = handlers->next;
958 gtk_signal_connect_by_type (GtkObject *object,
963 GtkSignalDestroy destroy_func,
968 gint *object_signals;
973 g_return_val_if_fail (object != NULL, 0);
974 g_return_val_if_fail (object->klass != NULL, 0);
975 g_return_val_if_fail (object->klass->signals != NULL, 0);
977 /* Search through the signals for this object and make
978 * sure the one we are adding is valid. If it isn't then
979 * issue a warning and return.
981 object_signals = object->klass->signals;
982 nsignals = object->klass->nsignals;
985 for (i = 0; i < nsignals; i++)
986 if (object_signals[i] == signal_type)
994 g_warning ("could not find signal (%d) in object's list of signals", signal_type);
998 handler = gtk_signal_handler_new ();
999 handler->id = next_handler_id++;
1000 handler->signal_type = signal_type;
1001 handler->object_signal = object_signal;
1002 handler->func = func;
1003 handler->func_data = func_data;
1004 handler->destroy_func = destroy_func;
1007 handler->after = TRUE;
1008 handler->no_marshal = no_marshal;
1010 gtk_signal_handler_insert (object, handler);
1017 GtkEmission *emission;
1019 if (!emission_mem_chunk)
1020 emission_mem_chunk = g_mem_chunk_new ("emission mem chunk", sizeof (GtkEmission),
1021 1024, G_ALLOC_AND_FREE);
1023 emission = g_chunk_new (GtkEmission, emission_mem_chunk);
1025 emission->object = NULL;
1026 emission->signal_type = 0;
1032 gtk_emission_destroy (GtkEmission *emission)
1034 g_mem_chunk_free (emission_mem_chunk, emission);
1038 gtk_emission_add (GList **emissions,
1042 GtkEmission *emission;
1044 g_return_if_fail (emissions != NULL);
1045 g_return_if_fail (object != NULL);
1047 emission = gtk_emission_new ();
1048 emission->object = object;
1049 emission->signal_type = signal_type;
1051 *emissions = g_list_prepend (*emissions, emission);
1055 gtk_emission_remove (GList **emissions,
1059 GtkEmission *emission;
1062 g_return_if_fail (emissions != NULL);
1063 g_return_if_fail (object != NULL);
1068 emission = tmp->data;
1070 if ((emission->object == object) &&
1071 (emission->signal_type == signal_type))
1073 gtk_emission_destroy (emission);
1074 *emissions = g_list_remove_link (*emissions, tmp);
1084 gtk_emission_check (GList *emissions,
1088 GtkEmission *emission;
1091 g_return_val_if_fail (object != NULL, FALSE);
1096 emission = tmp->data;
1099 if ((emission->object == object) &&
1100 (emission->signal_type == signal_type))
1107 gtk_handlers_run (GtkHandler *handlers,
1108 GtkHandlerInfo *info,
1111 while (handlers && (handlers->signal_type == info->signal_type))
1113 if (!handlers->blocked && (handlers->after == after))
1117 if (handlers->no_marshal)
1118 (* (GtkCallbackMarshal)handlers->func) (info->object,
1119 handlers->func_data,
1122 else if (handlers->object_signal)
1123 (* info->marshaller) ((GtkObject*) handlers->func_data, /* don't GTK_OBJECT() cast */
1125 handlers->func_data,
1128 (* info->marshaller) (info->object,
1130 handlers->func_data,
1134 (* marshal) (info->object,
1135 handlers->func_data,
1141 if (GTK_OBJECT_NEED_DESTROY (info->object))
1143 else if (gtk_emission_check (stop_emissions, info->object, info->signal_type))
1145 gtk_emission_remove (&stop_emissions, info->object, info->signal_type);
1147 if (info->run_type & GTK_RUN_NO_RECURSE)
1148 gtk_emission_remove (&restart_emissions, info->object, info->signal_type);
1151 else if ((info->run_type & GTK_RUN_NO_RECURSE) &&
1152 gtk_emission_check (restart_emissions, info->object, info->signal_type))
1154 gtk_emission_remove (&restart_emissions, info->object, info->signal_type);
1159 handlers = handlers->next;
1166 gtk_params_get (GtkArg *params,
1168 GtkType *param_types,
1174 for (i = 0; i < nparams; i++)
1176 params[i].type = param_types[i];
1177 params[i].name = NULL;
1179 switch (GTK_FUNDAMENTAL_TYPE (param_types[i]))
1181 case GTK_TYPE_INVALID:
1186 GTK_VALUE_CHAR(params[i]) = va_arg (args, gint);
1189 GTK_VALUE_BOOL(params[i]) = va_arg (args, gint);
1192 GTK_VALUE_INT(params[i]) = va_arg (args, gint);
1195 GTK_VALUE_UINT(params[i]) = va_arg (args, guint);
1198 GTK_VALUE_ENUM(params[i]) = va_arg (args, gint);
1200 case GTK_TYPE_FLAGS:
1201 GTK_VALUE_FLAGS(params[i]) = va_arg (args, gint);
1204 GTK_VALUE_LONG(params[i]) = va_arg (args, glong);
1206 case GTK_TYPE_ULONG:
1207 GTK_VALUE_ULONG(params[i]) = va_arg (args, gulong);
1209 case GTK_TYPE_FLOAT:
1210 GTK_VALUE_FLOAT(params[i]) = va_arg (args, gfloat);
1212 case GTK_TYPE_STRING:
1213 GTK_VALUE_STRING(params[i]) = va_arg (args, gchar*);
1215 case GTK_TYPE_POINTER:
1216 GTK_VALUE_POINTER(params[i]) = va_arg (args, gpointer);
1218 case GTK_TYPE_BOXED:
1219 GTK_VALUE_BOXED(params[i]) = va_arg (args, gpointer);
1221 case GTK_TYPE_SIGNAL:
1222 GTK_VALUE_SIGNAL(params[i]).f = va_arg (args, GtkFunction);
1223 GTK_VALUE_SIGNAL(params[i]).d = va_arg (args, gpointer);
1225 case GTK_TYPE_FOREIGN:
1226 GTK_VALUE_FOREIGN(params[i]).data = va_arg (args, gpointer);
1227 GTK_VALUE_FOREIGN(params[i]).notify =
1228 va_arg (args, GtkDestroyNotify);
1230 case GTK_TYPE_CALLBACK:
1231 GTK_VALUE_CALLBACK(params[i]).marshal =
1232 va_arg (args, GtkCallbackMarshal);
1233 GTK_VALUE_CALLBACK(params[i]).data = va_arg (args, gpointer);
1234 GTK_VALUE_CALLBACK(params[i]).notify =
1235 va_arg (args, GtkDestroyNotify);
1237 case GTK_TYPE_C_CALLBACK:
1238 GTK_VALUE_C_CALLBACK(params[i]).func = va_arg (args, GtkFunction);
1239 GTK_VALUE_C_CALLBACK(params[i]).func_data = va_arg (args, gpointer);
1242 GTK_VALUE_ARGS(params[i]).n_args = va_arg (args, int);
1243 GTK_VALUE_ARGS(params[i]).args = va_arg (args, GtkArg*);
1245 case GTK_TYPE_OBJECT:
1246 GTK_VALUE_OBJECT(params[i]) = va_arg (args, GtkObject*);
1247 g_assert (GTK_VALUE_OBJECT(params[i]) == NULL ||
1248 GTK_CHECK_TYPE (GTK_VALUE_OBJECT(params[i]),
1252 g_error ("unsupported type %s in signal arg",
1253 gtk_type_name (params[i].type));
1258 params[i].type = return_val;
1259 params[i].name = NULL;
1261 switch (GTK_FUNDAMENTAL_TYPE (return_val))
1263 case GTK_TYPE_INVALID:
1268 params[i].d.pointer_data = va_arg (args, gchar*);
1271 params[i].d.pointer_data = va_arg (args, gint*);
1274 params[i].d.pointer_data = va_arg (args, gint*);
1277 params[i].d.pointer_data = va_arg (args, guint*);
1280 params[i].d.pointer_data = va_arg (args, gint*);
1282 case GTK_TYPE_FLAGS:
1283 params[i].d.pointer_data = va_arg (args, gint*);
1286 params[i].d.pointer_data = va_arg (args, glong*);
1288 case GTK_TYPE_ULONG:
1289 params[i].d.pointer_data = va_arg (args, gulong*);
1291 case GTK_TYPE_FLOAT:
1292 params[i].d.pointer_data = va_arg (args, gfloat*);
1294 case GTK_TYPE_STRING:
1295 params[i].d.pointer_data = va_arg (args, gchar**);
1297 case GTK_TYPE_POINTER:
1298 params[i].d.pointer_data = va_arg (args, gpointer*);
1300 case GTK_TYPE_BOXED:
1301 params[i].d.pointer_data = va_arg (args, gpointer*);
1303 case GTK_TYPE_OBJECT:
1304 params[i].d.pointer_data = va_arg (args, GtkObject**);
1306 case GTK_TYPE_SIGNAL:
1307 case GTK_TYPE_FOREIGN:
1308 case GTK_TYPE_CALLBACK:
1309 case GTK_TYPE_C_CALLBACK:
1312 g_error ("unsupported type %s in signal return",
1313 gtk_type_name (return_val));