Applied patch from Pavel Kostyuchenko to prevent hangs in anjuta (bug

* gladeui/glade-widget.c: Applied patch from Pavel Kostyuchenko to prevent
	  hangs in anjuta (bug 531585).

	* gladeui/glade-property.c, gladeui/glade-property-class.c: Applied patch from 
	  Pavel Kostyuchenko to unify duplicate implementation property comparisons (bug 532013)


svn path=/trunk/; revision=1818
This commit is contained in:
Tristan Van Berkom 2008-05-11 15:04:45 +00:00
parent ef648a1a69
commit 85c334e505
5 changed files with 45 additions and 42 deletions

View File

@ -1,3 +1,11 @@
2008-05-11 Tristan Van Berkom <tvb@gnome.org>
* gladeui/glade-widget.c: Applied patch from Pavel Kostyuchenko to prevent
hangs in anjuta (bug 531585).
* gladeui/glade-property.c, gladeui/glade-property-class.c: Applied patch from
Pavel Kostyuchenko to unify duplicate implementation property comparisons (bug 532013)
2008-05-05 Tristan Van Berkom <tvb@gnome.org>
* gladeui/glade-editor-property.c: Avoid feedback loops when committing properties,

View File

@ -1592,8 +1592,8 @@ glade_property_class_void_value (GladePropertyClass *klass,
*/
gint
glade_property_class_compare (GladePropertyClass *klass,
GValue *value1,
GValue *value2)
const GValue *value1,
const GValue *value2)
{
gint retval;
@ -1616,7 +1616,24 @@ glade_property_class_compare (GladePropertyClass *klass,
g_free (val2);
}
else
{
if (G_IS_PARAM_SPEC_STRING (klass->pspec))
{
const gchar *value_str1, *value_str2;
/* in string specs; NULL and '\0' are
* treated as equivalent.
*/
value_str1 = g_value_get_string (value1);
value_str2 = g_value_get_string (value2);
if (value_str1 == NULL && value_str2 && value_str2[0] == '\0')
return 0;
else if (value_str2 == NULL && value_str1 && value_str1[0] == '\0')
return 0;
}
retval = g_param_values_cmp (klass->pspec, value1, value2);
}
return retval;
}

View File

@ -215,8 +215,9 @@ gboolean glade_property_class_void_value (GladePropertyC
GValue *value);
gint glade_property_class_compare (GladePropertyClass *klass,
GValue *value1,
GValue *value2);
const GValue *value1,
const GValue *value2);
G_END_DECLS
#endif /* __GLADE_PROPERTY_CLASS_H__ */

View File

@ -111,24 +111,8 @@ static gboolean
glade_property_equals_value_impl (GladeProperty *property,
const GValue *value)
{
if (G_IS_PARAM_SPEC_STRING (property->klass->pspec))
{
const 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->klass->pspec,
property->value, value);
return !glade_property_class_compare (property->klass,
property->value, value);
}

View File

@ -1831,14 +1831,15 @@ glade_widget_debug (GladeWidget *widget)
glade_widget_debug_real (widget, 0);
}
static gboolean
glade_widget_show_idle (GladeWidget *widget)
static void
glade_widget_add_to_layout (GladeWidget *widget, GtkWidget *layout)
{
/* This could be dangerous */
if (GLADE_IS_WIDGET (widget))
glade_widget_show (widget);
if (gtk_bin_get_child (GTK_BIN (layout)) != NULL)
gtk_container_remove (GTK_CONTAINER (layout), gtk_bin_get_child (GTK_BIN (layout)));
return FALSE;
gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (widget->object));
gtk_widget_show_all (GTK_WIDGET (widget->object));
}
/**
@ -1861,22 +1862,14 @@ glade_widget_show (GladeWidget *widget)
view = glade_design_view_get_from_project (glade_widget_get_project (widget));
layout = GTK_WIDGET (glade_design_view_get_layout (view));
/* This case causes a black window */
if (layout && !GTK_WIDGET_REALIZED (layout))
{
/* XXX Dangerous !!! give her a little kick */
g_idle_add ((GSourceFunc)glade_widget_show_idle, widget);
return;
}
else if (!layout)
if (!layout)
return;
if (gtk_bin_get_child (GTK_BIN (layout)) != NULL)
gtk_container_remove (GTK_CONTAINER (layout), gtk_bin_get_child (GTK_BIN (layout)));
gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (widget->object));
gtk_widget_show_all (GTK_WIDGET (widget->object));
if (GTK_WIDGET_REALIZED (layout))
glade_widget_add_to_layout (widget, layout);
else
g_signal_connect_data (layout, "map", (GCallback) glade_widget_add_to_layout,
widget, NULL, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
} else if (GTK_IS_WIDGET (widget->object))
{