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 */
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);
}
}
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);
{
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);
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);
}
}
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;