]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.0.11
[gob-dx.git] / src / main.c
index 0cdd6ff822254463a70a4a45020009a8a76432b6..9e3d4bc58456ea8705b255ae5132e3e1914bb07a 100644 (file)
@@ -677,7 +677,7 @@ find_same_type_signal(Method *m)
 }
 
 static void
-print_signal_marsal_args(Method *m)
+print_signal_marsal_args_gtk1 (Method *m)
 {
        if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
                GList *li;
@@ -698,6 +698,146 @@ print_signal_marsal_args(Method *m)
        out_printf(out, ",\n\t\tfunc_data);\n}\n\n");
 }
 
+static void
+add_marshal_gtk1 (Method *m, const char *mname)
+{
+       out_printf(out, "\nstatic void\n"
+               "___marshal_%s (GtkObject * object,\n"
+               "\tGtkSignalFunc func,\n"
+               "\tgpointer func_data,\n"
+               "\tGtkArg * args)\n"
+               "{\n", mname);
+       
+       if(strcmp(m->gtktypes->data, "NONE")==0) {
+               out_printf(out, "\t___%s rfunc;\n\n"
+                       "\trfunc = (___%s)func;\n\n"
+                       "\t(*rfunc)((%s *)object", mname, mname, typebase);
+       } else {
+               const char *retcast = get_cast(m->gtktypes->data, FALSE);
+               gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
+               out_printf(out,
+                          "\t___%s rfunc;\n\t"
+                          "%s *retval;\n\n"
+                          "\trfunc = (___%s)func;\n\n"
+                          "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
+                          "\t*retval = (*rfunc)((%s *)object",
+                          mname, retcast, mname,
+                          (char *)m->gtktypes->data,
+                          g_list_length(m->gtktypes) - (is_none ? 2 : 1),
+                          typebase);
+       }
+       print_signal_marsal_args_gtk1 (m);
+}
+
+static const char *
+gtk2_debool (const char *s)
+{
+       if (strcmp (s, "BOOL") == 0)
+               return "BOOLEAN";
+       else
+               return s;
+}
+
+static void
+print_signal_marsal_args_gtk2 (Method *m)
+{
+       if (strcmp (m->gtktypes->next->data, "NONE") != 0) {
+               GList *li;
+               int i;
+               for (i = 0, li = m->gtktypes->next;
+                    li != NULL;
+                    i++, li = li->next) {
+                       char *get_func = g_strdup_printf
+                               ("g_value_get_%s",
+                                (char *)gtk2_debool (li->data));
+                       g_strdown (get_func);
+                       out_printf (out, ",\n\t\t(%s) "
+                                   "%s (param_values + %d)",
+                                   get_cast (li->data, FALSE),
+                                   get_func, i + 1);
+                       g_free (get_func);
+               }
+       }
+       out_printf (out, ",\n\t\tdata2);\n");
+}
+
+static void
+add_marshal_gtk2 (Method *m, const char *mname)
+{
+       gboolean ret_none;
+       gboolean arglist_none;
+       const char *retcast;
+
+       ret_none = strcmp (m->gtktypes->data, "NONE") == 0;
+       arglist_none = strcmp (m->gtktypes->next->data, "NONE") == 0;
+
+       if (ret_none)
+               retcast = NULL;
+       else
+               retcast = get_cast (m->gtktypes->data, FALSE);
+
+       out_printf (out, "\nstatic void\n"
+                   "___marshal_%s (GClosure *closure,\n"
+                   "\tGValue *return_value,\n"
+                   "\tguint n_param_values,\n"
+                   "\tconst GValue *param_values,\n"
+                   "\tgpointer invocation_hint,\n"
+                   "\tgpointer marshal_data)\n"
+                   "{\n", mname);
+
+       if ( ! ret_none)
+               out_printf (out, "\t%s v_return;\n", retcast);
+
+       out_printf (out, "\tregister ___%s callback;\n"
+                   "\tregister GCClosure *cc = (GCClosure*) closure;\n"
+                   "\tregister gpointer data1, data2;\n\n",
+                   mname);
+
+       out_printf (out, "\tg_return_if_fail (n_param_values == %d);\n\n",
+                   arglist_none ? 1 : g_list_length (m->gtktypes));
+
+       out_printf (out,
+                   "\tif (G_CCLOSURE_SWAP_DATA (closure)) {\n"
+                   "\t\tdata1 = closure->data;\n"
+                   "\t\tdata2 = g_value_peek_pointer (param_values + 0);\n"
+                   "\t} else {\n"
+                   "\t\tdata1 = g_value_peek_pointer (param_values + 0);\n"
+                   "\t\tdata2 = closure->data;\n"
+                   "\t}\n\n");
+
+       out_printf (out, "\tcallback = (___%s) "
+                   "(marshal_data != NULL ? marshal_data : cc->callback);"
+                   "\n\n", mname);
+       
+       if (ret_none) {
+               out_printf (out, "\tcallback ((%s *)data1", typebase);
+       } else {
+               out_printf (out, "\tv_return = callback ((%s *)data1",
+                           typebase);
+       }
+
+       print_signal_marsal_args_gtk2 (m);
+
+       if ( ! ret_none) {
+               /* FIXME: This code is so fucking ugly it hurts */
+               gboolean take_ownership = 
+                       (strcmp ((char *)m->gtktypes->data, "STRING") == 0 ||
+                        strcmp ((char *)m->gtktypes->data, "BOXED") == 0);
+               char *set_func = g_strdup_printf ("g_value_set_%s%s",
+                                                 (char *)gtk2_debool (m->gtktypes->data),
+                                                 take_ownership ?
+                                                   "_take_ownership" : ""); 
+               g_strdown (set_func);
+
+               out_printf (out, "\n\t%s (return_value, v_return);\n",
+                           set_func);
+
+               g_free (set_func);
+       }
+       out_printf (out, "}\n\n");
+}
+
+
 
 static void
 add_signal_prots(Method *m)
