X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/b3db2950b11fc5f3abd9ecdae855746e2d19c836..a8ea1a669f332b0ed29c6271896476f59f357533:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 917476a..f5d3688 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1,6 +1,7 @@ /* GOB C Preprocessor * Copyright (C) 1999-2000 the Free Software Foundation. - * Copyright (C) 2001 George Lebl + * Copyright (C) 2000 Eazel, Inc. + * Copyright (C) 2001-2004 George (Jiri) Lebl * * Author: George Lebl * @@ -45,6 +46,7 @@ static GList *error_vals = NULL; static char *chunk_size = NULL; static char *bonobo_object_class = NULL; +static int glade_xml = FALSE; static GList *interfaces = NULL; static GList *typestack = NULL; static GList *funcargs = NULL; @@ -60,6 +62,7 @@ static int destructor_line = 0; static gboolean destructor_simple = TRUE; static char *initializer = NULL; static int initializer_line = 0; +static int glade_widget = FALSE; static char *onerror = NULL; static char *defreturn = NULL; @@ -77,6 +80,7 @@ int yylex(void); extern int ccode_line; extern int line_no; +extern gboolean for_cpp; extern char *yytext; @@ -124,6 +128,7 @@ push_variable (char *name, int scope, int line_no, char *postfix) var = node_new (VARIABLE_NODE, "scope", scope, "vtype:steal", type, + "glade_widget", glade_widget, "id:steal", name, "line_no", line_no, "destructor_unref", destructor_unref, @@ -132,8 +137,10 @@ push_variable (char *name, int scope, int line_no, char *postfix) "destructor_simple", destructor_simple, "initializer:steal", initializer, "initializer_line", initializer_line, + "initializer_simple", TRUE, NULL); class_nodes = g_list_append(class_nodes, var); + glade_widget = FALSE; } static void @@ -460,6 +467,41 @@ get_prop_enum_flag_cast (Property *prop) return ret; } +static void +add_construct_glade (char * file, char * root, char * domain) +{ + Node *var; + Type * type; + GList * flags = NULL; + char * set; + + type = (Type *)node_new (TYPE_NODE, + "name", "GladeXML", + "pointer", "*", + NULL); + initializer = g_strdup_printf("\t{\n" + "\tGtkWidget * root;\n" + "\to->_priv->_glade_xml = glade_xml_new(%s, %s, %s);\n" + "\troot = glade_xml_get_widget(o->_priv->_glade_xml, %s);\n" + "\tgtk_widget_show(root);\n" + "\tgtk_container_add(GTK_CONTAINER(o), root);\n" + "\tglade_xml_signal_autoconnect_full(o->_priv->_glade_xml, (GladeXMLConnectFunc)___glade_xml_connect_foreach, (gpointer)o);\n" + "}\n", file, root, domain ? domain : "NULL", root); + + var = node_new (VARIABLE_NODE, + "scope", PRIVATE_SCOPE, + "vtype:steal", type, + "glade_widget", FALSE, + "id:steal", "_glade_xml", + "destructor_unref", FALSE, + "destructor", "g_object_unref", + "destructor_simple", TRUE, + "initializer", initializer, + "initializer_simple", FALSE, + NULL); + class_nodes = g_list_prepend(class_nodes, var); +} + static void property_link_and_export (Node *node) { @@ -551,14 +593,21 @@ property_link_and_export (Node *node) get_func = g_strdup_printf ("g_value_get_%s", prop->gtktype); g_strdown (get_func); - if (strcmp (prop->gtktype, "FLAGS") == 0) { - setcast = "(guint) "; - getcast = to_free = - get_prop_enum_flag_cast (prop); - } else if (strcmp (prop->gtktype, "ENUM") == 0) { - setcast = "(gint) "; - getcast = to_free = - get_prop_enum_flag_cast (prop); + if (for_cpp) { + if (strcmp (prop->gtktype, "FLAGS") == 0) { + setcast = "(guint) "; + getcast = to_free = + get_prop_enum_flag_cast (prop); + } else if (strcmp (prop->gtktype, "ENUM") == 0) { + setcast = "(gint) "; + getcast = to_free = + get_prop_enum_flag_cast (prop); + } else if (strcmp (prop->gtktype, "POINTER") == 0) { + setcast = "(gpointer) "; + getcast = g_strdup_printf ("(%s%s) ", + prop->ptype->name, + prop->ptype->pointer ? prop->ptype->pointer : ""); + } } set = g_strdup_printf("%s->%s = %s%s (VAL);", @@ -726,10 +775,12 @@ classdec: CLASS TYPETOKEN FROM TYPETOKEN classflags { "otype:steal", $2, "ptype:steal", $4, "bonobo_object_class:steal", bonobo_object_class, + "glade_xml", glade_xml, "interfaces:steal", interfaces, "chunk_size:steal", chunk_size, NULL); bonobo_object_class = NULL; + glade_xml = FALSE; chunk_size = NULL; interfaces = NULL; } @@ -769,6 +820,42 @@ classflags: YYERROR; } } + | '(' TOKEN STRING STRING ')' classflags { + if (strcmp ($2, "GladeXML") == 0) { + glade_xml = TRUE; + add_construct_glade($3, $4, NULL); + } else { + yyerror(_("parse error")); + YYERROR; + } + } + | '(' TOKEN STRING STRING STRING ')' classflags { + if (strcmp ($2, "GladeXML") == 0) { + glade_xml = TRUE; + add_construct_glade($3, $4, $5); + } else { + yyerror(_("parse error")); + YYERROR; + } + } + | '(' TOKEN TOKEN STRING ')' classflags { + if (strcmp ($2, "GladeXML") == 0) { + glade_xml = TRUE; + add_construct_glade($3, $4, NULL); + } else { + yyerror(_("parse error")); + YYERROR; + } + } + | '(' TOKEN TOKEN STRING STRING ')' classflags { + if (strcmp ($2, "GladeXML") == 0) { + glade_xml = TRUE; + add_construct_glade($3, $4, $5); + } else { + yyerror(_("parse error")); + YYERROR; + } + } ; classcode: classcode thing { ; } @@ -869,6 +956,14 @@ varoptions: destructor initializer { ; } | initializer destructor { ; } | initializer { destructor = NULL; } | destructor { initializer = NULL; } + | TOKEN { + if (strcmp ($1, "GladeXML") == 0) { + glade_widget = TRUE; + } else { + yyerror(_("parse error")); + YYERROR; + } + } | { destructor = NULL; initializer = NULL; @@ -1337,7 +1432,12 @@ param_spec_value: NICK '=' string { } | TOKEN { ensure_property (); - if (strcmp ($1, "link") == 0) { + if (strcmp ($1, "override") == 0) { + g_free($1); + node_set ((Node *)property, + "override", TRUE, + NULL); + } else if (strcmp ($1, "link") == 0) { g_free($1); node_set ((Node *)property, "link", TRUE,