X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/d52e64e92557f0b6d7704077ec175c88fa7ca243..4f931a71edce4d7456c233487703a894410fd599:/src/main.c diff --git a/src/main.c b/src/main.c index b4d1b27..424f12c 100644 --- a/src/main.c +++ b/src/main.c @@ -120,8 +120,12 @@ gboolean no_write = FALSE; gboolean no_lines = FALSE; gboolean no_self_alias = FALSE; gboolean always_private_struct = FALSE; +gboolean gtk3_ok = FALSE; + gint prealloc = 0; + + gboolean use_m4 = FALSE; /* preprocess sources with m4 */ gboolean use_m4_clean = FALSE; /* preprocess sources with m4, no m4 flags */ char *m4_commandline = NULL; @@ -929,10 +933,10 @@ add_signal_prots(Method *m) /* hack because glib is braindamaged */ set_func = g_strdup ("g_value_set_uint"); else - set_func = g_strdup_printf ("g_value_set_%s%s", - (char *)m->gtktypes->data, + set_func = g_strdup_printf ("g_value_%s_%s", take_ownership ? - "_take_ownership" : ""); + "take" : "set", + (char *)m->gtktypes->data); gob_strdown (set_func); out_printf (out, "\n\t%s (return_value, v_return);\n", @@ -1047,17 +1051,26 @@ add_interface_inits (Class *c) char *name = replace_sep (interface, '_'); char *type = remove_sep (interface); - /* EEEK! evil, we should have some sort of option - * to force this for arbitrary interfaces, since - * some are Class and some are Iface. Glib is shite - * in consistency. */ - if (strcmp (type, "GtkEditable") == 0 || - strcmp (type, "GTypePlugin") == 0) - end = "Class"; + if(!gtk3_ok) + { + /* EEEK! evil, we should have some sort of option + * to force this for arbitrary interfaces, since + * some are Class and some are Iface. Glib is shite + * in consistency. */ + + if (strcmp (type, "GtkEditable") == 0 || + strcmp (type, "GTypePlugin") == 0) + end = "Class"; + else + // We'll assume Iface is the standard ending + end = "Iface"; + } else - /* We'll assume Iface is the standard ending */ - end = "Iface"; - + { + /*GTK3 doesn't need Iface end*/ + end="Interface"; + } + out_printf (out, "\nstatic void\n" "___%s_init (%s%s *iface)\n" "{\n", @@ -1113,6 +1126,29 @@ add_interfaces (void) } } +static void +add_dynamic_interfaces(void) +{ + GList *li; + for (li = ((Class *)class)->interfaces; + li != NULL; + li = li ->next) { + char *name = replace_sep (li->data, '_'); + char *type = make_pre_macro (li->data, "TYPE"); + + out_printf(out, + "\t\tg_type_module_add_interface(\n" + "\t\t\ttype_module,\n" + "\t\t\t%s_type_id,\n" + "\t\t\t%s,\n" + "\t\t\t&%s_info);\n", + funcbase, type, name); + + g_free(type); + g_free(name); + } +} + static void add_get_type(void) { @@ -1161,6 +1197,57 @@ add_get_type(void) "}\n\n"); } +static void +add_dynamic_get_type (void) +{ + out_printf(out, + "static GType %s_type_id;\n\n" + "GType\n" + "%s_get_type (void)\n" + "{\n" + "\treturn %s_type_id;\n" + "}\n\n", + funcbase, funcbase, funcbase); + + out_printf(out, + "void\n" + "%s_register_type (GTypeModule *type_module)\n" + "{\n" + "\tstatic const GTypeInfo info = {\n" + "\t\tsizeof (%sClass),\n" + "\t\t(GBaseInitFunc) NULL,\n" + "\t\t(GBaseFinalizeFunc) NULL,\n" + "\t\t(GClassInitFunc) %s_class_init,\n" + "\t\t(GClassFinalizeFunc) NULL,\n" + "\t\tNULL /* class_data */,\n" + "\t\tsizeof (%s),\n" + "\t\t%d /* n_preallocs */,\n" + "\t\t(GInstanceInitFunc) %s_init,\n" + "\t\tNULL\n" + "\t};\n\n", + funcbase, typebase, funcbase, typebase, prealloc, funcbase); + + add_interface_infos(); + + out_printf(out, + "\t%s_type_id = g_type_module_register_type(\n" + "\t\ttype_module,\n" + "\t\t%s,\n" + "\t\t\"%s\",\n" + "\t\t&info,\n" + "\t\t(GTypeFlags)%s\n" + "\t);\n\n" + "\t{\n", + funcbase, pmacrotype, typebase, + ((Class *)class)->abstract ? "G_TYPE_FLAG_ABSTRACT" : "0"); + + add_dynamic_interfaces(); + + out_printf(out, + "\t}\n" + "}\n\n"); +} + static void add_bonobo_object_get_type (void) { @@ -1350,14 +1437,14 @@ add_signals(Class *c) gob_strup (sig); flags = make_run_signal_flags (m, last); out_printf (out, "\tobject_signals[%s_SIGNAL] =\n" - "\t\tg_signal_new (\"%s\",\n" + "\t\tg_signal_new (%s,\n" "\t\t\tG_TYPE_FROM_CLASS (g_object_class),\n" "\t\t\t(GSignalFlags)(%s),\n" "\t\t\tG_STRUCT_OFFSET (%sClass, %s),\n" "\t\t\tNULL, NULL,\n" "\t\t\t%s,\n" "\t\t\tG_TYPE_%s, %d", - sig, m->id, + sig, m->signal_name /*m->id* if not given signal_name*/, flags, typebase, m->id, mar, (char *)m->gtktypes->data, @@ -1680,7 +1767,7 @@ make_property (Property *p) gob_strup (s); out_printf (out, "\tg_object_class_override_property (g_object_class,\n" "\t\tPROP_%s,\n" - "\t\t\"%s\");\n", s, p->name); + "\t\t\"%s\");\n", s, value_for_print (p->canonical_name, p->name) ); g_free (s); } else { GString *flags; @@ -1732,7 +1819,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "-128"), @@ -1748,7 +1835,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "0"), @@ -1762,7 +1849,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "FALSE"), @@ -1776,7 +1863,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "G_MININT"), @@ -1792,7 +1879,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "0"), @@ -1808,7 +1895,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "G_MINLONG"), @@ -1824,7 +1911,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "0"), @@ -1840,7 +1927,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "G_MININT64"), @@ -1856,7 +1943,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "0"), @@ -1870,7 +1957,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "0"), @@ -1885,7 +1972,7 @@ make_property (Property *p) "\t\t %s /* enum_type */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), type, @@ -1902,7 +1989,7 @@ make_property (Property *p) "\t\t %s /* flags_type */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), type, @@ -1918,7 +2005,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "-G_MAXFLOAT"), @@ -1934,7 +2021,7 @@ make_property (Property *p) "\t\t %s /* maximum */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->minimum, "-G_MAXDOUBLE"), @@ -1948,7 +2035,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* default_value */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "NULL"), @@ -1962,7 +2049,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* param_type */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), type, @@ -1977,7 +2064,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* boxed_type */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), type, @@ -1989,7 +2076,7 @@ make_property (Property *p) "\t\t %s /* nick */,\n" "\t\t %s /* blurb */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), flags->str); @@ -2000,7 +2087,7 @@ make_property (Property *p) "\t\t %s /* nick */,\n" "\t\t %s /* blurb */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), flags->str); @@ -2013,7 +2100,7 @@ make_property (Property *p) "\t\t %s /* blurb */,\n" "\t\t %s /* object_type */,\n" "\t\t %s);\n", - p->name, + value_for_print (p->canonical_name, p->name), value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), type, @@ -3639,8 +3726,23 @@ print_class_block(Class *c) " * Public methods\n" " */\n"); - if ( ! overrode_get_type) { - out_printf (outh, "GType\t%s_get_type\t(void) G_GNUC_CONST;\n", funcbase); + if (!overrode_get_type) { + /* + * For ordinary "static" types it should be safe to mark the + * get_type implementation as const, since the get_type + * function return really is constant at the call boundary + * (even though there is an initial setup on the first call). + * But for dynamic types, since the registration is explicitly + * separated, we need to settle for "pure" as the results of + * get_type differ before and after type registration. + */ + out_printf(outh, "GType\t%s_get_type\t(void) %s;\n", funcbase, + c->dynamic ? "G_GNUC_PURE" : "G_GNUC_CONST"); + } + + if (c->dynamic) { + out_printf(outh, "void\t%s_register_type\t(GTypeModule *);\n", + funcbase); } for(li = c->nodes; li != NULL; li = li->next) { @@ -3708,11 +3810,13 @@ print_class_block(Class *c) add_interface_inits (c); - if ( ! overrode_get_type) { + if (!overrode_get_type) { if (c->bonobo_object_class != NULL) - add_bonobo_object_get_type (); + add_bonobo_object_get_type(); + else if (c->dynamic) + add_dynamic_get_type(); else - add_get_type (); + add_get_type(); } out_printf (out, "/* a macro for creating a new object of our type */\n"); @@ -4282,7 +4386,9 @@ print_help(void) "\t-o,--output-dir The directory where output " "should be placed\n" "\t--file-sep[=c] replace default \'-\' file " - "name separator\n\n"); + "name separator\n\n" + "\t--gtk3 Use gtk+3\n" + ); fprintf(stderr, "End world hunger, donate to the World Food Programme, http://www.wfp.org\n"); } @@ -4416,6 +4522,8 @@ parse_options(int argc, char *argv[]) } else { file_sep = 0; } + } else if(strcmp(argv[i], "--gtk3")==0) { + gtk3_ok = TRUE; } else if(strcmp(argv[i], "--")==0) { /*further arguments are files*/ no_opts = TRUE;