]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.99.3
[gob-dx.git] / src / main.c
index 7613bc090bf8fda44806689646600a526789f291..3909cb02ffd43ddf8a4f07eabb4e1b78f7ab28bb 100644 (file)
@@ -454,7 +454,7 @@ put_signal_macro (const Method *m, gboolean gnu)
                out_printf (outh, "#define %s_connect_data__%s"
                            "(object,func,data,destroy_data,flags)\t"
                            "g_signal_connect_data(%s(object),\"%s\","
-                           "(GCallback)(func),(data),(destroy_data),(flags))\n",
+                           "(GCallback)(func),(data),(destroy_data),(GConnectFlags)(flags))\n",
                            funcbase, m->id, macrobase, m->id);
        } else {
                /* connect */
@@ -489,7 +489,7 @@ put_signal_macro (const Method *m, gboolean gnu)
                            funcbase, m->id, macrobase, typebase, m->id);
                print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ",
                              " = (func); ", m, FALSE, TRUE, TRUE);
-               out_printf (outh, "___%s; }), (data), (destroy_data), (flags))\n", m->id);
+               out_printf (outh, "___%s; }), (data), (destroy_data), (GConnectFlags)(flags))\n", m->id);
        }
 }
 
@@ -1001,13 +1001,25 @@ add_interface_inits (Class *c)
 
        for (li = c->interfaces; li != NULL; li = li->next) {
                const char *interface = li->data;
+               const char *end;
                char *name = replace_sep (interface, '_');
                char *type = remove_sep (interface);
 
+               /* EEEK! evil, we should have some sort of option
+                * to force this for arbitrary interfaces, since
+                * some are Class and some are Iface.  Glib is shite
+                * in consistency. */
+               if (strcmp (type, "GtkEditable") == 0 ||
+                   strcmp (type, "GTypePlugin") == 0)
+                       end = "Class";
+               else
+                       /* We'll assume Iface is the standard ending */
+                       end = "Iface";
+
                out_printf (out, "\nstatic void\n"
-                           "___%s_init (%sIface *iface)\n"
+                           "___%s_init (%s%s *iface)\n"
                            "{\n",
-                           name, type);
+                           name, type, end);
 
                add_interface_methods (c, interface);
 
