X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/4f0369e24277442e70d0edaab02b022bc7a2b6f5..a8ea1a669f332b0ed29c6271896476f59f357533:/src/main.c diff --git a/src/main.c b/src/main.c index f62f2f7..a353061 100644 --- a/src/main.c +++ b/src/main.c @@ -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 \n"); + out_printf(outph ? outph : outh, "#include \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 ();