/* 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
*
static GList *flag_vals = NULL;
static GList *error_vals = NULL;
+static gboolean abstract = FALSE;
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;
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;
extern int ccode_line;
extern int line_no;
+extern gboolean for_cpp;
extern char *yytext;
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,
"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
node_free ((Node *)the_type);
}
+static char *
+get_prop_enum_flag_cast (Property *prop)
+{
+ char *tmp, *ret;
+ if (prop->extra_gtktype == NULL ||
+ /* HACK! just in case someone made this
+ * work with 2.0.0 by using the TYPE
+ * macro directly */
+ ((strstr (prop->extra_gtktype, "_TYPE_") != NULL ||
+ strstr (prop->extra_gtktype, "TYPE_") == prop->extra_gtktype) &&
+ strchr (prop->extra_gtktype, ':') == NULL)) {
+ if (prop->ptype != NULL)
+ return get_type (prop->ptype, TRUE);
+ else
+ return g_strdup ("");
+ }
+ tmp = remove_sep (prop->extra_gtktype);
+ ret = g_strdup_printf ("(%s) ", tmp);
+ g_free (tmp);
+ return ret;
+}
+
+static void
+add_construct_glade (char * file, char * root, char * domain)
+{
+ Node *var;
+ Type * type;
+ GList * flags = NULL;
+
+ type = (Type *)node_new (TYPE_NODE,
+ "name", "GladeXML",
+ "pointer", "*",
+ NULL);
+ initializer = g_strdup_printf("\t{\n"
+ "\tGtkWidget * root;\n"
+ "\t%%1$s->_priv->_glade_xml = glade_xml_new(%s, %s, %s);\n"
+ "\troot = glade_xml_get_widget(%%1$s->_priv->_glade_xml, %s);\n"
+ "\tgtk_widget_show(root);\n"
+ "\tgtk_container_add(GTK_CONTAINER(%%1$s), root);\n"
+ "\tglade_xml_signal_autoconnect_full(%%1$s->_priv->_glade_xml, (GladeXMLConnectFunc)___glade_xml_connect_foreach, (gpointer)%%1$s);\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)
{
get = g_strdup_printf("g_value_set_string (VAL, %s->%s);",
root, prop->name);
} else if (strcmp (prop->gtktype, "OBJECT") == 0) {
- set = g_strdup_printf("{ GtkObject *___old = (GtkObject *)%s->%s; "
- "GtkObject *___new = (GtkObject *)gtk_value_get_object (VAL); "
- "if (___new != NULL) { "
- "gtk_object_ref (GTK_OBJECT (___new)); "
- "%s->%s = GTK_OBJECT (___new); "
- "} else { "
- "%s->%s = NULL; "
- "} "
+ char *cast;
+ if (prop->extra_gtktype != NULL) {
+ cast = remove_sep (prop->extra_gtktype);
+ } else {
+ cast = g_strdup ("void");
+ }
+ set = g_strdup_printf("{ GObject *___old = (GObject *)%s->%s; "
+ "%s->%s = (%s *)g_value_dup_object (VAL); "
"if (___old != NULL) { "
- "gtk_object_unref (GTK_OBJECT (___old)); "
+ "g_object_unref (G_OBJECT (___old)); "
"} "
"}",
root, prop->name,
root, prop->name,
- root, prop->name);
- get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
- root, prop->name);
+ cast);
+ get = g_strdup_printf ("g_value_set_object (VAL, "
+ "(gpointer)%s->%s);",
+ root, prop->name);
+ g_free (cast);
} else if (strcmp (prop->gtktype, "BOXED") == 0) {
+ char *type = make_me_type (prop->extra_gtktype,
+ "G_TYPE_BOXED");
if (prop->extra_gtktype == NULL) {
error_print (GOB_ERROR, prop->line_no,
_("Property linking requested for BOXED, but "
"boxed_type not set"));
}
set = g_strdup_printf("{ gpointer ___old = (gpointer)%s->%s; "
- "gpointer ___new = (gpointer)gtk_value_get_boxed (VAL); "
+ "gpointer ___new = (gpointer)g_value_get_boxed (VAL); "
"if (___new != ___old) { "
"if (___old != NULL) g_boxed_free (%s, ___old); "
"if (___new != NULL) %s->%s = g_boxed_copy (%s, ___new); "
"} "
"}",
root, prop->name,
- prop->extra_gtktype,
+ type,
root, prop->name,
- prop->extra_gtktype,
+ type,
root, prop->name);
- get = g_strdup_printf("g_value_set_object (VAL, %s->%s);",
+ get = g_strdup_printf("g_value_set_boxed (VAL, %s->%s);",
root, prop->name);
+ g_free (type);
} else {
char *set_func;
char *get_func;
+ const char *getcast = "";
+ const char *setcast = "";
+ char *to_free = NULL;
set_func = g_strdup_printf ("g_value_set_%s", prop->gtktype);
g_strdown (set_func);
get_func = g_strdup_printf ("g_value_get_%s", prop->gtktype);
g_strdown (get_func);
- set = g_strdup_printf("%s->%s = %s (VAL);",
+ 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);",
root, prop->name,
+ getcast,
get_func);
- get = g_strdup_printf("%s (VAL, %s->%s);",
+ get = g_strdup_printf("%s (VAL, %s%s->%s);",
set_func,
+ setcast,
root, prop->name);
g_free (get_func);
g_free (set_func);
+ g_free (to_free);
}
node_set (node,
"otype:steal", $<id>2,
"ptype:steal", $<id>4,
"bonobo_object_class:steal", bonobo_object_class,
+ "glade_xml", glade_xml,
"interfaces:steal", interfaces,
"chunk_size:steal", chunk_size,
+ "abstract", abstract,
NULL);
bonobo_object_class = NULL;
+ glade_xml = FALSE;
chunk_size = NULL;
interfaces = NULL;
}
;
classflags:
+ | '(' TOKEN ')' classflags {
+ if(strcmp($<id>2,"abstract") == 0) {
+ abstract = TRUE;
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
| '(' TOKEN TOKEN ')' classflags {
if(strcmp($<id>2,"chunks") == 0) {
g_free (chunk_size);
YYERROR;
}
}
+ | '(' TOKEN STRING STRING ')' classflags {
+ if (strcmp ($<id>2, "GladeXML") == 0) {
+ glade_xml = TRUE;
+ add_construct_glade($<id>3, $<id>4, NULL);
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ | '(' TOKEN STRING STRING STRING ')' classflags {
+ if (strcmp ($<id>2, "GladeXML") == 0) {
+ glade_xml = TRUE;
+ add_construct_glade($<id>3, $<id>4, $<id>5);
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ | '(' TOKEN TOKEN STRING ')' classflags {
+ if (strcmp ($<id>2, "GladeXML") == 0) {
+ glade_xml = TRUE;
+ add_construct_glade($<id>3, $<id>4, NULL);
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ | '(' TOKEN TOKEN STRING STRING ')' classflags {
+ if (strcmp ($<id>2, "GladeXML") == 0) {
+ glade_xml = TRUE;
+ add_construct_glade($<id>3, $<id>4, $<id>5);
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
;
classcode: classcode thing { ; }
| initializer destructor { ; }
| initializer { destructor = NULL; }
| destructor { initializer = NULL; }
+ | TOKEN {
+ if (strcmp ($<id>1, "GladeXML") == 0) {
+ glade_widget = TRUE;
+ } else {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
| {
destructor = NULL;
initializer = NULL;
char *get, *set = NULL;
Variable *var;
Type *type;
- char *root;
+ const char *root;
if(strcmp($<id>6, "link")!=0 &&
strcmp($<id>6, "stringlink")!=0 &&
type = pop_type();
var = find_var_or_die($<id>4, $<line>1);
- if(var->scope == PRIVATE_SCOPE)
+ if(var->scope == PRIVATE_SCOPE) {
root = "self->_priv";
- else if(var->scope == CLASS_SCOPE) {
+ } else if(var->scope == CLASS_SCOPE) {
root = "SELF_GET_CLASS(self)";
if(no_self_alias)
error_print(GOB_ERROR, $<line>1,
_("Self aliases needed when autolinking to a classwide member"));
- } else
+ } else {
root = "self";
+ }
if(strcmp($<id>6, "link")==0) {
set = g_strdup_printf("%s->%s = ARG;",
"ptype:steal", type,
NULL);
}
+ | FLAGS_TYPE '=' TYPETOKEN {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", $<id>3,
+ NULL);
+ }
| FLAGS_TYPE '=' TOKEN {
ensure_property ();
node_set ((Node *)property,
"extra_gtktype:steal", $<id>3,
NULL);
}
+ | ENUM_TYPE '=' TYPETOKEN {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", $<id>3,
+ NULL);
+ }
| ENUM_TYPE '=' TOKEN {
ensure_property ();
node_set ((Node *)property,
"extra_gtktype:steal", $<id>3,
NULL);
}
+ | PARAM_TYPE '=' TYPETOKEN {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", $<id>3,
+ NULL);
+ }
| PARAM_TYPE '=' TOKEN {
ensure_property ();
node_set ((Node *)property,
"extra_gtktype:steal", $<id>3,
NULL);
}
+ | BOXED_TYPE '=' TYPETOKEN {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", $<id>3,
+ NULL);
+ }
| BOXED_TYPE '=' TOKEN {
ensure_property ();
node_set ((Node *)property,
"extra_gtktype:steal", $<id>3,
NULL);
}
+ | OBJECT_TYPE '=' TYPETOKEN {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", $<id>3,
+ NULL);
+ }
| OBJECT_TYPE '=' TOKEN {
ensure_property ();
node_set ((Node *)property,
}
| TOKEN {
ensure_property ();
- if (strcmp ($<id>1, "link") == 0) {
+ if (strcmp ($<id>1, "override") == 0) {
+ g_free($<id>1);
+ node_set ((Node *)property,
+ "override", TRUE,
+ NULL);
+ } else if (strcmp ($<id>1, "link") == 0) {
g_free($<id>1);
node_set ((Node *)property,
"link", TRUE,
retcode: numtok { $<id>$ = $<id>1; }
| '{' CCODE {
- $<id>$ = ($<cbuf>3)->str;
- g_string_free($<cbuf>3, FALSE);
+ $<id>$ = ($<cbuf>2)->str;
+ g_string_free($<cbuf>2, FALSE);
}
;