diff --git a/ChangeLog b/ChangeLog index b96d6d8e..9942df9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2006-05-22 Tristan Van Berkom + + * src/Makefile.am, widgets/Makefile.am: Installed unwanted garbage + to pass distcheck. + + * src/glade-devhelp.c: Navigational buttons insensitive at startup. + + * src/glade-catalog.c: Unexposed a private function. + + * src/glade-xml-utils.c: made alloc_string glade_xml_alloc_string, + alloc_propname: ditto. + + * src/glade-property.c, src/glade-signal.c: + Adjustemtnts made for glade-xml api above + + * src/glade-widget.c: + o Adjustemtnts made for glade-xml api above + o Properties applied to new objects in two steps now, + code around build_object cleaned up... now build_object + used also in load code. + 2006-05-18 Tristan Van Berkom * src/glade.h, src/glade-catalog.c, src/glade-widget-class.[ch]: @@ -5,7 +26,7 @@ * src/glade-editor.c, src/glade-editor-property.c: Now get the book name directly from the widget class. - + * doc/catalogintro.sgml: documented added "book" property. * widgets/bonobo.xml.in: added gnome catalog dependancy diff --git a/doc/tmpl/glade-widget-class.sgml b/doc/tmpl/glade-widget-class.sgml index 8a8e70ce..10a97609 100644 --- a/doc/tmpl/glade-widget-class.sgml +++ b/doc/tmpl/glade-widget-class.sgml @@ -27,6 +27,7 @@ classes; it also provides an abstraction later to container apis. @type: @name: @catalog: +@book: @icon: @generic_name: @palette_name: @@ -145,6 +146,7 @@ classes; it also provides an abstraction later to container apis. @catname: @library: @domain: +@book: @Returns: diff --git a/src/Makefile.am b/src/Makefile.am index 5efb3a10..26429615 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -38,9 +38,11 @@ libgladegtk_la_CFLAGS = \ -I$(top_builddir) \ $(GTK_CFLAGS) -libgladegtk_la_SOURCES = glade-gtk.c -libgladegtk_la_LDFLAGS = -module -avoid-version -libgladegtk_la_LIBADD = libgladeui-1.la $(GTK_LIBS) +libgladegtk_la_SOURCES = glade-gtk.c +libgladegtk_la_LDFLAGS = -module -avoid-version +libgladegtk_la_LIBADD = libgladeui-1.la $(GTK_LIBS) +libgladegtkincludedir = $(includedir)/libgladeui-1.0/libgladeui +libgladegtkinclude_HEADERS = glade-gtk.h # The Devhelp plugin @@ -55,9 +57,11 @@ libgladedevhelp_la_CFLAGS = \ -I$(top_builddir) \ $(DEVHELP_CFLAGS) -libgladedevhelp_la_SOURCES = glade-devhelp.c -libgladedevhelp_la_LDFLAGS = -module -avoid-version -libgladedevhelp_la_LIBADD = $(DEVHELP_LIBS) +libgladedevhelp_la_SOURCES = glade-devhelp.c +libgladedevhelp_la_LDFLAGS = -module -avoid-version +libgladedevhelp_la_LIBADD = $(DEVHELP_LIBS) +libgladedevhelpincludedir = $(includedir)/libgladeui-1.0/libgladeui +libgladedevhelpinclude_HEADERS = glade-devhelp.h endif diff --git a/src/glade-catalog.c b/src/glade-catalog.c index c908fd41..b16e7627 100644 --- a/src/glade-catalog.c +++ b/src/glade-catalog.c @@ -83,7 +83,7 @@ static gboolean catalog_load_classes (GladeCatalog *catalog, static gboolean catalog_load_group (GladeCatalog *catalog, GladeXmlNode *group_node); -void widget_group_free (GladeWidgetGroup *group); +static void widget_group_free (GladeWidgetGroup *group); /* List of catalog names successfully loaded. */ @@ -370,7 +370,7 @@ catalog_load_group (GladeCatalog *catalog, GladeXmlNode *group_node) return TRUE; } -void +static void widget_group_free (GladeWidgetGroup *group) { g_return_if_fail (group != NULL); diff --git a/src/glade-devhelp.c b/src/glade-devhelp.c index 9b90a613..d8e6b3a2 100644 --- a/src/glade-devhelp.c +++ b/src/glade-devhelp.c @@ -246,6 +246,9 @@ widget_create_nav_button (NavButtonType type) gtk_widget_show_all (align); + if (type == NAV_FORWARD || type == NAV_BACK) + gtk_widget_set_sensitive (button, FALSE); + gtk_container_add (GTK_CONTAINER (button), align); return button; diff --git a/src/glade-parser.c b/src/glade-parser.c index 964e08c1..c5b1c80e 100644 --- a/src/glade-parser.c +++ b/src/glade-parser.c @@ -125,9 +125,9 @@ create_widget_info(GladeInterface *interface, const xmlChar **attrs) for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("class"))) - info->classname = alloc_string (interface, CAST_BAD(attrs[i+1])); + info->classname = glade_xml_alloc_string (interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("id"))) - info->name = alloc_string (interface, CAST_BAD(attrs[i+1])); + info->name = glade_xml_alloc_string (interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", attrs[i]); } @@ -233,9 +233,9 @@ handle_atk_action(GladeParseState *state, const xmlChar **attrs) for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("action_name"))) - info.action_name = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.action_name = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("description"))) - info.description = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.description = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", attrs[i]); } @@ -259,9 +259,9 @@ handle_atk_relation(GladeParseState *state, const xmlChar **attrs) for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("target"))) - info.target = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.target = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("type"))) - info.type = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.type = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", attrs[i]); } @@ -286,15 +286,15 @@ handle_signal(GladeParseState *state, const xmlChar **attrs) info.after = FALSE; for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("name"))) - info.name = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.name = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("handler"))) - info.handler = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.handler = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("after"))) info.after = attrs[i+1][0] == 'y'; else if (!xmlStrcmp(attrs[i], BAD_CAST("lookup"))) info.lookup = attrs[i+1][0] == 'y'; else if (!xmlStrcmp(attrs[i], BAD_CAST("object"))) - info.object = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.object = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("last_modification_time"))) /* Do nothing. */; else @@ -378,7 +378,7 @@ handle_accel(GladeParseState *state, const xmlChar **attrs) } else pos++; } else if (!xmlStrcmp(attrs[i], BAD_CAST("signal"))) - info.signal = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info.signal = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", attrs[i]); } @@ -416,7 +416,7 @@ handle_child(GladeParseState *state, const xmlChar **attrs) for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("internal-child"))) - info->internal_child = alloc_string(state->interface, CAST_BAD(attrs[i+1])); + info->internal_child = glade_xml_alloc_string(state->interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", attrs[i]); } @@ -499,7 +499,7 @@ glade_parser_start_element(GladeParseState *state, iface->requires = g_renew(gchar *, iface->requires, iface->n_requires); iface->requires[iface->n_requires-1] = - alloc_string(iface, CAST_BAD(attrs[i+1])); + glade_xml_alloc_string(iface, CAST_BAD(attrs[i+1])); } else g_warning("unknown attribute `%s' for .", attrs[i]); @@ -547,14 +547,14 @@ glade_parser_start_element(GladeParseState *state, state->translate_prop = FALSE; for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("name"))) - state->prop_name = alloc_propname(state->interface, + state->prop_name = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("translatable"))) state->translate_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("context"))) state->context_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("comments"))) - state->comment = alloc_propname(state->interface, + state->comment = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("agent"))) bad_agent = xmlStrcmp(attrs[i], BAD_CAST("libglade")) != 0; @@ -608,14 +608,14 @@ glade_parser_start_element(GladeParseState *state, state->translate_prop = FALSE; for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("name"))) - state->prop_name = alloc_propname(state->interface, + state->prop_name = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("translatable"))) state->translate_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("context"))) state->context_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("comments"))) - state->comment = alloc_propname(state->interface, + state->comment = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else g_warning("unknown attribute `%s' for .", @@ -764,14 +764,14 @@ glade_parser_start_element(GladeParseState *state, state->translate_prop = FALSE; for (i = 0; attrs && attrs[i] != NULL; i += 2) { if (!xmlStrcmp(attrs[i], BAD_CAST("name"))) - state->prop_name = alloc_propname(state->interface, + state->prop_name = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("translatable"))) state->translate_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("context"))) state->context_prop = !xmlStrcmp(attrs[i+1], BAD_CAST("yes")); else if (!xmlStrcmp(attrs[i], BAD_CAST("comments"))) - state->comment = alloc_propname(state->interface, + state->comment = glade_xml_alloc_propname(state->interface, CAST_BAD(attrs[i+1])); else if (!xmlStrcmp(attrs[i], BAD_CAST("agent"))) bad_agent = xmlStrcmp(attrs[i], BAD_CAST("libglade")) != 0; @@ -890,7 +890,7 @@ glade_parser_end_element(GladeParseState *state, const xmlChar *name) prop.has_context = state->context_prop; prop.translatable = state->translate_prop; prop.comment = state->comment; - prop.value = alloc_string(state->interface, state->content->str); + prop.value = glade_xml_alloc_string(state->interface, state->content->str); g_array_append_val(state->props, prop); state->prop_name = NULL; @@ -912,7 +912,7 @@ glade_parser_end_element(GladeParseState *state, const xmlChar *name) prop.has_context = state->context_prop; prop.translatable = state->translate_prop; prop.comment = state->comment; - prop.value = alloc_string(state->interface, state->content->str); + prop.value = glade_xml_alloc_string(state->interface, state->content->str); g_array_append_val(state->props, prop); state->prop_name = NULL; @@ -976,7 +976,7 @@ glade_parser_end_element(GladeParseState *state, const xmlChar *name) prop.has_context = state->context_prop; prop.translatable = state->translate_prop; prop.comment = state->comment; - prop.value = alloc_string(state->interface, state->content->str); + prop.value = glade_xml_alloc_string(state->interface, state->content->str); g_array_append_val(state->props, prop); state->prop_name = NULL; diff --git a/src/glade-property-class.c b/src/glade-property-class.c index 3b3a77c9..350304b1 100644 --- a/src/glade-property-class.c +++ b/src/glade-property-class.c @@ -1600,5 +1600,6 @@ glade_property_class_void_value (GladePropertyClass *class, else if (G_IS_PARAM_SPEC_BOXED (class->pspec) && g_value_get_boxed (value) == NULL) return TRUE; + return FALSE; } diff --git a/src/glade-property.c b/src/glade-property.c index dc648b97..d309bc54 100644 --- a/src/glade-property.c +++ b/src/glade-property.c @@ -102,15 +102,30 @@ glade_property_reset_impl (GladeProperty *property) gboolean glade_property_default_impl (GladeProperty *property) { - return !g_param_values_cmp (property->class->pspec, - property->value, - property->class->def); + return GLADE_PROPERTY_GET_KLASS (property)->equals_value + (property, property->class->def); } gboolean glade_property_equals_value_impl (GladeProperty *property, const GValue *value) { + if (G_IS_PARAM_SPEC_STRING (property->class->pspec)) + { + gchar *prop_str, *value_str; + + /* in string specs; NULL and '\0' are + * treated as equivalent. + */ + prop_str = g_value_get_string (property->value); + value_str = g_value_get_string (value); + + if (prop_str == NULL && value_str && value_str[0] == '\0') + return TRUE; + else if (value_str == NULL && prop_str && prop_str[0] == '\0') + return TRUE; + } + return !g_param_values_cmp (property->class->pspec, property->value, value); } @@ -392,13 +407,12 @@ glade_property_write_impl (GladeProperty *property, } /* convert the value of this property to a string */ - /* XXX Is this right to return here ??? */ if ((value = glade_property_class_make_string_from_gvalue (property->class, property->value)) == NULL) - { - g_free (name); - return FALSE; - } + /* make sure we keep the empty string, also... upcomming + * funcs that may not like NULL. + */ + value = g_strdup (""); switch (property->class->atk_type) { @@ -408,15 +422,15 @@ glade_property_write_impl (GladeProperty *property, name = tmp; /* Dont break here ... */ case GPC_ATK_NONE: - info.name = alloc_propname(interface, name); - info.value = alloc_string(interface, value); + info.name = glade_xml_alloc_propname(interface, name); + info.value = glade_xml_alloc_string(interface, value); if (property->class->translatable) { info.translatable = property->i18n_translatable; info.has_context = property->i18n_has_context; if (property->i18n_comment) - info.comment = alloc_string + info.comment = glade_xml_alloc_string (interface, property->i18n_comment); } g_array_append_val (props, info); @@ -427,16 +441,16 @@ glade_property_write_impl (GladeProperty *property, for (i = 0; split[i] != NULL; i++) { GladeAtkRelationInfo rinfo = { 0, }; - rinfo.type = alloc_string(interface, name); - rinfo.target = alloc_string(interface, split[i]); + rinfo.type = glade_xml_alloc_string(interface, name); + rinfo.target = glade_xml_alloc_string(interface, split[i]); g_array_append_val (props, rinfo); } g_strfreev (split); } break; case GPC_ATK_ACTION: - ainfo.action_name = alloc_string(interface, name); - ainfo.description = alloc_string(interface, value); + ainfo.action_name = glade_xml_alloc_string(interface, name); + ainfo.description = glade_xml_alloc_string(interface, value); g_array_append_val (props, ainfo); break; default: @@ -901,6 +915,8 @@ glade_property_read_atk_action (GladeProperty *property, if (!strcmp (id, class_id)) { + /* Need special case for NULL values here ??? */ + gvalue = glade_property_class_make_gvalue_from_string (pclass, ainfo->description, project); diff --git a/src/glade-signal.c b/src/glade-signal.c index 03bbfcd7..469fe42a 100644 --- a/src/glade-signal.c +++ b/src/glade-signal.c @@ -127,11 +127,11 @@ gboolean glade_signal_write (GladeSignalInfo *info, GladeSignal *signal, GladeInterface *interface) { - info->name = alloc_string(interface, signal->name); - info->handler = alloc_string(interface, signal->handler); + info->name = glade_xml_alloc_string(interface, signal->name); + info->handler = glade_xml_alloc_string(interface, signal->handler); info->object = signal->userdata ? - alloc_string(interface, signal->userdata) : NULL; + glade_xml_alloc_string(interface, signal->userdata) : NULL; info->after = signal->after; info->lookup = signal->lookup; return TRUE; diff --git a/src/glade-widget-class.c b/src/glade-widget-class.c index 7bb5e722..51ac554e 100644 --- a/src/glade-widget-class.c +++ b/src/glade-widget-class.c @@ -1186,6 +1186,90 @@ glade_widget_class_get_child_support (GladeWidgetClass *class, } +/** + * glade_widget_class_default_params: + * @class: a #GladeWidgetClass + * @construct: whether to return construct params or not construct params + * @n_params: return location if any defaults are specified for this class. + * + * Returns: A list of params for use in g_object_newv () + */ +GParameter * +glade_widget_class_default_params (GladeWidgetClass *class, + gboolean construct, + guint *n_params) +{ + GArray *params; + GObjectClass *oclass; + GParamSpec **pspec; + GladePropertyClass *pclass; + guint n_props, i; + + g_return_val_if_fail (GLADE_IS_WIDGET_CLASS (class), NULL); + g_return_val_if_fail (n_params != NULL, NULL); + + /* As a slight optimization, we never unref the class + */ + oclass = g_type_class_ref (class->type); + pspec = g_object_class_list_properties (oclass, &n_props); + params = g_array_new (FALSE, FALSE, sizeof (GParameter)); + + for (i = 0; i < n_props; i++) + { + GParameter parameter = { 0, }; + + pclass = glade_widget_class_get_property_class + (class, pspec[i]->name); + + /* Ignore properties based on some criteria + */ + if (pclass == NULL || /* Unaccounted for in the builder */ + pclass->set_function || /* should not be set before + GladeWidget wrapper exists */ + pclass->ignore) /* Catalog explicitly ignores the object */ + continue; + + if (construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) == 0) + continue; + else if (!construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) != 0) + continue; + + + if (g_value_type_compatible (G_VALUE_TYPE (pclass->def), + pspec[i]->value_type) == FALSE) + { + g_critical ("Type mismatch on %s property of %s", + parameter.name, class->name); + continue; + } + + if (g_param_values_cmp (pspec[i], + pclass->def, + pclass->orig_def) == 0) + continue; + +#if 0 + if (glade_property_class_void_value (pclass, pclass->def)) + continue; + +#endif + + parameter.name = pspec[i]->name; /* These are not copied/freed */ + g_value_init (¶meter.value, pspec[i]->value_type); + g_value_copy (pclass->def, ¶meter.value); + + g_array_append_val (params, parameter); + } + g_free (pspec); + + *n_params = params->len; + return (GParameter *)g_array_free (params, FALSE); +} + void glade_widget_class_container_add (GladeWidgetClass *class, GObject *container, diff --git a/src/glade-widget-class.h b/src/glade-widget-class.h index 8ac518b4..8a8e4586 100644 --- a/src/glade-widget-class.h +++ b/src/glade-widget-class.h @@ -285,7 +285,10 @@ GladePropertyClass *glade_widget_class_get_property_class (GladeWidgetClass *cl LIBGLADEUI_API GladeSupportedChild *glade_widget_class_get_child_support (GladeWidgetClass *class, GType child_type); - +LIBGLADEUI_API +GParameter *glade_widget_class_default_params (GladeWidgetClass *class, + gboolean construct, + guint *n_params); LIBGLADEUI_API void glade_widget_class_container_add (GladeWidgetClass *class, GObject *container, diff --git a/src/glade-widget.c b/src/glade-widget.c index 38143d6b..fbfb55e7 100644 --- a/src/glade-widget.c +++ b/src/glade-widget.c @@ -540,28 +540,41 @@ glade_widget_dup_properties (GList *template_props) return g_list_reverse (properties); } -/** - * glade_widget_build_object: - * @klass: a #GladeWidgetClass - * @widget: a #GladeWidget - * - * This function creates a new GObject who's parameters are based - * on the GType of the GladeWidgetClass and its default values, if a - * GladeWidget is specified, it will be used to apply the values currently in use. - * - * Returns: A newly created GObject - */ -static GObject * -glade_widget_build_object (GladeWidgetClass *klass, GladeWidget *widget) +static void +glade_widget_params_free (GParameter *params, guint n_params) { + gint i; + for (i = 0; i < n_params; i++) + g_value_unset (&(params[i].value)); + g_free (params); + +} + +/* + * This function creates new GObject parameters based on the GType of the + * GladeWidgetClass and its default values. + * + * If a GladeWidget is specified, it will be used to apply the + * values currently in use. + */ +static GParameter * +glade_widget_template_params (GladeWidget *widget, + gboolean construct, + guint *n_params) +{ + GladeWidgetClass *klass; GArray *params; GObjectClass *oclass; GParamSpec **pspec; GladeProperty *glade_property; - GladePropertyClass *glade_property_class; - GObject *object; + GladePropertyClass *pclass; guint n_props, i; + g_return_val_if_fail (GLADE_IS_WIDGET (widget), NULL); + g_return_val_if_fail (n_params != NULL, NULL); + + klass = widget->widget_class; + /* As a slight optimization, we never unref the class */ oclass = g_type_class_ref (klass->type); @@ -572,85 +585,149 @@ glade_widget_build_object (GladeWidgetClass *klass, GladeWidget *widget) { GParameter parameter = { 0, }; - glade_property_class = - glade_widget_class_get_property_class (klass, - pspec[i]->name); - if (glade_property_class == NULL || - glade_property_class->set_function || - glade_property_class->ignore) - /* Ignore properties that are not accounted for - * by the GladeWidgetClass - */ + glade_property = glade_widget_get_property (widget, pspec[i]->name); + pclass = glade_property->class; + + /* Ignore properties based on some criteria + */ + if (pclass == NULL || /* Unaccounted for in the builder */ + pclass->set_function || /* should not be set before + GladeWidget wrapper exists */ + pclass->ignore) /* Catalog explicitly ignores the object */ continue; - - parameter.name = pspec[i]->name; /* No need to dup this */ + + if (construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) == 0) + continue; + else if (!construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) != 0) + continue; + + if (g_value_type_compatible (G_VALUE_TYPE (pclass->def), + pspec[i]->value_type) == FALSE) + { + g_critical ("Type mismatch on %s property of %s", + parameter.name, klass->name); + continue; + } + + if (g_param_values_cmp (pspec[i], + glade_property->value, + pclass->orig_def) == 0) + continue; + + + parameter.name = pspec[i]->name; /* These are not copied/freed */ g_value_init (¶meter.value, pspec[i]->value_type); - - /* If a widget is specified and has a value set for that - * property, then that value will be used (otherwise, we - * use the default value) - */ - if (widget && - (glade_property = - glade_widget_get_property (widget, parameter.name)) != NULL) - { - if (g_value_type_compatible (G_VALUE_TYPE (glade_property->value), - G_VALUE_TYPE (¶meter.value))) - g_value_copy (glade_property->value, ¶meter.value); - else - { - g_critical ("Type mismatch on %s property of %s", - parameter.name, klass->name); - continue; - } - } - /* If the class has a default, use it. - */ - else if (glade_property_class->def != NULL) - { - if (g_value_type_compatible (G_VALUE_TYPE (glade_property_class->def), - G_VALUE_TYPE (¶meter.value))) - { - if (glade_property_class_void_value - (glade_property_class, - glade_property_class->def)) - continue; -#if 0 - if (g_type_is_a (G_VALUE_TYPE (glade_property_class->def), G_TYPE_OBJECT)) - if (g_value_get_object (glade_property_class->def) == NULL) - continue; -#endif - - g_value_copy (glade_property_class->def, ¶meter.value); - } - else - { - g_critical ("Type mismatch on %s property of %s", - parameter.name, klass->name); - continue; - } - } - else - g_param_value_set_default (pspec[i], ¶meter.value); - + g_value_copy (glade_property->value, ¶meter.value); + g_array_append_val (params, parameter); } g_free (pspec); + *n_params = params->len; + return (GParameter *)g_array_free (params, FALSE); +} + +static GParameter * +glade_widget_info_params (GladeWidgetClass *widget_class, + GladeWidgetInfo *info, + gboolean construct, + guint *n_params) +{ + GladePropertyClass *glade_property_class; + GObjectClass *oclass; + GParamSpec **pspec; + GArray *params; + guint i, n_props; + + oclass = g_type_class_ref (widget_class->type); + pspec = g_object_class_list_properties (oclass, &n_props); + params = g_array_new (FALSE, FALSE, sizeof (GParameter)); + + /* prepare parameters that have glade_property_class->def */ + for (i = 0; i < n_props; i++) + { + GParameter parameter = { 0, }; + GValue *value; + + glade_property_class = + glade_widget_class_get_property_class (widget_class, + pspec[i]->name); + if (glade_property_class == NULL || + glade_property_class->set_function || + glade_property_class->ignore) + continue; + + if (construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) == 0) + continue; + else if (!construct && + (pspec[i]->flags & + (G_PARAM_CONSTRUCT|G_PARAM_CONSTRUCT_ONLY)) != 0) + continue; + + + /* Try filling parameter with value from widget info. + */ + if ((value = glade_property_read (NULL, glade_property_class, + loading_project, info, FALSE)) != NULL) + { + parameter.name = pspec[i]->name; + g_value_init (¶meter.value, pspec[i]->value_type); + + g_value_copy (value, ¶meter.value); + g_value_unset (value); + g_free (value); + + g_array_append_val (params, parameter); + } + } + g_free(pspec); + + g_type_class_unref (oclass); + + *n_params = params->len; + return (GParameter *)g_array_free (params, FALSE); +} + + +static GObject * +glade_widget_build_object (GladeWidgetClass *klass, GladeWidget *widget, GladeWidgetInfo *info) +{ + GParameter *params; + GObject *object; + guint n_params, i; + + if (widget) + params = glade_widget_template_params (widget, TRUE, &n_params); + else if (info) + params = glade_widget_info_params (klass, info, TRUE, &n_params); + else + params = glade_widget_class_default_params (klass, TRUE, &n_params); /* Create the new object with the correct parameters. */ - object = g_object_newv (klass->type, params->len, - (GParameter *)params->data); + object = g_object_newv (klass->type, n_params, params); - /* Cleanup parameters - */ - for (i = 0; i < params->len; i++) + glade_widget_params_free (params, n_params); + + if (widget) + params = glade_widget_template_params (widget, FALSE, &n_params); + else if (info) + params = glade_widget_info_params (klass, info, FALSE, &n_params); + else + params = glade_widget_class_default_params (klass, FALSE, &n_params); + + for (i = 0; i < n_params; i++) { - GParameter parameter = g_array_index (params, GParameter, i); - g_value_unset (¶meter.value); + g_object_set_property (object, params[i].name, &(params[i].value)); } - g_array_free (params, TRUE); + + glade_widget_params_free (params, n_params); return object; } @@ -711,7 +788,7 @@ glade_widget_internal_new (const gchar *name, GObject *glade_widget; GList *properties = NULL; - object = glade_widget_build_object(klass, template); + object = glade_widget_build_object(klass, template, NULL); if (template) properties = glade_widget_dup_properties (template->properties); @@ -1048,7 +1125,7 @@ glade_widget_rebuild (GladeWidget *glade_widget) /* Hold a reference to the old widget while we transport properties * and children from it */ - new_object = glade_widget_build_object(klass, glade_widget); + new_object = glade_widget_build_object(klass, glade_widget, NULL); old_object = g_object_ref(glade_widget_get_object(glade_widget)); glade_widget_set_object(glade_widget, new_object); @@ -2541,8 +2618,8 @@ glade_widget_write (GladeWidget *widget, GladeInterface *interface) info = g_new0 (GladeWidgetInfo, 1); - info->classname = alloc_string (interface, widget->widget_class->name); - info->name = alloc_string (interface, widget->name); + info->classname = glade_xml_alloc_string (interface, widget->widget_class->name); + info->name = glade_xml_alloc_string (interface, widget->name); /* Write the properties */ props = g_array_new (FALSE, FALSE, sizeof (GladePropInfo)); @@ -2649,8 +2726,8 @@ glade_widget_write_special_child_prop (GArray *props, if (support && support->special_child_type && buff) { - info.name = alloc_propname (interface, support->special_child_type); - info.value = alloc_string (interface, buff); + info.name = glade_xml_alloc_propname (interface, support->special_child_type); + info.value = glade_xml_alloc_string (interface, buff); g_array_append_val (props, info); return TRUE; } @@ -2690,7 +2767,7 @@ glade_widget_write_child (GArray *children, return FALSE; if (child_widget->internal) - info.internal_child = alloc_string(interface, child_widget->internal); + info.internal_child = glade_xml_alloc_string(interface, child_widget->internal); info.child = glade_widget_write (child_widget, interface); if (!info.child) @@ -2786,18 +2863,6 @@ glade_widget_fill_from_widget_info (GladeWidgetInfo *info, } } -static void -glade_widget_params_free (GArray *params) -{ - guint i; - for (i = 0; i < params->len; i++) - { - GParameter parameter = g_array_index (params, GParameter, i); - g_value_unset (¶meter.value); - } - g_array_free (params, TRUE); -} - static GList * glade_widget_properties_from_widget_info (GladeWidgetClass *class, GladeWidgetInfo *info) @@ -2823,93 +2888,6 @@ glade_widget_properties_from_widget_info (GladeWidgetClass *class, return g_list_reverse (properties); } -static GArray * -glade_widget_params_from_widget_info (GladeWidgetClass *widget_class, - GladeWidgetInfo *info) -{ - GladePropertyClass *glade_property_class; - GObjectClass *oclass; - GParamSpec **pspec; - GArray *params; - guint i, n_props; - - oclass = g_type_class_ref (widget_class->type); - pspec = g_object_class_list_properties (oclass, &n_props); - params = g_array_new (FALSE, FALSE, sizeof (GParameter)); - - /* prepare parameters that have glade_property_class->def */ - for (i = 0; i < n_props; i++) - { - GParameter parameter = { 0, }; - GValue *value; - - glade_property_class = - glade_widget_class_get_property_class (widget_class, - pspec[i]->name); - if (glade_property_class == NULL || - glade_property_class->set_function || - glade_property_class->ignore) - continue; - - parameter.name = pspec[i]->name; - g_value_init (¶meter.value, pspec[i]->value_type); - - /* Try filling parameter with value from widget info. - */ - if ((value = glade_property_read (NULL, glade_property_class, - loading_project, info, FALSE)) != NULL) - { - if (g_value_type_compatible (G_VALUE_TYPE (value), - G_VALUE_TYPE (¶meter.value))) - { - g_value_copy (value, ¶meter.value); - g_value_unset (value); - g_free (value); - } - else - { - g_critical ("Type mismatch on %s property of %s", - parameter.name, widget_class->name); - g_value_unset (value); - g_free (value); - continue; - } - } - /* Now try filling the parameter with the default on the GladeWidgetClass. - */ - else if (g_value_type_compatible (G_VALUE_TYPE (glade_property_class->orig_def), - G_VALUE_TYPE (¶meter.value))) - { - if (glade_property_class_void_value - (glade_property_class, - glade_property_class->orig_def)) - continue; -#if 0 - /* If its a NULL object property; disregard it. - */ - if (g_type_is_a (G_VALUE_TYPE (glade_property_class->orig_def), - G_TYPE_OBJECT)) - if (g_value_get_object (glade_property_class->orig_def) == NULL) - continue; -#endif - g_value_copy (glade_property_class->orig_def, ¶meter.value); - } - else - { - g_critical ("Type mismatch on %s property of %s", - parameter.name, widget_class->name); - continue; - } - - g_array_append_val (params, parameter); - } - g_free(pspec); - - g_type_class_unref (oclass); - - return params; -} - static GladeWidget * glade_widget_new_from_widget_info (GladeWidgetInfo *info, GladeProject *project, @@ -2918,7 +2896,6 @@ glade_widget_new_from_widget_info (GladeWidgetInfo *info, GladeWidgetClass *klass; GladeWidget *widget; GObject *object; - GArray *params; GList *properties; g_return_val_if_fail (info != NULL, NULL); @@ -2931,21 +2908,15 @@ glade_widget_new_from_widget_info (GladeWidgetInfo *info, return NULL; } - params = glade_widget_params_from_widget_info (klass, info); + object = glade_widget_build_object (klass, NULL, info); properties = glade_widget_properties_from_widget_info (klass, info); - - object = g_object_newv (klass->type, params->len, - (GParameter *)params->data); - - glade_widget_params_free (params); - - widget = g_object_new (GLADE_TYPE_WIDGET, - "parent", parent, - "properties", properties, - "class", klass, - "project", project, - "name", info->name, - "object", object, NULL); + widget = g_object_new (GLADE_TYPE_WIDGET, + "parent", parent, + "properties", properties, + "class", klass, + "project", project, + "name", info->name, + "object", object, NULL); /* Only call this once the GladeWidget is completely built */ if (klass->post_create_function) diff --git a/src/glade-xml-utils.c b/src/glade-xml-utils.c index e8e8c3f7..083327ac 100644 --- a/src/glade-xml-utils.c +++ b/src/glade-xml-utils.c @@ -695,7 +695,7 @@ glade_xml_doc_get_root (GladeXmlDoc *doc) } gchar * -alloc_string(GladeInterface *interface, const gchar *string) +glade_xml_alloc_string(GladeInterface *interface, const gchar *string) { gchar *s; @@ -709,7 +709,7 @@ alloc_string(GladeInterface *interface, const gchar *string) } gchar * -alloc_propname(GladeInterface *interface, const gchar *string) +glade_xml_alloc_propname(GladeInterface *interface, const gchar *string) { static GString *norm_str; guint i; @@ -724,7 +724,7 @@ alloc_propname(GladeInterface *interface, const gchar *string) if (norm_str->str[i] == '-') norm_str->str[i] = '_'; - return alloc_string(interface, norm_str->str); + return glade_xml_alloc_string(interface, norm_str->str); } @@ -734,7 +734,6 @@ glade_xml_load_sym_from_node (GladeXmlNode *node_in, gchar *tagname, gpointer *sym_location) { - xmlNodePtr node = (xmlNodePtr) node_in; gchar *buff; if ((buff = glade_xml_get_value_string (node_in, tagname)) != NULL) diff --git a/src/glade-xml-utils.h b/src/glade-xml-utils.h index 72ef350e..4dcb5430 100644 --- a/src/glade-xml-utils.h +++ b/src/glade-xml-utils.h @@ -70,8 +70,8 @@ GladeXmlContext * glade_xml_context_new_from_path (const gchar *full_path, const gchar *root_name); GladeXmlDoc * glade_xml_context_get_doc (GladeXmlContext *context); -gchar * alloc_string (GladeInterface *interface, const gchar *string); -gchar * alloc_propname (GladeInterface *interface, const gchar *string); +gchar * glade_xml_alloc_string (GladeInterface *interface, const gchar *string); +gchar * glade_xml_alloc_propname (GladeInterface *interface, const gchar *string); void glade_xml_load_sym_from_node (GladeXmlNode *node_in, GModule *module, diff --git a/widgets/Makefile.am b/widgets/Makefile.am index fde328bb..9fe255b9 100644 --- a/widgets/Makefile.am +++ b/widgets/Makefile.am @@ -4,12 +4,12 @@ CLEANFILES = gtk+.xml catalogsdir = $(glade_catalogsdir) -catalogs_DATA = gtk+.xml +catalogs_DATA = gtk+.xml gtk+.xml.in if BUILD_GNOME GNOME_CATALOGS = bonobo.xml canvas.xml gnome.xml CLEANFILES += $(GNOME_CATALOGS) -catalogs_DATA += $(GNOME_CATALOGS) +catalogs_DATA += $(GNOME_CATALOGS) bonobo.xml.in canvas.xml.in gnome.xml.in endif EXTRA_DIST = \