forked from AuroraMiddleware/gtk
da355feec6
Tue Jul 14 06:25:46 1998 Tim Janik <timj@gtk.org> * gtk/testgtk.c (create_cursors): display the current cursor name. * gtk/gtktypeutils.h: * gtk/gtktypeutils.c (gtk_type_init_builtin_types): cleanups to the fundamental type definition. the GtkArg union now only covers the required storage types for argument values. adapted the GTK_VALUE_* macro set. handle GTK_TYPE_UCHAR. definiton of type set bounds macros. * gtk/gtkargcollector.c (gtk_arg_collect_value): clean ups of the code, fixed int/float collection. fixed a bug in the sanity checking code for GtkObjects. * gtk/gtkbindings.c (gtk_binding_entry_add_signal): fixups of the argument collection code. * gtk/gtksignal.c (gtk_signal_collect_params): use the type set bounds macros when distinguishing the return type.
161 lines
5.2 KiB
C
161 lines
5.2 KiB
C
/* GTK - The GIMP Toolkit
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
/* collect a single argument value from a va_list
|
|
*/
|
|
static inline gchar*
|
|
gtk_arg_collect_value (GtkType fundamental_type,
|
|
GtkArg *arg,
|
|
va_list *var_args)
|
|
{
|
|
gchar *error_msg;
|
|
|
|
error_msg = NULL;
|
|
switch (fundamental_type)
|
|
{
|
|
case GTK_TYPE_INVALID:
|
|
error_msg = g_strdup ("invalid untyped argument");
|
|
break;
|
|
|
|
case GTK_TYPE_NONE:
|
|
/* we just ignore this type, since it arithmetically just requires
|
|
* us to not move the var_args pointer any further. callers need to
|
|
* check for the validity of GTK_TYPE_NONE themselves.
|
|
*
|
|
* error_msg = g_strdup ("invalid argument type `void'");
|
|
*/
|
|
break;
|
|
|
|
/* everything smaller than an int is guarranteed to be
|
|
* passed as an int
|
|
*/
|
|
case GTK_TYPE_CHAR:
|
|
GTK_VALUE_CHAR (*arg) = va_arg (*var_args, gint);
|
|
break;
|
|
case GTK_TYPE_UCHAR:
|
|
GTK_VALUE_UCHAR (*arg) = va_arg (*var_args, guint);
|
|
break;
|
|
case GTK_TYPE_BOOL:
|
|
GTK_VALUE_BOOL (*arg) = va_arg (*var_args, gint);
|
|
break;
|
|
case GTK_TYPE_INT:
|
|
GTK_VALUE_INT (*arg) = va_arg (*var_args, gint);
|
|
break;
|
|
case GTK_TYPE_UINT:
|
|
GTK_VALUE_UINT (*arg) = va_arg (*var_args, guint);
|
|
break;
|
|
case GTK_TYPE_ENUM:
|
|
GTK_VALUE_ENUM (*arg) = va_arg (*var_args, gint);
|
|
break;
|
|
case GTK_TYPE_FLAGS:
|
|
GTK_VALUE_FLAGS (*arg) = va_arg (*var_args, guint);
|
|
break;
|
|
|
|
/* we collect longs as glongs since they differ in size with
|
|
* integers on some platforms
|
|
*/
|
|
case GTK_TYPE_LONG:
|
|
GTK_VALUE_LONG (*arg) = va_arg (*var_args, glong);
|
|
break;
|
|
case GTK_TYPE_ULONG:
|
|
GTK_VALUE_ULONG (*arg) = va_arg (*var_args, gulong);
|
|
break;
|
|
|
|
/* floats are always passed as doubles
|
|
*/
|
|
case GTK_TYPE_FLOAT:
|
|
/* GTK_VALUE_FLOAT (*arg) = va_arg (*var_args, gfloat); */
|
|
GTK_VALUE_FLOAT (*arg) = va_arg (*var_args, gdouble);
|
|
break;
|
|
case GTK_TYPE_DOUBLE:
|
|
GTK_VALUE_DOUBLE (*arg) = va_arg (*var_args, gdouble);
|
|
break;
|
|
|
|
/* collect pointer values
|
|
*/
|
|
case GTK_TYPE_STRING:
|
|
GTK_VALUE_STRING (*arg) = va_arg (*var_args, gchar*);
|
|
break;
|
|
case GTK_TYPE_POINTER:
|
|
GTK_VALUE_POINTER (*arg) = va_arg (*var_args, gpointer);
|
|
break;
|
|
case GTK_TYPE_BOXED:
|
|
GTK_VALUE_BOXED (*arg) = va_arg (*var_args, gpointer);
|
|
break;
|
|
|
|
/* structured types
|
|
*/
|
|
case GTK_TYPE_SIGNAL:
|
|
GTK_VALUE_SIGNAL (*arg).f = va_arg (*var_args, GtkSignalFunc);
|
|
GTK_VALUE_SIGNAL (*arg).d = va_arg (*var_args, gpointer);
|
|
break;
|
|
case GTK_TYPE_ARGS:
|
|
GTK_VALUE_ARGS (*arg).n_args = va_arg (*var_args, gint);
|
|
GTK_VALUE_ARGS (*arg).args = va_arg (*var_args, GtkArg*);
|
|
break;
|
|
case GTK_TYPE_FOREIGN:
|
|
GTK_VALUE_FOREIGN (*arg).data = va_arg (*var_args, gpointer);
|
|
GTK_VALUE_FOREIGN (*arg).notify = va_arg (*var_args, GtkDestroyNotify);
|
|
break;
|
|
case GTK_TYPE_CALLBACK:
|
|
GTK_VALUE_CALLBACK (*arg).marshal = va_arg (*var_args, GtkCallbackMarshal);
|
|
GTK_VALUE_CALLBACK (*arg).data = va_arg (*var_args, gpointer);
|
|
GTK_VALUE_CALLBACK (*arg).notify = va_arg (*var_args, GtkDestroyNotify);
|
|
break;
|
|
case GTK_TYPE_C_CALLBACK:
|
|
GTK_VALUE_C_CALLBACK (*arg).func = va_arg (*var_args, GtkFunction);
|
|
GTK_VALUE_C_CALLBACK (*arg).func_data = va_arg (*var_args, gpointer);
|
|
break;
|
|
|
|
/* we do some extra sanity checking when collecting objects,
|
|
* i.e. if the object pointer is not NULL, we check whether we
|
|
* actually got an object pointer within the desired class branch.
|
|
*/
|
|
case GTK_TYPE_OBJECT:
|
|
GTK_VALUE_OBJECT (*arg) = va_arg (*var_args, GtkObject*);
|
|
if (GTK_VALUE_OBJECT (*arg) != NULL)
|
|
{
|
|
register GtkObject *object = GTK_VALUE_OBJECT (*arg);
|
|
|
|
if (object->klass == NULL)
|
|
error_msg = g_strconcat ("invalid unclassed object pointer for argument type `",
|
|
gtk_type_name (arg->type),
|
|
"'",
|
|
NULL);
|
|
else if (!gtk_type_is_a (GTK_OBJECT_TYPE (object), arg->type))
|
|
error_msg = g_strconcat ("invalid object `",
|
|
gtk_type_name (GTK_OBJECT_TYPE (object)),
|
|
"' for argument type `",
|
|
gtk_type_name (arg->type),
|
|
"'",
|
|
NULL);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
error_msg = g_strconcat ("unsupported argument type `",
|
|
gtk_type_name (arg->type),
|
|
"'",
|
|
NULL);
|
|
break;
|
|
}
|
|
|
|
return error_msg;
|
|
}
|