[POS-commit] r263 - libglade

Johan Dahlin jdahlin at async.com.br
Thu Mar 31 17:27:35 BRT 2005


Author: jdahlin
Date: 2005-03-31 17:27:35 -0300 (Thu, 31 Mar 2005)
New Revision: 263

Modified:
   libglade/glade-parser.c
   libglade/glade-parser.h
Log:
Add support for layout properties, fix some leaks

Modified: libglade/glade-parser.c
===================================================================
--- libglade/glade-parser.c	2005-03-31 20:27:04 UTC (rev 262)
+++ libglade/glade-parser.c	2005-03-31 20:27:35 UTC (rev 263)
@@ -60,6 +60,9 @@
     PARSER_OBJECT_CHILD_AFTER_PACKING,
     PARSER_OBJECT_CHILD_PLACEHOLDER,
     PARSER_OBJECT_CHILD_AFTER_PLACEHOLDER,
+    PARSER_OBJECT_LAYOUT,
+    PARSER_OBJECT_LAYOUT_PROPERTY,
+    PARSER_OBJECT_AFTER_LAYOUT,
     PARSER_OBJECT_UI,
     PARSER_FINISH,
     PARSER_UNKNOWN
@@ -88,6 +91,9 @@
     "OBJECT_CHILD_AFTER_PACKING",
     "OBJECT_CHILD_PLACEHOLDER",
     "OBJECT_CHILD_AFTER_PLACEHOLDER",
+    "OBJECT_LAYOUT",
+    "OBJECT_LAYOUT_PROPERTY",
+    "OBJECT_AFTER_LAYOUT",
     "OBJECT_UI",
     "FINISH",
     "UNKNOWN",
@@ -109,7 +115,7 @@
     GladeInterface *interface;
     GladeObjectInfo *object;
 
-    enum {PROP_NONE, PROP_OBJECT, PROP_ATK, PROP_CHILD } prop_type;
+    enum {PROP_NONE, PROP_OBJECT, PROP_ATK, PROP_CHILD, PROP_LAYOUT } prop_type;
     gchar *prop_name;
     gboolean translate_prop;
     gboolean context_prop;
@@ -180,6 +186,7 @@
 
 static inline void
 flush_properties(GladeParseState *state)
+
 {
     if (state->props == NULL)
 	return;
@@ -214,6 +221,13 @@
 	    g_array_free(state->props, FALSE);
 	}
 	break;
+    case PROP_LAYOUT:
+	if (state->object->layout_props)
+	    g_warning("we already read all the layout props for this key.  Leaking");
+	state->object->layout_props = (GladeProperty *)state->props->data;
+	state->object->n_layout_props = state->props->len;
+	g_array_free(state->props, FALSE);
+	break;
     }
     state->prop_type = PROP_NONE;
     state->prop_name = NULL;
@@ -478,8 +492,6 @@
     if (!state->uis)
 	state->uis = g_array_new(FALSE, FALSE,
 				 sizeof(GladeUIInfo));
-    g_print ("Appending ui info: %s\n", info.id);
-    
     g_array_append_val(state->uis, info);
 }
 
@@ -566,7 +578,11 @@
 #if 0
     int line, col;
     g_markup_parse_context_get_position(context, &line, &col);
-    g_message("<%s:%d:%d> in state %s", name, line, col, state_names[state->state]);
+    g_message("%d <%s:%d:%d> in state %s",
+	      state->object_depth,
+	      name, line, col, state_names[state->state]);
+#endif    
+#if 0
     GLADE_NOTE(PARSER, g_message("<%s> in state %s",
 				 name, state_names[state->state]));
 #endif
