]> Pileus Git - ~andy/gtk/commitdiff
begin the parameter elipsis (...) after the first argument name. this
authorTim Janik <timj@gtk.org>
Mon, 24 Aug 1998 05:27:29 +0000 (05:27 +0000)
committerTim Janik <timj@src.gnome.org>
Mon, 24 Aug 1998 05:27:29 +0000 (05:27 +0000)
Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>

        * gtk/gtkarg.h:
        * gtk/gtkarg.c:
        * gtk/gtkwidget.h:
        * gtk/gtkwidget.c:
        * gtk/gtkobject.h:
        * gtk/gtkobject.c:
        * gtk/gtkcontainer.h:
        * gtk/gtkcontainer.c:
        (gtk_object_new):
        (gtk_object_set):
        (gtk_widget_new):
        (gtk_widget_set):
        (gtk_container_add_with_args):
        (gtk_container_child_set):
        begin the parameter elipsis (...) after the first argument name. this
        change is source compatible, since it was always required, even as NULL.
        (gtk_args_collect):
        (gtk_object_args_collect):
        (gtk_container_child_args_collect):
        changed prototypes to pass first_arg_name, also, pass va_list variable
        by value (portability concerns). callers changed.

        * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
        a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
        can't pass va_list variables by reference for portability reasons.

18 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkarg.c
gtk/gtkarg.h
gtk/gtkargcollector.c
gtk/gtkcontainer.c
gtk/gtkcontainer.h
gtk/gtkitemfactory.c
gtk/gtkobject.c
gtk/gtkobject.h
gtk/gtksignal.c
gtk/gtkwidget.c
gtk/gtkwidget.h

index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index 0113621c4be5c3fe01784df00269d9987e506e1d..ad5cafa65758534813092c9d98d497e3134cfc7c 100644 (file)
@@ -1,3 +1,31 @@
+Mon Aug 24 02:36:53 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtkarg.h:
+       * gtk/gtkarg.c:
+       * gtk/gtkwidget.h: 
+       * gtk/gtkwidget.c: 
+       * gtk/gtkobject.h:
+       * gtk/gtkobject.c:
+       * gtk/gtkcontainer.h: 
+       * gtk/gtkcontainer.c: 
+       (gtk_object_new):
+       (gtk_object_set):
+       (gtk_widget_new):
+       (gtk_widget_set): 
+       (gtk_container_add_with_args):
+       (gtk_container_child_set):
+       begin the parameter elipsis (...) after the first argument name. this
+       change is source compatible, since it was always required, even as NULL.
+       (gtk_args_collect): 
+       (gtk_object_args_collect): 
+       (gtk_container_child_args_collect):
+       changed prototypes to pass first_arg_name, also, pass va_list variable
+       by value (portability concerns). callers changed.
+
+       * gtk/gtkargcollector.c: implemented gtk_arg_collect_value() as
+       a huge macro GTK_ARG_COLLECT_VALUE() <shrug>. this is needed because we
+       can't pass va_list variables by reference for portability reasons.
+
 Fri Aug 21 22:40:00  Raph Levien  <raph@gtk.org>
 
        * gdk/gdkrgb.c: added calls to gdk_rgb_init in the get_cmap and
