]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 2.0.12
[gob-dx.git] / src / main.c
index f62f2f7065eda2c5c16720b8d6b3c003801af61a..a353061207aca83f582af43990a7ea5db4715280 100644 (file)
@@ -77,6 +77,7 @@ static int protecteds = 0; /* number of protected methods */
 static int unreftors = 0; /* number of variable unreffing destructors */
 static int destructors = 0; /* number of variable non-unreffing destructors */
 static int initializers = 0; /* number of variable initializers */
+static int glade_widgets = 0; /* number of glade widgets */
 static gboolean overrode_get_type = FALSE; /* provided your won _get_type */
 
 static gboolean made_aliases = FALSE;  /* if we made any shorthand aliases
@@ -110,6 +111,7 @@ gboolean no_write = FALSE;
 gboolean no_lines = FALSE;
 gboolean no_self_alias = FALSE;
 gboolean always_private_struct = FALSE;
+gint prealloc = 0;
 
 gboolean use_m4 = FALSE; /* preprocess sources with m4 */
 gboolean use_m4_clean = FALSE; /* preprocess sources with m4, no m4 flags */
@@ -1070,11 +1072,11 @@ add_get_type(void)
                   "\t\t\t(GClassFinalizeFunc) NULL,\n"
                   "\t\t\tNULL /* class_data */,\n"
                   "\t\t\tsizeof (%s),\n"
-                  "\t\t\t0 /* n_preallocs */,\n"
+                  "\t\t\t%d /* n_preallocs */,\n"
                   "\t\t\t(GInstanceInitFunc) %s_init,\n"
                   "\t\t\tNULL\n"
                   "\t\t};\n\n",
-                  funcbase, typebase, funcbase, typebase, funcbase);
+                  funcbase, typebase, funcbase, typebase, prealloc, funcbase);
 
        add_interface_infos ();
 
@@ -1428,8 +1430,8 @@ make_argument (Argument *a)
        char *argflags[] = {
                "CONSTRUCT",
                "CONSTRUCT_ONLY",
-               "CHILD_ARG",
-               "MASK",
+               "LAX_VALIDATION",
+               "PRIVATE",
                NULL
        };
 
@@ -1459,13 +1461,7 @@ make_argument (Argument *a)
                        if(strcmp(argflags[i], flag)==0)
                                break;
                }
-               /* if we haven't found it in our list */
-               if( ! argflags[i]) {
-                       error_printf(GOB_WARN, a->line_no,
-                                    "Unknown flag '%s' used, "
-                                    "perhaps it was misspelled", flag);
-               }
-               g_string_sprintfa(flags, " | G_PARAM_%s", flag);
+               g_string_sprintfa(flags, " | %s%s", argflags[i] ? "G_PARAM_" : "", flag);
        }
 
        g_string_append (flags, ")");
@@ -1625,8 +1621,8 @@ make_property (Property *p)
                char *argflags[] = {
                        "CONSTRUCT",
                        "CONSTRUCT_ONLY",
-                       "CHILD_ARG",
-                       "MASK",
+                       "LAX_VALIDATION",
+                       "PRIVATE",
                        NULL
                };
 
@@ -1655,13 +1651,7 @@ make_property (Property *p)
                                if(strcmp(argflags[i], flag)==0)
                                        break;
                        }
-                       /* if we haven't found it in our list */
-                       if( ! argflags[i]) {
-                               error_printf(GOB_WARN, p->line_no,
-                                            "Unknown flag '%s' used, "
-                                            "perhaps it was misspelled", flag);
-                       }
-                       g_string_sprintfa(flags, " | G_PARAM_%s", flag);
+                       g_string_sprintfa(flags, " | %s%s", argflags[i] ? "G_PARAM_" : "", flag);
                }
 
                g_string_append (flags, ")");
@@ -2024,8 +2014,11 @@ print_initializer(Method *m, Variable *v)
        if(v->initializer_line > 0)
                out_addline_infile(out, v->initializer_line);
 
-       out_printf(out, "\t%s->%s = %s;\n",
+       if (v->initializer_simple)
+               out_printf(out, "\t%s->%s = %s;\n",
                   root, v->id, v->initializer);
+       else
+               out_printf(out,v->initializer);
 
        if(v->initializer_line > 0)
                out_addline_outfile(out);
@@ -2033,6 +2026,28 @@ print_initializer(Method *m, Variable *v)
        g_free(root);
 }
 
