- 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);
+ 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);
+
+ if (strcmp (m->gtktypes->data, "UNICHAR") == 0)
+ /* hack because glib is braindamaged */
+ set_func = g_strdup ("g_value_set_uint");
+ else
+ set_func = g_strdup_printf ("g_value_set%s_%s",
+ do_static ? "_static" : "",
+ (char *)m->gtktypes->data);
+ gob_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);
+ gob_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);
+
+ clear_signal_args (m);
+
+ if (strcmp (m->gtktypes->data, "NONE") != 0) {
+ char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE));
+ char *getfunc;
+ /* Hack because glib is very very braindead */
+ gboolean do_dup =
+ (strcmp ((char *)m->gtktypes->data, "STRING") == 0 ||
+ strcmp ((char *)m->gtktypes->data, "BOXED") == 0 ||
+ strcmp ((char *)m->gtktypes->data, "OBJECT") == 0 ||
+ strcmp ((char *)m->gtktypes->data, "PARAM") == 0);
+
+ if (strcmp (m->gtktypes->data, "UNICHAR") == 0)
+ /* hack because glib is braindamaged */
+ getfunc = g_strdup ("g_value_get_uint");