+ if(destructors > 0) {
+ out_printf(out, "\t%s *self = %s (obj_self);\n",
+ typebase, macrobase);
+ }
+
+ if(destroy_handler) {
+ /* so we get possible bad argument warning */
+ if(destroy_handler->line_no > 0)
+ out_addline_infile(out, destroy_handler->line_no);
+ out_printf(out, "\t___%x_%s_destroy(obj_self);\n",
+ (guint)destroy_handler->unique_id, funcbase);
+ if(destroy_handler->line_no > 0)
+ out_addline_outfile(out);
+ } else {
+ out_printf(out,
+ "\tif(GTK_OBJECT_CLASS(parent_class)->destroy) \\\n"
+ "\t\t(* GTK_OBJECT_CLASS(parent_class)->destroy)(obj_self);\n");
+ }
+
+ if(destructors > 0) {
+ GList *li;
+ for(li = ((Class *)class)->nodes;
+ li != NULL;
+ li = li->next) {
+ Node *n = li->data;
+ Variable *v = (Variable *)n;
+ if(n->type == VARIABLE_NODE &&
+ v->scope != CLASS_SCOPE)
+ print_destructor(v);
+ }
+ }
+
+ out_printf(out, "\treturn;\n");
+ if(destructors > 0)
+ out_printf(out, "\tself = NULL;\n");
+ out_printf(out, "}\n"
+ "#undef __GOB_FUNCTION__\n\n");
+}
+
+static void
+add_finalize(Class *c)
+{
+ /* Sort of a hack to make it work with gtk+ 1.3/2.0 */
+ out_printf(out,
+ "\n#ifdef G_OBJECT_CLASS\n"
+ "static void\n"
+ "___finalize(GObject *obj_self)\n"
+ "#else /* !G_OBJECT_CLASS */\n"
+ "static void\n"
+ "___finalize(GtkObject *obj_self)\n"
+ "#endif /* G_OBJECT_CLASS */\n"
+ "{\n");
+ out_printf(out,
+ "#define __GOB_FUNCTION__ \"%s::finalize\"\n",
+ c->otype);
+
+ if(privates > 0) {
+ out_printf(out, "\t%s *self = %s (obj_self);\n",
+ typebase, macrobase);
+ out_printf(out, "\tgpointer priv = self->_priv;\n");
+ }
+
+ if(finalize_handler) {
+ /* so we get possible bad argument warning */
+ if(finalize_handler->line_no > 0)
+ out_addline_infile(out, finalize_handler->line_no);
+ out_printf(out, "\t___%x_%s_finalize(obj_self);\n",
+ (guint)finalize_handler->unique_id, funcbase);
+ if(finalize_handler->line_no > 0)
+ out_addline_outfile(out);
+ } else {
+ /* Sort of a hack to make it work with gtk+ 1.3/2.0 */
+ out_printf(out,
+ "#ifdef G_OBJECT_CLASS\n"
+ "\tif(G_OBJECT_CLASS(parent_class)->finalize) \\\n"
+ "\t\t(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n"
+ "#else /* !G_OBJECT_CLASS */\n"
+ "\tif(GTK_OBJECT_CLASS(parent_class)->finalize) \\\n"
+ "\t\t(* GTK_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n"
+ "#endif /* G_OBJECT_CLASS */\n");
+ }
+
+ if(privates > 0) {
+ out_printf(out, "\tg_free(priv);\n");
+ }
+
+ out_printf(out, "}\n"
+ "#undef __GOB_FUNCTION__\n\n");
+}
+
+static void
+add_inits(Class *c)
+{
+ GList *li;
+ for(li=c->nodes;li;li=g_list_next(li)) {
+ Node *n = li->data;
+ Method *m;
+
+ gboolean add_unused_class = FALSE;
+
+ if(n->type != METHOD_NODE)
+ continue;
+ m = (Method *)n;
+ if(m->method == INIT_METHOD) {
+ if(m->line_no > 0)
+ out_addline_infile(out, m->line_no);
+ print_method(out, "static ", "\n", "", " ", "\n",
+ m, FALSE, FALSE, TRUE);
+ if(m->line_no > 0)
+ out_addline_outfile(out);
+ out_printf(out, "{\n"
+ "#define __GOB_FUNCTION__ \"%s::init\"\n",
+ c->otype);
+ if(privates > 0) {
+ out_printf(out, "\t%s->_priv = "
+ "g_new0 (%sPrivate, 1);\n",
+ ((FuncArg *)m->args->data)->name,
+ typebase);
+ } else if(always_private_struct) {
+ out_printf(out, "\t%s->_priv = NULL;\n",
+ ((FuncArg *)m->args->data)->name);
+ }
+ if(initializers > 0) {
+ GList *li;
+ for(li = ((Class *)class)->nodes;
+ li != NULL;
+ li = li->next) {
+ Node *n = li->data;
+ Variable *v = (Variable *)n;
+ if(n->type != VARIABLE_NODE ||
+ v->scope == CLASS_SCOPE)
+ continue;
+ print_initializer(m, v);
+ }
+ }
+ } else if(m->method == CLASS_INIT_METHOD) {
+ gboolean did_base_obj = FALSE;
+
+ if(m->line_no > 0)
+ out_addline_infile(out, m->line_no);
+ print_method(out, "static ", "\n", "", " ", "\n",
+ m, FALSE, FALSE, TRUE);
+ if(m->line_no > 0)
+ out_addline_outfile(out);
+ out_printf(out, "{\n"
+ "#define __GOB_FUNCTION__ \"%s::class_init\"\n",
+ c->otype);
+ if(signals > 0 ||
+ set_arguments > 0 ||
+ get_arguments > 0 ||
+ need_destroy ||
+ need_finalize) {
+ add_unused_class = TRUE;
+ out_printf(out,
+ "\tGtkObjectClass *"
+ "gtk_object_class = "
+ "(GtkObjectClass*) %s;\n",
+ ((FuncArg *)m->args->data)->name);
+ out_printf(out,
+ "#ifdef G_OBJECT_CLASS\n"
+ "\tGObjectClass *"
+ "g_object_class = "
+ "(GObjectClass*) %s;\n"
+ "#endif /* G_OBJECT_CLASS */\n",
+ ((FuncArg *)m->args->data)->name);
+ did_base_obj = TRUE;
+ }
+
+ if(overrides > 0)
+ add_overrides(c,
+ ((FuncArg *)m->args->data)->name,
+ did_base_obj);
+
+ if(initializers > 0) {
+ GList *li;
+ for(li = ((Class *)class)->nodes;
+ li != NULL;
+ li = li->next) {
+ Node *n = li->data;
+ Variable *v = (Variable *)n;
+ if(n->type == VARIABLE_NODE &&
+ v->scope == CLASS_SCOPE)
+ print_initializer(m, v);
+ }
+ }
+
+ out_printf(out, "\n\tparent_class = ");
+ if(for_cpp)
+ out_printf(out, "(%sClass *)", ptypebase);
+ out_printf(out, "gtk_type_class (%s_get_type ());\n",
+ pfuncbase);
+
+ if(signals > 0)
+ add_signals(c);
+
+ set_def_handlers(c, ((FuncArg *)m->args->data)->name);
+
+ /* if there are no handlers for these things, we
+ * need to set them up here */
+ if(need_destroy && !destroy_handler)
+ out_printf(out, "\tgtk_object_class->destroy "
+ "= ___destroy;\n");
+ if(need_finalize && !finalize_handler)
+ out_printf(out,
+ "#ifdef G_OBJECT_CLASS\n"
+ "\tg_object_class->finalize = ___finalize;\n"
+ "#else /* !G_OBJECT_CLASS */\n"
+ "\tgtk_object_class->finalize = ___finalize;\n"
+ "#endif /* G_OBJECT_CLASS */\n");
+
+ if(get_arguments > 0 || set_arguments > 0)
+ make_arguments(c);
+
+ } else
+ continue;
+
+ if(m->cbuf) {
+ out_printf(out, " {\n");
+ out_addline_infile(out, m->ccode_line);
+ out_printf(out, "%s\n", m->cbuf);
+ out_addline_outfile(out);
+ out_printf(out, " }\n");
+ }
+ out_printf(out, "\treturn;\n");
+ out_printf(out,
+ "\t%s = NULL;\n",
+ ((FuncArg *)m->args->data)->name);
+ if(add_unused_class) {
+ out_printf(out,
+ "\tgtk_object_class = NULL;\n"
+ "#ifdef G_OBJECT_CLASS\n"
+ "\tg_object_class = NULL;\n"
+ "#endif /* G_OBJECT_CLASS */\n");
+ }
+ out_printf(out, "}\n"
+ "#undef __GOB_FUNCTION__\n");
+ }
+}
+
+static void
+add_getset_arg(Class *c, gboolean is_set)
+{
+ GList *li;
+ out_printf(out, "\nstatic void\n"
+ "___object_%s_arg (GtkObject *object,\n"
+ "\tGtkArg *arg,\n"
+ "\tguint arg_id)\n"
+ "#define __GOB_FUNCTION__ \"%s::%s_arg\"\n"
+ "{\n"
+ "\t%s *self;\n\n"
+ "\tself = %s (object);\n\n"
+ "\tswitch (arg_id) {\n",
+ is_set ? "set" : "get",
+ c->otype, is_set ? "set" : "get",
+ typebase, macrobase);
+
+ for(li=c->nodes;li;li=g_list_next(li)) {