+static void
+print_glade_widget(Method *m, Variable *v)
+{
+       char *root;
+  char *cast;
+       
+       if(!v->glade_widget)
+               return;
+
+       if(v->scope == PRIVATE_SCOPE)
+               root = g_strconcat(((FuncArg *)m->args->data)->name,
+                                  "->_priv", NULL);
+       else
+               root = g_strdup(((FuncArg *)m->args->data)->name);
+
+       cast = get_type(v->vtype, FALSE);
+       out_printf(out, "\t%s->%s = (%s)glade_xml_get_widget(%s->_glade_xml, \"%s\");\n",
+                  root, v->id, cast, root, v->id);
+
+       g_free(root);
+}
+       
 static void
 print_destructor (Variable *v)
 {
@@ -2250,9 +2265,10 @@ add_inits(Class *c)
                                   c->otype);
                        if (privates > 0) {
                                out_printf(out, "\t%s->_priv = "
-                                               "G_TYPE_INSTANCE_GET_PRIVATE(%s,TYPE_SELF,%sPrivate);\n",
+                                               "G_TYPE_INSTANCE_GET_PRIVATE(%s,%s,%sPrivate);\n",
                                                ((FuncArg *)m->args->data)->name,
                                                ((FuncArg *)m->args->data)->name,
+                                               macrotype,
                                                typebase);
                        } else if(always_private_struct) {
                                out_printf(out, "\t%s->_priv = NULL;\n",
@@ -2271,6 +2287,19 @@ add_inits(Class *c)
                                        print_initializer(m, v);
                                }
                        }
+                       if(glade_widgets > 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_glade_widget(m, v);
+                               }
+                       }
                } else if(m->method == CLASS_INIT_METHOD) {
                        gboolean did_base_obj = FALSE;
 
@@ -3257,6 +3286,12 @@ print_class_block(Class *c)
        char *s;
        gboolean printed_private = FALSE;
 
+       if (c->glade_xml)
+       {
+               out_printf(outph ? outph : outh, "#include <gtk/gtk.h>\n");
+               out_printf(outph ? outph : outh, "#include <glade/glade-xml.h>\n\n");
+       }
+       
        if(any_special) {
                out_printf(out, "/* utility types we may need */\n");
                if(special_array[SPECIAL_2POINTER])
@@ -3383,16 +3418,19 @@ print_class_block(Class *c)
 
                out_printf (outfp, "struct _%sPrivate {\n",
                            typebase);
-               for(li=c->nodes; li; li=li->next) {
-                       Node *n = li->data;
-                       Variable *v = (Variable *)n;
-                       if(n->type == VARIABLE_NODE &&
-                          v->scope == PRIVATE_SCOPE) {
-                               out_addline_infile(outfp, v->line_no);
-                               put_variable(v, outfp);
+               if (privates > 0)
+               {
+                for(li=c->nodes; li; li=li->next) {
+                        Node *n = li->data;
+                        Variable *v = (Variable *)n;
+                        if(n->type == VARIABLE_NODE &&
+                                       v->scope == PRIVATE_SCOPE) {
+                                out_addline_infile(outfp, v->line_no);
+                                put_variable(v, outfp);
+                        }
                        }
+                       out_addline_outfile(outfp);
                }
-               out_addline_outfile(outfp);
                out_printf(outfp, "};\n");
        }
 
@@ -3538,6 +3576,43 @@ print_class_block(Class *c)
                    no_gnu ? "" : " G_GNUC_UNUSED",
                    typebase, typebase, typebase, funcbase);
 
+       if (c->glade_xml)
+       {
+               out_printf (out, "/* a function to connect glade callback */\n");
+               out_printf (out,"static void\n"
+                           "___glade_xml_connect_foreach(const gchar *handler_name,\n"
+                           "GObject *object,\n"
+                           "const gchar *signal_name,\n"
+                           "const gchar *signal_data,\n"
+                           "GObject *connect_object,\n"
+                           "gboolean after,\n"
+                           "gpointer user_data)\n"
+                           "{\n"
+                           "\tstatic GModule * allsymbols = NULL;\n"
+                           "   \n"
+                           "\tif (!allsymbols) allsymbols = g_module_open(NULL, 0);\n"
+                           "\tif (allsymbols) {\n"
+                           "\t\tgchar * func_name = g_strdup_printf(\"%s_%%s\", handler_name);\n"
+                           "\t\tGCallback func;\n"
+                           "\n"
+                           "\t\tif (!g_module_symbol(allsymbols, func_name, (gpointer)&func)){\n"
+                           "\t\t\tif (!g_module_symbol(allsymbols, handler_name, (gpointer)&func)) {\n"
+                           "\t\t\t\tg_warning(\"could not find signal handler '%%s'.\", func_name);\n"
+                           "\t\t\t\tg_free(func_name);\n"
+                           "\t\t\t\treturn;\n"
+                           "\t\t\t}\n"
+                           "\t\t}\n"
+                           "\t\tif (after)\n"
+                           "\t\t\tg_signal_connect_data(object, signal_name, func, user_data, NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);\n"
+                           "\t\telse\n"
+                           "\t\t\tg_signal_connect_data(object, signal_name, func, user_data, NULL, G_CONNECT_SWAPPED);\n"
+                           "\t\tg_free(func_name);\n"
+                           "\t}\n"
+                           "}\n"
+                           "\n",
+                           funcbase);
+       }
+
        if (need_dispose)
                add_dispose (c);
 
@@ -4290,6 +4365,7 @@ main(int argc, char *argv[])
        unreftors = count_unreftors ((Class *)class);
        destructors = count_destructors ((Class *)class);
        initializers = count_initializers ((Class *)class);
+       glade_widgets = count_glade_widgets ((Class *)class);
        overrode_get_type = find_get_type ((Class *)class);
 
        make_bases ();