]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 1.0.10
[gob-dx.git] / src / main.c
index d94361a885aad4d5aec038557876ebc79178573f..0cdd6ff822254463a70a4a45020009a8a76432b6 100644 (file)
@@ -94,7 +94,7 @@ gboolean no_gnu = FALSE;
 gboolean exit_on_warn = FALSE;
 gboolean exit_on_error = TRUE;
 gboolean got_error = FALSE;
-gint private_header = PRIVATE_HEADER_ALWAYS;
+gint private_header = PRIVATE_HEADER_ONDEMAND;
 gboolean no_extern_c = FALSE;
 gboolean no_write = FALSE;
 gboolean no_lines = FALSE;
@@ -559,7 +559,8 @@ make_inits(Class *cl)
                                  NULL, NULL, NULL, g_strdup("class_init"),
                                  make_func_arg(cl->otype, TRUE, g_strdup("c")),
                                  NULL, NULL, NULL, 0, 0, FALSE,
-                                 method_unique_id++);
+                                 method_unique_id++,
+                                 FALSE /*bonobo_x_func*/);
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
        if(!got_init) {
@@ -569,7 +570,8 @@ make_inits(Class *cl)
                                  NULL, NULL, NULL, g_strdup("init"),
                                  make_func_arg(cl->otype, FALSE, g_strdup("o")),
                                  NULL, NULL, NULL, 0, 0, FALSE,
-                                 method_unique_id++);
+                                 method_unique_id++,
+                                 FALSE /*bonobo_x_func*/);
                cl->nodes = g_list_prepend(cl->nodes, node);
        }
 }
@@ -752,14 +754,17 @@ add_signal_prots(Method *m)
                        "\t(*rfunc)((%s *)object", s, s, typebase);
        } else {
                const char *retcast = get_cast(m->gtktypes->data, FALSE);
+               gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
                out_printf(out,
                           "\t___%s rfunc;\n\t"
                           "%s *retval;\n\n"
                           "\trfunc = (___%s)func;\n\n"
                           "\tretval = GTK_RETLOC_%s(args[%d]);\n\n"
                           "\t*retval = (*rfunc)((%s *)object",
-                          s, retcast, s, (char *)m->gtktypes->data,
-                          g_list_length(m->gtktypes)-1, typebase);
+                          s, retcast, s,
+                          (char *)m->gtktypes->data,
+                          g_list_length(m->gtktypes) - (is_none ? 2 : 1),
+                          typebase);
        }
        print_signal_marsal_args(m);
 
@@ -847,6 +852,49 @@ add_get_type(void)
                   "}\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)
 {
@@ -1353,6 +1401,36 @@ add_finalize(Class *c)
                   "#undef __GOB_FUNCTION__\n\n");
 }
 
+static void
+make_bonobo_x_epv (Class *c, const char *classname)
+{
+       GList *li;
+       gboolean added_line = FALSE;
+
+       for (li = c->nodes; li != NULL; li = li->next) {
+               Node *n = li->data;
+               Method *m = (Method *)n;
+               if(n->type != METHOD_NODE ||
+                  m->method == OVERRIDE_METHOD)
+                       continue;
+
+               if (m->bonobo_x_func) {
+                       if(m->line_no > 0) {
+                               out_addline_infile(out, m->line_no);
+                               added_line = TRUE;
+                       } else if (m->line_no == 0 &&
+                                  added_line) {
+                               out_addline_outfile(out);
+                               added_line = FALSE;
+                       }
+                       out_printf (out, "\t%s->_epv.%s = %s;\n",
+                                   classname, m->id, m->id);
+               }
+       }
+       if (added_line)
+               out_addline_outfile(out);
+}
+
 static void
 add_inits(Class *c)
 {
@@ -1476,6 +1554,9 @@ add_inits(Class *c)
                        if(get_arguments > 0 || set_arguments > 0)
                                make_arguments(c);
 
+                       if (c->bonobo_x_class != NULL) {
+                               make_bonobo_x_epv (c, ((FuncArg *)m->args->data)->name);
+                       }
                } else
                        continue;
 
@@ -1674,6 +1755,8 @@ print_preconditions(Method *m)
 static void
 print_method_body(Method *m, int pre)
 {
+       if (m->line_no > 0)
+               out_addline_outfile(out);
        out_printf(out, "{\n"
                   "#define __GOB_FUNCTION__ \"%s::%s\"\n",
                   ((Class *)class)->otype,
@@ -2166,6 +2249,7 @@ print_class_block(Class *c)
                out_printf(out, "#define SELF(x) %s(x)\n", macrobase);
                out_printf(out, "#define SELF_CONST(x) %s_CONST(x)\n", macrobase);
                out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois);
+               out_printf(out, "#define TYPE_SELF %s\n", macrotype);
                out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n",
                           macrobase);
                out_printf(out, "#define SELF_GET_CLASS(x) %s_GET_CLASS(x)\n\n",
@@ -2275,6 +2359,13 @@ print_class_block(Class *c)
                if(n->type == METHOD_NODE)
                        put_vs_method((Method *)n);
        }
+       /* If BonoboX type class put down the epv */
+       if (c->bonobo_x_class != NULL) {
+               out_printf (outh,
+                           "\t/* Bonobo object epv */\n"
+                           "\tPOA_%s__epv _epv;\n",
+                           c->bonobo_x_class);
+       }
        /* put class scope variables */
        for(l = c->nodes; l != NULL; l = l->next) {
                Node *n = l->data;
@@ -2301,11 +2392,13 @@ print_class_block(Class *c)
                   " * Public methods\n"
                   " */\n");
 
-       out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase);
-       if ( ! no_gnu) {
-               out_printf(outh, " G_GNUC_CONST;\n");
-       } else {
-               out_printf(outh, ";\n");
+       if ( ! overrode_get_type) {
+               out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase);
+               if ( ! no_gnu) {
+                       out_printf(outh, " G_GNUC_CONST;\n");
+               } else {
+                       out_printf(outh, ";\n");
+               }
        }
 
        for(l = c->nodes; l != NULL; l = l->next) {
@@ -2359,8 +2452,12 @@ print_class_block(Class *c)
 
        add_enums(c);
 
-       if ( ! overrode_get_type)
-               add_get_type();
+       if ( ! overrode_get_type) {
+               if (c->bonobo_x_class != NULL)
+                       add_bonobo_x_get_type ();
+               else
+                       add_get_type ();
+       }
 
        if(any_method_to_alias(c)) {
                if( ! no_gnu) {