index c61bc95d07d21be1cbf0b940073b34d5041b2471..60ebdc1e4ce806845973eca6a29523515b0cc41e 100644 (file)
@@ -233,12 +233,12 @@ gtk_args_collect (GtkType   object_type,
                  GHashTable     *arg_info_hash_table,
                  GSList        **arg_list_p,
                  GSList        **info_list_p,
-                 gpointer        var_args_p)
+                 const gchar   *first_arg_name,
+                 va_list        var_args)
 {
   GSList *arg_list;
   GSList *info_list;
-  gchar *arg_name;
-  va_list *var_args = var_args_p;
+  const gchar *arg_name;
 
   g_return_val_if_fail (arg_list_p != NULL, NULL);
   *arg_list_p = NULL;
@@ -248,7 +248,7 @@ gtk_args_collect (GtkType     object_type,
 
   arg_list = NULL;
   info_list = NULL;
-  arg_name = va_arg (*var_args, gchar*);
+  arg_name = first_arg_name;
   while (arg_name)
     {
       GtkArgInfo *info = NULL;
@@ -262,8 +262,8 @@ gtk_args_collect (GtkType     object_type,
          info_list = g_slist_prepend (info_list, info);
 
          arg = gtk_arg_new (info->type);
-         arg->name = arg_name;
-         error = gtk_arg_collect_value (GTK_FUNDAMENTAL_TYPE (arg->type), arg, var_args);
+         arg->name = (gchar*) arg_name;
+         GTK_ARG_COLLECT_VALUE (GTK_FUNDAMENTAL_TYPE (arg->type), arg, var_args, error);
          arg_list = g_slist_prepend (arg_list, arg);
        }
       if (error)
@@ -273,7 +273,7 @@ gtk_args_collect (GtkType     object_type,
          return error;
        }
 
-      arg_name = va_arg (*var_args, gchar*);
+      arg_name = va_arg (var_args, gchar*);
     }
 
   *arg_list_p = g_slist_reverse (arg_list);
index 7d4e6f777a65cd13d885961ff5c3a1c772ce41e6..5217c0a60aa5f1628f12437ed2006a1ed784c84c 100644 (file)
@@ -60,7 +60,8 @@ gchar*        gtk_args_collect                (GtkType        object_type,
                                         GHashTable    *arg_info_hash_table,
                                         GSList       **arg_list_p,
                                         GSList       **info_list_p,
-                                        gpointer       var_args_p);
+                                        const gchar   *first_arg_name,
+                                        va_list        var_args);
 void   gtk_args_collect_cleanup        (GSList        *arg_list,
                                         GSList        *info_list);
 gchar* gtk_arg_get_info                (GtkType        object_type,
index 30677380629c1eec719d464713581e75747285d0..32a0ec7847374c4c08f56cb4f65f36ba4d9349c4 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-/* collect a single argument value from a va_list
+/* collect a single argument value from a va_list.
+ * this is implemented as a huge macro <shrug>, because we can't
+ * pass va_list variables by reference on some systems.
+ * the former prototype was:
+ * static inline gchar*
+ * gtk_arg_collect_value (GtkType  fundamental_type,
+ *                       GtkArg  *arg,
+ *                       va_list  var_args);
  */
-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;
-}
+#define        GTK_ARG_COLLECT_VALUE(_ft, arg, var_args, _error)       \
+G_STMT_START { \
+  GtkType fundamental_type = _ft; \
+  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; \
+    } \
+   \
+  _error = error_msg; /* return error_msg; */ \
+} G_STMT_END
index 8f3696f32e117fc02a12cf36e93592446184bebe..2bcc30b83ff56e42c4b52d9b2da13c9f19585a4d 100644 (file)
@@ -250,6 +250,7 @@ gtk_container_child_type (GtkContainer      *container)
 void
 gtk_container_add_with_args (GtkContainer      *container,
                             GtkWidget         *widget,
+                            const gchar       *first_arg_name,
                             ...)
 {
   g_return_if_fail (container != NULL);
@@ -270,11 +271,12 @@ gtk_container_add_with_args (GtkContainer      *container,
       GSList *info_list = NULL;
       gchar *error;
       
-      va_start (var_args, widget);
+      va_start (var_args, first_arg_name);
       error = gtk_container_child_args_collect (GTK_OBJECT_TYPE (container),
                                                &arg_list,
                                                &info_list,
-                                               &var_args);
+                                               first_arg_name,
+                                               var_args);
       va_end (var_args);
 
       if (error)
@@ -375,6 +377,7 @@ gtk_container_child_getv (GtkContainer      *container,
 void
 gtk_container_child_set (GtkContainer      *container,
                         GtkWidget         *child,
+                        const gchar       *first_arg_name,
                         ...)
 {
   va_list var_args;
@@ -388,11 +391,12 @@ gtk_container_child_set (GtkContainer      *container,
   g_return_if_fail (GTK_IS_WIDGET (child));
   g_return_if_fail (child->parent != NULL);
 
-  va_start (var_args, child);
+  va_start (var_args, first_arg_name);
   error = gtk_container_child_args_collect (GTK_OBJECT_TYPE (container),
                                            &arg_list,
                                            &info_list,
-                                           &var_args);
+                                           first_arg_name,
+                                           var_args);
   va_end (var_args);
 
   if (error)
@@ -541,13 +545,15 @@ gchar*
 gtk_container_child_args_collect (GtkType       object_type,
                                  GSList      **arg_list_p,
                                  GSList      **info_list_p,
-                                 gpointer      var_args_p)
+                                 const gchar  *first_arg_name,
+                                 va_list       var_args)
 {
   return gtk_args_collect (object_type,
                           container_child_arg_info_ht,
                           arg_list_p,
                           info_list_p,
-                          var_args_p);
+                          first_arg_name,
+                          var_args);
 }
 
 gchar*
index 8fe0babcef86160880164e26dccf7853c4640ff8..aecd268f48700452b5091b0132dc523e5e97933c 100644 (file)
@@ -174,6 +174,7 @@ void    gtk_container_child_setv       (GtkContainer      *container,
  */
 void    gtk_container_add_with_args       (GtkContainer      *container,
                                            GtkWidget         *widget,
+                                           const gchar       *first_arg_name,
                                            ...);
 void    gtk_container_addv                (GtkContainer      *container,
                                            GtkWidget         *widget,
@@ -181,6 +182,7 @@ void    gtk_container_addv             (GtkContainer      *container,
                                            GtkArg            *args);
 void   gtk_container_child_set            (GtkContainer      *container,
                                            GtkWidget         *child,
+                                           const gchar       *first_arg_name,
                                            ...);
      
 
@@ -199,7 +201,8 @@ void    gtk_container_arg_get                  (GtkContainer *container,
 gchar* gtk_container_child_args_collect   (GtkType       object_type,
                                            GSList      **arg_list_p,
                                            GSList      **info_list_p,
-                                           gpointer      var_args_p);
+                                           const gchar  *first_arg_name,
+                                           va_list       args);
 gchar*  gtk_container_child_arg_get_info   (GtkType       object_type,
                                            const gchar  *arg_name,
                                            GtkArgInfo  **info_p);
index 33d9f11db5123b1e8f75b67d2703e2adb3fdca20..74054e8b22d9b14c1eacd024dfb39567a45e70f4 100644 (file)
@@ -1481,7 +1481,7 @@ gtk_item_factory_parse_statement (GScanner            *scanner,
 
       parser_func = scanner->value.v_symbol;
 
-      /* check whether this is a GtkItemFactory symbol...
+      /* check whether this is a GtkItemFactory symbol.
        */
       if (parser_func == gtk_item_factory_parse_menu_path)
        expected_token = parser_func (scanner, class);
index f94b485d46d02ea0bb7ff03b1258519d29806c7e..f8f1d4e2e85aef19e85e7a08c27232218fd474d1 100644 (file)
@@ -621,7 +621,8 @@ gtk_object_notify_weaks (GtkObject *object)
  ****************************************************/
 
 GtkObject*
-gtk_object_new (GtkType object_type,
+gtk_object_new (GtkType      object_type,
+               const gchar *first_arg_name,
                ...)
 {
   GtkObject *object;
@@ -634,11 +635,12 @@ gtk_object_new (GtkType object_type,
 
   object = gtk_type_new (object_type);
 
-  va_start (var_args, object_type);
+  va_start (var_args, first_arg_name);
   error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
                                   &arg_list,
                                   &info_list,
-                                  &var_args);
+                                  first_arg_name,
+                                  var_args);
   va_end (var_args);
   
   if (error)
@@ -719,6 +721,7 @@ gtk_object_getv (GtkObject           *object,
 
 void
 gtk_object_set (GtkObject *object,
+               const gchar    *first_arg_name,
                ...)
 {
   va_list var_args;
@@ -729,11 +732,12 @@ gtk_object_set (GtkObject *object,
   g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   
-  va_start (var_args, object);
+  va_start (var_args, first_arg_name);
   error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
                                   &arg_list,
                                   &info_list,
-                                  &var_args);
+                                  first_arg_name,
+                                  var_args);
   va_end (var_args);
   
   if (error)
@@ -878,13 +882,15 @@ gchar*
 gtk_object_args_collect (GtkType      object_type,
                         GSList      **arg_list_p,
                         GSList      **info_list_p,
-                        gpointer      var_args_p)
+                        const gchar  *first_arg_name,
+                        va_list       var_args)
 {
   return gtk_args_collect (object_type,
                           object_arg_info_ht,
                           arg_list_p,
                           info_list_p,
-                          var_args_p);
+                          first_arg_name,
+                          var_args);
 }
 
 gchar*
index fd38e30d75c05de78d280678878ac9eadcd6e71d..3fe07f24dba920d88383e205fc3c72c2b0e5ecaa 100644 (file)
@@ -242,6 +242,7 @@ guint       gtk_object_class_user_signal_newv (GtkObjectClass     *klass,
                                           guint               nparams,
                                           GtkType            *params);
 GtkObject*     gtk_object_new            (GtkType             type,
+                                          const gchar        *first_arg_name,
                                           ...);
 GtkObject*     gtk_object_newv           (GtkType             object_type,
                                           guint               n_args,
@@ -272,6 +273,7 @@ void        gtk_object_getv         (GtkObject      *object,
  * more than one c-function argument.
  */
 void   gtk_object_set          (GtkObject      *object,
+                                const gchar    *first_arg_name,
                                 ...);
 void   gtk_object_setv         (GtkObject      *object,
                                 guint          n_args,
@@ -372,7 +374,8 @@ void        gtk_object_arg_get      (GtkObject   *object,
 gchar* gtk_object_args_collect (GtkType      object_type,
                                 GSList     **arg_list_p,
                                 GSList     **info_list_p,
-                                gpointer     var_args_p);
+                                const gchar *first_arg_name,
+                                va_list      var_args);
 gchar*  gtk_object_arg_get_info (GtkType      object_type,
                                 const gchar *arg_name,
                                 GtkArgInfo **info_p);
index 1830c741bcfe0e375234b63cc4580a5ce5ff30e0..b3488f8f6b273de168761a911e16a77f0779410e 100644 (file)
@@ -1780,9 +1780,10 @@ gtk_signal_collect_params (GtkArg               *params,
 
       params->type = *(param_types++);
       params->name = NULL;
-      error = gtk_arg_collect_value (GTK_FUNDAMENTAL_TYPE (params->type),
-                                    params,
-                                    &var_args);
+      GTK_ARG_COLLECT_VALUE (GTK_FUNDAMENTAL_TYPE (params->type),
+                            params,
+                            var_args,
+                            error);
       if (error)
        {
          failed = TRUE;
index adf517cca732c8449fe5b73290260372d3f51168..eb420ecde4ba8cf85b2220c16f46cbca2092d7a8 100644 (file)
@@ -955,7 +955,8 @@ gtk_widget_init (GtkWidget *widget)
  *****************************************/
 
 GtkWidget*
-gtk_widget_new (guint widget_type,
+gtk_widget_new (GtkType      widget_type,
+               const gchar *first_arg_name,
                ...)
 {
   GtkObject *object;
@@ -968,11 +969,12 @@ gtk_widget_new (guint widget_type,
   
   object = gtk_type_new (widget_type);
   
-  va_start (var_args, widget_type);
+  va_start (var_args, first_arg_name);
   error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
                                   &arg_list,
                                   &info_list,
-                                  &var_args);
+                                  first_arg_name,
+                                  var_args);
   va_end (var_args);
   
   if (error)
@@ -1008,7 +1010,7 @@ gtk_widget_new (guint widget_type,
  *****************************************/
 
 GtkWidget*
-gtk_widget_newv (guint  type,
+gtk_widget_newv (GtkType type,
                 guint   nargs,
                 GtkArg *args)
 {
@@ -1060,7 +1062,8 @@ gtk_widget_getv (GtkWidget        *widget,
  *****************************************/
 
 void
-gtk_widget_set (GtkWidget *widget,
+gtk_widget_set (GtkWidget   *widget,
+               const gchar *first_arg_name,
                ...)
 {
   GtkObject *object;
@@ -1074,11 +1077,12 @@ gtk_widget_set (GtkWidget *widget,
 
   object = GTK_OBJECT (widget);
 
-  va_start (var_args, widget);
+  va_start (var_args, first_arg_name);
   error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
                                   &arg_list,
                                   &info_list,
-                                  &var_args);
+                                  first_arg_name,
+                                  var_args);
   va_end (var_args);
 
   if (error)
index ddbcf1b9519610d8825c649317b31bd1e0376130..abb559b189ee0f6577393a155081830616c4c0b8 100644 (file)
@@ -360,9 +360,10 @@ struct _GtkWidgetShapeInfo
 
 
 GtkType           gtk_widget_get_type            (void);
-GtkWidget* gtk_widget_new                (guint                type,
+GtkWidget* gtk_widget_new                (GtkType              type,
+                                          const gchar         *first_arg_name,
                                           ...);
-GtkWidget* gtk_widget_newv               (guint                type,
+GtkWidget* gtk_widget_newv               (GtkType              type,
                                           guint                nargs,
                                           GtkArg              *args);
 void      gtk_widget_ref                 (GtkWidget           *widget);
@@ -376,6 +377,7 @@ void           gtk_widget_getv                (GtkWidget           *widget,
                                           guint                nargs,
                                           GtkArg              *args);
 void      gtk_widget_set                 (GtkWidget           *widget,
+                                          const gchar         *first_arg_name,
                                           ...);
 void      gtk_widget_setv                (GtkWidget           *widget,
                                           guint                nargs,