@@ -2535,11 +2547,21 @@ put_signal_args (Method *m)
 {
        GList *li;
        GList *ali;
-       for (ali = m->gtktypes->next, li=m->args->next;
+       int i;
+
+       if (m->args->next == NULL)
+               return;
+
+       for (ali = m->gtktypes->next, li = m->args->next, i = 1;
             li != NULL && ali != NULL;
-            li = li->next, ali = ali->next) {
+            li = li->next, ali = ali->next, i++) {
                FuncArg *fa = li->data;
                char *cast = g_strdup (get_cast (ali->data, FALSE));
+               /* FIXME: This code is so fucking ugly it hurts */
+               gboolean do_static = 
+                       (strcmp ((char *)ali->data, "STRING") == 0 ||
+                        strcmp ((char *)ali->data, "BOXED") == 0);
+               char *set_func;
 
                if (cast == NULL) {
                        cast = get_type (fa->atype, TRUE);
@@ -2548,9 +2570,20 @@ put_signal_args (Method *m)
                   the we know all the types */
                g_assert (cast != NULL);
 
-               out_printf (out, ",\n\t\t(%s)%s", cast,
-                           fa->name);
+               out_printf (out,
+                           "\t___param_values[%d].g_type = 0;\n"
+                           "\tg_value_init (&___param_values[%d], G_TYPE_%s);\n",
+                           i, i, (char *)ali->data);
+
+               set_func = g_strdup_printf ("g_value_set%s_%s",
+                                           do_static ? "_static" : "",
+                                           (char *)ali->data);
+               g_strdown (set_func);
+
+               out_printf (out, "\t%s (&___param_values[%d], (%s) %s);\n\n",
+                           set_func, i, cast, fa->name);
 
+               g_free (set_func);
                g_free (cast);
        }
 }
@@ -2610,38 +2643,87 @@ put_method(Method *m)
                else /* PUBLIC, PROTECTED */
                        print_method(out, "", "\n", "", " ", "", "\n",
                                     m, FALSE, FALSE, TRUE);
-               out_addline_outfile(out);
-               out_printf(out, "{\n");
-               s = g_strdup(m->id);
-               g_strup(s);
-               if(strcmp(m->mtype->name, "void") == 0 &&
-                  m->mtype->pointer == NULL) {
-                       print_preconditions(m);
-                       if(((FuncArg *)m->args->data)->name)
-                       out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n"
-                               "\t\tobject_signals[%s_SIGNAL], 0",
-                               ((FuncArg *)m->args->data)->name, s);
-                       put_signal_args (m);
-                       out_printf(out, ");\n}\n");
-               } else {
-                       out_printf(out, "\t");
-                       print_type(out, m->mtype, TRUE);
-                       out_printf(out, "return_val = (");
-                       print_type(out, m->mtype, TRUE);
-                       if(m->defreturn)
-                               out_printf(out, ")(%s);\n", m->defreturn);
-                       else if(m->onerror)
-                               out_printf(out, ")(%s);\n", m->onerror);
-                       else
-                               out_printf(out, ")(0);\n");
-                       print_preconditions(m);
-                       out_printf(out, "\tg_signal_emit (G_OBJECT (%s),\n"
-                               "\t\tobject_signals[%s_SIGNAL], 0",
-                               ((FuncArg *)m->args->data)->name, s);
-                       put_signal_args(m);
-                       out_printf(out, ",\n\t\t&return_val);\n"
-                               "\treturn return_val;\n}\n");
+               out_addline_outfile (out);
+
+               out_printf (out, "{\n");
+
+               out_printf (out,
+                           "\tGValue ___param_values[%d];\n"
+                           "\tGValue ___return_val = {0};\n\n",
+                           g_list_length (m->args));
+
+               print_preconditions (m);
+
+               out_printf (out,
+                           "\n\t___param_values[0].g_type = 0;\n"
+                           "\tg_value_init (&___param_values[0], G_TYPE_FROM_INSTANCE (%s));\n"
+                           "\tg_value_set_instance (&___param_values[0], (gpointer) %s);\n\n",
+                           ((FuncArg *)m->args->data)->name,
+                           ((FuncArg *)m->args->data)->name);
+
+               put_signal_args (m);
+
+               if (strcmp (m->gtktypes->data, "NONE") != 0) {
+                       const char *defret = NULL;
+
+                       out_printf (out, "\tg_value_init (&___return_val, G_TYPE_%s);\n",
+                                   (char *)m->gtktypes->data);
+
+                       if (m->defreturn != NULL)
+                               defret = m->defreturn;
+                       else if (m->onerror != NULL)
+                               defret = m->onerror;
+
+                       if (defret != NULL) {
+                               char *set_func;
+                               /* FIXME: This code is so fucking ugly it hurts */
+                               gboolean do_static = 
+                                       (strcmp ((char *)m->gtktypes->data, "STRING") == 0 ||
+                                        strcmp ((char *)m->gtktypes->data, "BOXED") == 0);
+                               char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE));
+                               if (cast == NULL)
+                                       cast = get_type (m->mtype, TRUE);
+
+                               set_func = g_strdup_printf ("g_value_set%s_%s",
+                                                           do_static ? "_static" : "",
+                                                           (char *)m->gtktypes->data);
+                               g_strdown (set_func);
+
+                               out_printf (out, "\t%s (&___return_val, (%s) (%s));\n",
+                                           set_func, cast, defret);
+
+                               g_free (set_func);
+                               g_free (cast);
+                       }
+                       out_printf (out, "\n");
+               }
+
+               s = g_strdup (m->id);
+               g_strup (s);
+
+               out_printf(out, "\tg_signal_emitv (___param_values,\n"
+                          "\t\tobject_signals[%s_SIGNAL],\n"
+                          "\t\t0 /* detail */,\n"
+                          "\t\t&___return_val);\n", s);
+
+               g_free (s);
+
+               if (strcmp (m->gtktypes->data, "NONE") != 0) {
+                       char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE));
+                       char *getfunc = g_strdup_printf ("g_value_get_%s",
+                                                        (char *)m->gtktypes->data);
+                       g_strdown (getfunc);
+
+                       if (cast == NULL)
+                               cast = get_type (m->mtype, TRUE);
+
+                       out_printf (out, "\n\treturn (%s) %s (&___return_val);\n",
+                                   cast, getfunc);
+
+                       g_free (cast);
+                       g_free (getfunc);
                }
+               out_printf(out, "}\n");
 
                if(!m->cbuf)
                        break;