@@ -730,44 +870,23 @@ add_signal_prots(Method *m)
        
        g_hash_table_insert(marsh, m, s);
        eq_signal_methods = g_list_prepend(eq_signal_methods, m);
-       
+
        /* we know that we'll know all the gtktypes (so get_cast can't fail) */
        out_printf(out, "\ntypedef %s (*___%s) (%s *, ",
                   get_cast(m->gtktypes->data, FALSE), s, typebase);
        
-       if(strcmp(m->gtktypes->next->data, "NONE")!=0) {
-               for(li=m->gtktypes->next; li; li=g_list_next(li))
+       if (strcmp (m->gtktypes->next->data, "NONE") != 0) {
+               for (li = m->gtktypes->next; li != NULL; li = li->next)
                        out_printf(out, "%s, ", get_cast(li->data, FALSE));
        }
-       out_printf(out, "gpointer);\n"); 
+       out_printf (out, "gpointer);\n"); 
        
-       out_printf(out, "\nstatic void\n"
-               "___marshal_%s (GtkObject * object,\n"
-               "\tGtkSignalFunc func,\n"
-               "\tgpointer func_data,\n"
-               "\tGtkArg * args)\n"
-               "{\n", s);
-       
-       if(strcmp(m->gtktypes->data, "NONE")==0) {
-               out_printf(out, "\t___%s rfunc;\n\n"
-                       "\trfunc = (___%s)func;\n\n"
-                       "\t(*rfunc)((%s *)object", s, s, typebase);
-       } else {
-               const char *retcast = get_cast(m->gtktypes->data, FALSE);
-               gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
-               out_printf(out,
-                          "\t___%s rfunc;\n\t"
-                          "%s *retval;\n\n"
-                          "\trfunc = (___%s)func;\n\n"
-                          "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
-                          "\t*retval = (*rfunc)((%s *)object",
-                          s, retcast, s,
-                          (char *)m->gtktypes->data,
-                          g_list_length(m->gtktypes) - (is_none ? 2 : 1),
-                          typebase);
-       }
-       print_signal_marsal_args(m);
 
+       out_printf (out, "\n#ifdef G_OBJECT_CLASS\n");
+       add_marshal_gtk2 (m, s);
+       out_printf (out, "#else /* ! G_OBJECT_CLASS */\n");
+       add_marshal_gtk1 (m, s);
+       out_printf (out, "#endif /* G_OBJECT_CLASS */\n\n");
 }
 
 static void
@@ -1087,8 +1206,10 @@ add_signals(Class *c)
 
                }
        }
-       out_printf(out, "\tgtk_object_class_add_signals (gtk_object_class,\n"
-               "\t\tobject_signals, LAST_SIGNAL);\n\n");
+       out_printf (out, "#ifndef G_OBJECT_CLASS\n");
+       out_printf (out, "\tgtk_object_class_add_signals (gtk_object_class,\n"
+                   "\t\tobject_signals, LAST_SIGNAL);\n");
+       out_printf (out, "#endif /* ! G_OBJECT_CLASS */\n\n");
 }
 
 static void