+
+ 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)
+{
+ GList *li;
+ static int sig = 1;
+ char *s;
+ Method *mm;
+
+ if(m->method != SIGNAL_LAST_METHOD &&
+ m->method != SIGNAL_FIRST_METHOD)
+ return;
+
+ if(!marsh)
+ marsh = g_hash_table_new(NULL, NULL);
+
+ if(strcmp(m->gtktypes->data, "NONE")==0 &&
+ strcmp(m->gtktypes->next->data, "NONE")==0)
+ return;
+
+ /* if we already did a signal prototype just use that */
+ mm = find_same_type_signal(m);
+ if(mm) {
+ s = g_hash_table_lookup(marsh, mm);
+ g_hash_table_insert(marsh, m, s);
+ return;
+ }
+
+ s = g_strdup_printf("Sig%d", sig++);
+
+ 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 != NULL; li = li->next)
+ out_printf(out, "%s, ", get_cast(li->data, FALSE));
+ }
+ out_printf (out, "gpointer);\n");
+
+
+ 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
+add_enums(Class *c)
+{
+ GList *li;
+ out_printf(out, "\n");
+ if(signals>0) {
+ out_printf(out, "enum {\n");
+ for(li=c->nodes;li;li=g_list_next(li)) {
+ Node *n = li->data;
+ if(n->type == METHOD_NODE) {
+ Method *m = (Method *)n;
+ if(m->method == SIGNAL_LAST_METHOD ||
+ m->method == SIGNAL_FIRST_METHOD) {
+ char *s = g_strdup(get_real_id(m->id));
+ g_strup(s);
+ out_printf(out, "\t%s_SIGNAL,\n", s);
+ g_free(s);
+ }
+ }
+ }
+ out_printf(out, "\tLAST_SIGNAL\n};\n\n");
+ }
+ if(set_arguments > 0 || get_arguments > 0) {
+ out_printf(out, "enum {\n\tARG_0");
+ for(li=c->nodes;li;li=g_list_next(li)) {
+ Node *n = li->data;
+ if(n->type == ARGUMENT_NODE) {
+ Argument *a = (Argument *)n;
+ char *s = g_strdup(a->name);
+ g_strup(s);
+ out_printf(out, ",\n\tARG_%s", s);
+ g_free(s);
+ }
+ }
+ out_printf(out, "\n};\n\n");
+ }
+
+ if(signals>0)
+ out_printf(out,
+ "static guint object_signals[LAST_SIGNAL] = {0};\n\n");
+
+ out_printf(out, "/* pointer to the class of our parent */\n");
+ out_printf(out, "static %sClass *parent_class = NULL;\n\n", ptypebase);
+}
+
+static void
+add_get_type(void)
+{
+ char *chunk_size = ((Class*)class)->chunk_size;
+
+ out_printf(out,
+ "GtkType\n"
+ "%s_get_type (void)\n"
+ "{\n"
+ "\tstatic GtkType type = 0;\n\n"
+ "\tif (type == 0) {\n"
+ "\t\tstatic const GtkTypeInfo info = {\n"
+ "\t\t\t\"%s\",\n"
+ "\t\t\tsizeof (%s),\n"
+ "\t\t\tsizeof (%sClass),\n"
+ "\t\t\t(GtkClassInitFunc) %s_class_init,\n"
+ "\t\t\t(GtkObjectInitFunc) %s_init,\n"
+ "\t\t\t/* reserved_1 */ NULL,\n"
+ "\t\t\t/* reserved_2 */ NULL,\n"
+ "\t\t\t(GtkClassInitFunc) NULL\n"
+ "\t\t};\n\n"
+ "\t\ttype = gtk_type_unique (%s_get_type(), &info);\n",
+ funcbase, typebase, typebase, typebase,
+ funcbase, funcbase, pfuncbase);
+ if(chunk_size) {
+ out_printf(out,
+ "#if %s > 0\n"
+ "\t\tgtk_type_set_chunk_alloc(type, %s);\n"
+ "#endif\n",
+ chunk_size, chunk_size);
+ }
+ out_printf(out,
+ "\t}\n\n"
+ "\treturn type;\n"
+ "}\n\n");
+}
+
+static void
+add_bonobo_x_get_type (void)
+{
+ char *chunk_size = ((Class*)class)->chunk_size;
+
+ out_printf(out,
+ "GtkType\n"
+ "%s_get_type (void)\n"
+ "{\n"
+ "\tstatic GtkType type = 0;\n\n"
+ "\tif (type == 0) {\n"
+ "\t\tstatic const GtkTypeInfo info = {\n"
+ "\t\t\t\"%s\",\n"
+ "\t\t\tsizeof (%s),\n"
+ "\t\t\tsizeof (%sClass),\n"
+ "\t\t\t(GtkClassInitFunc) %s_class_init,\n"
+ "\t\t\t(GtkObjectInitFunc) %s_init,\n"
+ "\t\t\t/* reserved_1 */ NULL,\n"
+ "\t\t\t/* reserved_2 */ NULL,\n"
+ "\t\t\t(GtkClassInitFunc) NULL\n"
+ "\t\t};\n\n"
+ "\t\ttype = bonobo_x_type_unique\n"
+ "\t\t\t(%s_get_type (),\n"
+ "\t\t\tPOA_%s__init, NULL,\n"
+ "\t\t\tGTK_STRUCT_OFFSET (%sClass, _epv),\n"
+ "\t\t\t&info);\n",
+ funcbase, typebase, typebase, typebase,
+ funcbase, funcbase, pfuncbase,
+ ((Class*)class)->bonobo_x_class,
+ typebase);
+ if(chunk_size) {
+ out_printf(out,
+ "#if %s > 0\n"
+ "\t\tgtk_type_set_chunk_alloc(type, %s);\n"
+ "#endif\n",
+ chunk_size, chunk_size);
+ }
+ out_printf(out,
+ "\t}\n\n"
+ "\treturn type;\n"
+ "}\n\n");
+}
+
+static void
+add_overrides(Class *c, const char *oname, gboolean did_base_obj)
+{
+ GList *li;
+ GHashTable *done;
+ char *s;
+
+ done = g_hash_table_new(g_str_hash, g_str_equal);
+ if(did_base_obj) {
+ s = g_strdup("GtkObject"); /* This was already done */
+ g_hash_table_insert(done, s, s);
+ s = g_strdup("GObject"); /* This was probably already done as well (if using Gtk/Glib 1.3/2.0) */
+ g_hash_table_insert(done, s, s);
+ }
+ for(li=c->nodes; li; li=g_list_next(li)) {
+ Node *n = li->data;
+ char *f;
+ Method *m = (Method *)n;
+ if(n->type != METHOD_NODE ||
+ m->method != OVERRIDE_METHOD)