[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