@@ -687,6 +703,9 @@
 	} else if (!strcmp(name, "child")) {
 	    handle_child(state, names, values);
 	    state->state = PARSER_OBJECT_CHILD;
+	} else if (!strcmp(name, "layout")) {
+	    flush_properties(state);
+	    state->state = PARSER_OBJECT_LAYOUT;
 	} else if (!strcmp(name, "ui")) {
 	    handle_uis(state, names, values);
 	    state->state = PARSER_OBJECT_UI;
@@ -770,6 +789,8 @@
 	} else if (!strcmp(name, "child")) {
 	    handle_child(state, names, values);
 	    state->state = PARSER_OBJECT_CHILD;
+	} else if (!strcmp(name, "layout")) {
+	    state->state = PARSER_OBJECT_LAYOUT;
 	} else {
 	    g_warning("Unexpected element <%s> inside <object>.", name);
 	    state->prev_state = state->state;
@@ -790,6 +811,8 @@
 	} else if (!strcmp(name, "child")) {
 	    handle_child(state, names, values);
 	    state->state = PARSER_OBJECT_CHILD;
+	} else if (!strcmp(name, "layout")) {
+	    state->state = PARSER_OBJECT_LAYOUT;
 	} else {
 	    g_warning("Unexpected element <%s> inside <object>.", name);
 	    state->prev_state = state->state;
@@ -810,6 +833,8 @@
 	} else if (!strcmp(name, "ui")) {
 	    handle_uis(state, names, values);
 	    state->state = PARSER_OBJECT_UI;
+	} else if (!strcmp(name, "layout")) {
+	    state->state = PARSER_OBJECT_LAYOUT;
 	} else {
 	    g_warning("Unexpected element <%s> inside <object>.", name);
 	    state->prev_state = state->state;
@@ -922,6 +947,57 @@
 	state->state = PARSER_UNKNOWN;
 	state->unknown_depth++;
 	break;
+    case PARSER_OBJECT_LAYOUT:
+	if (!strcmp(name, "property")) {
+	    gboolean bad_agent = FALSE;
+
+	    if (state->prop_type != PROP_NONE &&
+		state->prop_type != PROP_LAYOUT)
+		g_warning("non layout properties defined here (oh no!)");
+	    state->translate_prop = FALSE;
+	    for (i = 0; names && names[i] != NULL; i++) {
+		if (!strcmp(names[i], "name"))
+		    state->prop_name = alloc_propname(state->interface,
+						      values[i]);
+		else if (!strcmp(names[i], "translatable"))
+		    state->translate_prop = !strcmp(values[i], "yes");
+		else if (!strcmp(names[i], "context"))
+		    state->context_prop = !strcmp(values[i], "yes");
+		else if (!strcmp(names[i], "agent"))
+		    bad_agent = strcmp(values[i], "libglade") != 0;
+		else if (!strcmp(names[i], "comments"))
+		    /* Do nothing. */;
+		else
+		    g_warning("unknown attribute `%s' for <property>.",
+			      names[i]);
+	    }
+	    if (bad_agent) {
+		/* ignore the property ... */
+		state->prev_state = state->state;
+		state->state = PARSER_UNKNOWN;
+		state->unknown_depth++;
+	    } else {
+		state->prop_type = PROP_LAYOUT;
+		state->state = PARSER_OBJECT_LAYOUT_PROPERTY;
+	    }
+	} else {
+	    g_warning("Unexpected element <%s> inside <layout>.", name);
+	    state->prev_state = state->state;
+	    state->state = PARSER_UNKNOWN;
+	    state->unknown_depth++;
+	}
+	break;
+    case PARSER_OBJECT_LAYOUT_PROPERTY:
+	g_warning("<property> element should be empty.  Found <%s>.", name);
+	state->prev_state = state->state;
+	state->state = PARSER_UNKNOWN;
+	state->unknown_depth++;
+	break;
+    case PARSER_OBJECT_AFTER_LAYOUT:
+	state->prev_state = state->state;
+	state->state = PARSER_UNKNOWN;
+	state->unknown_depth++;
+	break;
     case PARSER_OBJECT_UI:
 	state->prev_state = state->state;
 	state->state = PARSER_UNKNOWN;
@@ -950,7 +1026,11 @@
     GladeProperty prop;
 
 #if 0
-    g_message("</%s> in state %s", name, state_names[state->state]);
+    g_message("%d </%s> in state %s",
+	      state ? state->object_depth : 0,
+	      name, state_names[state->state]);
+#endif    
+#if 0
     GLADE_NOTE(PARSER, g_message("</%s> in state %s",
 				 name, state_names[state->state]));
 #endif
@@ -1120,6 +1200,39 @@
 	    g_warning("should find </child> here.  Found </%s>", name);
 	state->state = PARSER_OBJECT_AFTER_ACCEL;
 	break;
+    case PARSER_OBJECT_LAYOUT:
+	if (strcmp(name, "layout") != 0)
+	    g_warning("should find </layout> here.  Found </%s>", name);
+	state->state = PARSER_OBJECT_AFTER_ACCEL;
+	flush_properties(state); /* flush the properties. */
+	break;
+    case PARSER_OBJECT_LAYOUT_PROPERTY:
+	if (strcmp(name, "property") != 0)
+	    g_warning("should find </property> here.  Found </%s>", name);
+	if (!state->props)
+	    state->props = g_array_new(FALSE, FALSE, sizeof(GladeProperty));
+	prop.name = state->prop_name;
+ 	if (state->translate_prop && state->content->str[0] != '\0') {
+	    if (state->context_prop) 
+		prop.value = alloc_string(state->interface,
+					  g_strip_context(state->content->str,
+							   dgettext(state->domain, state->content->str)));
+	    else
+		prop.value = alloc_string(state->interface,
+					  dgettext(state->domain, state->content->str));
+ 	} else {
+ 	    prop.value = alloc_string(state->interface, state->content->str);
+  	}
+	g_array_append_val(state->props, prop);
+	state->prop_name = NULL;
+	state->state = PARSER_OBJECT_AFTER_LAYOUT;
+	break;
+    case PARSER_OBJECT_AFTER_LAYOUT:
+	if (strcmp(name, "layout") != 0)
+	    g_warning("should find </layout> here.  Found </%s>", name);
+	state->state = PARSER_OBJECT_AFTER_ACCEL;
+	flush_properties(state); /* flush the properties. */
+	break;
     case PARSER_OBJECT_UI:
 	state->state = PARSER_OBJECT_AFTER_ACCEL;
 	break;
@@ -1145,6 +1258,7 @@
     case PARSER_OBJECT_PROPERTY:
     case PARSER_OBJECT_ATK_PROPERTY:
     case PARSER_OBJECT_CHILD_PACKING_PROPERTY:
+    case PARSER_OBJECT_LAYOUT_PROPERTY:
 	g_string_append_len(state->content, chars, len);
 	break;
     default:
@@ -1178,10 +1292,12 @@
 
     g_free(info->properties);
     g_free(info->atk_props);
+    g_free(info->layout_props);
     g_free(info->signals);
     g_free(info->atk_actions);
     g_free(info->relations);
     g_free(info->accels);
+    g_free(info->uis);
 
     for (i = 0; i < info->n_children; i++) {
 	g_free(info->children[i].properties);

Modified: libglade/glade-parser.h
===================================================================
--- libglade/glade-parser.h	2005-03-31 20:27:04 UTC (rev 262)
+++ libglade/glade-parser.h	2005-03-31 20:27:35 UTC (rev 263)
@@ -96,6 +96,9 @@
     GladeAccelInfo *accels;
     guint n_accels;
 
+    GladeProperty *layout_props;
+    guint n_layout_props;
+    
     GladeUIInfo *uis;
     guint n_uis;
 



More information about the POS-commit mailing list