summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMorten Welinder <terra@gnome.org>2004-10-06 15:57:19 +0000
committerMorten Welinder <mortenw@src.gnome.org>2004-10-06 15:57:19 +0000
commit9a4586762fdf3f0c5c6e0707405158f641a960da (patch)
tree9db5f676115027e74138a5f441e6d06d79d13cdd
parent1892a7081d342396815538ffbd5fc4205d4dcced (diff)
downloadglade-9a4586762fdf3f0c5c6e0707405158f641a960da.tar.gz
Bullet proof. (glade_gtk_notebook_post_create): Actually set the property.
2004-10-06 Morten Welinder <terra@gnome.org> * src/glade-gtk.c (glade_gtk_widget_get_tooltip): Bullet proof. (glade_gtk_notebook_post_create): Actually set the property. * src/glade-widget.c (glade_widget_debug_real, glade_widget_debug): New functions. (glade_widget_set_name): Bullet proof. (glade_widget_set_internal): Ditto. (glade_widget_set_project): Ditto. (glade_widget_fill_from_node): Plug leaks. (glade_widget_new_from_node_real): Plug leak. (glade_widget_new_child_from_node): Fix loading of internal children and plug leak. (glade_widget_get_internal_child): Change to return GtkWidget because the GladeWidget may not be connected yet.
-rw-r--r--ChangeLog17
-rw-r--r--src/glade-gtk.c5
-rw-r--r--src/glade-widget.c150
3 files changed, 115 insertions, 57 deletions
diff --git a/ChangeLog b/ChangeLog
index 697cfe90..ee902db4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2004-10-06 Morten Welinder <terra@gnome.org>
+
+ * src/glade-gtk.c (glade_gtk_widget_get_tooltip): Bullet proof.
+ (glade_gtk_notebook_post_create): Actually set the property.
+
+ * src/glade-widget.c (glade_widget_debug_real,
+ glade_widget_debug): New functions.
+ (glade_widget_set_name): Bullet proof.
+ (glade_widget_set_internal): Ditto.
+ (glade_widget_set_project): Ditto.
+ (glade_widget_fill_from_node): Plug leaks.
+ (glade_widget_new_from_node_real): Plug leak.
+ (glade_widget_new_child_from_node): Fix loading of internal
+ children and plug leak.
+ (glade_widget_get_internal_child): Change to return GtkWidget
+ because the GladeWidget may not be connected yet.
+
2004-10-04 Morten Welinder <terra@gnome.org>
* src/glade-utils.c (glade_util_widget_set_tooltip): Plug leak.
diff --git a/src/glade-gtk.c b/src/glade-gtk.c
index 22109186..ebe0e48e 100644
--- a/src/glade-gtk.c
+++ b/src/glade-gtk.c
@@ -165,7 +165,8 @@ glade_gtk_widget_get_tooltip (GObject *object, GValue *value)
GtkTooltipsData *tooltips_data = gtk_tooltips_data_get (GTK_WIDGET (object));
g_value_reset (value);
- g_value_set_string (value, tooltips_data->tip_text);
+ g_value_set_string (value,
+ tooltips_data ? tooltips_data->tip_text : NULL);
}
/**
@@ -868,7 +869,7 @@ glade_gtk_notebook_post_create (GObject *object)
g_value_init (&value, G_TYPE_INT);
g_value_set_int (&value, ask_for_number(_("Create a notebook"), _("Number of pages:"), 0, 100, 3));
- // FIXME: Shouldn't we actually set this?
+ glade_property_set (property, &value);
}
/**
diff --git a/src/glade-widget.c b/src/glade-widget.c
index 3c657933..d4f77403 100644
--- a/src/glade-widget.c
+++ b/src/glade-widget.c
@@ -199,6 +199,49 @@ glade_widget_init (GladeWidget *widget)
widget->signals = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) free_signals);
}
+static void
+glade_widget_debug_real (GladeWidget *widget, int indent)
+{
+ g_print ("%*sGladeWidget at %p\n", indent, "", widget);
+ g_print ("%*sname = [%s]\n", indent, "", widget->name ? widget->name : "-");
+ g_print ("%*sinternal = [%s]\n", indent, "", widget->internal ? widget->internal : "-");
+ g_print ("%*sgtkwidget = %p [%s]\n",
+ indent, "", widget->widget, G_OBJECT_TYPE_NAME (widget->widget));
+ g_print ("%*sgtkwidget->parent = %p\n", indent, "", gtk_widget_get_parent (widget->widget));
+ if (GTK_IS_CONTAINER (widget->widget)) {
+ GList *children, *l;
+ children = glade_util_container_get_all_children (GTK_CONTAINER (widget->widget));
+ for (l = children; l; l = l->next) {
+ GtkWidget *widget_gtk = GTK_WIDGET (l->data);
+ GladeWidget *widget = glade_widget_get_from_gtk_widget (widget_gtk);
+ if (widget) {
+ glade_widget_debug_real (widget, indent + 2);
+ } else if (GLADE_IS_PLACEHOLDER (widget_gtk)) {
+ g_print ("%*sGtkWidget child %p is a placeholder.\n",
+ indent + 2, "", widget_gtk);
+ } else {
+ g_print ("%*sGtkWidget child %p [%s] has no glade widget.\n",
+ indent + 2, "",
+ widget_gtk, G_OBJECT_TYPE_NAME (widget_gtk));
+ }
+ }
+ if (!children)
+ g_print ("%*shas no children\n", indent, "");
+ g_list_free (children);
+ } else {
+ g_print ("%*snot a container\n", indent, "");
+ }
+ g_print ("\n");
+}
+
+void
+glade_widget_debug (GladeWidget *widget)
+{
+ glade_widget_debug_real (widget, 0);
+}
+
+
+
/**
* glade_widget_new:
* @klass: a #GladeWidgetClass
@@ -251,14 +294,14 @@ glade_widget_new_for_internal_child (GladeWidgetClass *klass, GladeWidget *paren
{
GladeProject *project = glade_widget_get_project (parent);
char *widget_name = glade_project_new_widget_name (project, klass->generic_name);
- GladeWidget *result = g_object_new (GLADE_TYPE_WIDGET,
+ GladeWidget *widget = g_object_new (GLADE_TYPE_WIDGET,
"class", klass,
"project", project,
"name", widget_name,
"internal", internal_name,
"widget", internal_widget, NULL);
g_free (widget_name);
- return result;
+ return widget;
}
static void
@@ -430,11 +473,12 @@ glade_widget_get_real_property (GObject *object,
void
glade_widget_set_name (GladeWidget *widget, const char *name)
{
- if (widget->name)
+ g_return_if_fail (GLADE_IS_WIDGET (widget));
+ if (widget->name != name) {
g_free (widget->name);
-
- widget->name = g_strdup (name);
- g_object_notify (G_OBJECT (widget), "name");
+ widget->name = g_strdup (name);
+ g_object_notify (G_OBJECT (widget), "name");
+ }
}
/**
@@ -460,11 +504,12 @@ glade_widget_get_name (GladeWidget *widget)
void
glade_widget_set_internal (GladeWidget *widget, const char *internal)
{
- if (widget->internal)
+ g_return_if_fail (GLADE_IS_WIDGET (widget));
+ if (widget->internal != internal) {
g_free (widget->internal);
-
- widget->internal = g_strdup (internal);
- g_object_notify (G_OBJECT (widget), "internal");
+ widget->internal = g_strdup (internal);
+ g_object_notify (G_OBJECT (widget), "internal");
+ }
}
/**
@@ -533,12 +578,14 @@ glade_widget_get_class (GladeWidget *widget)
void
glade_widget_set_project (GladeWidget *widget, GladeProject *project)
{
- if (widget->project)
- g_object_unref (widget->project);
-
- g_object_ref (project);
- widget->project = project;
- g_object_notify (G_OBJECT (widget), "project");
+ if (widget->project != project) {
+ if (project)
+ g_object_ref (project);
+ if (widget->project)
+ g_object_unref (widget->project);
+ widget->project = project;
+ g_object_notify (G_OBJECT (widget), "project");
+ }
}
/**
@@ -1336,8 +1383,8 @@ static void
glade_widget_fill_from_node (GladeXmlNode *node, GladeWidget *widget)
{
GladeXmlNode *child;
- const gchar *class_name;
- const gchar *widget_name;
+ gchar *class_name;
+ gchar *widget_name;
g_return_if_fail (GLADE_IS_WIDGET (widget));
@@ -1345,12 +1392,19 @@ glade_widget_fill_from_node (GladeXmlNode *node, GladeWidget *widget)
return;
class_name = glade_xml_get_property_string_required (node, GLADE_XML_TAG_CLASS, NULL);
+ if (!class_name)
+ return;
+
widget_name = glade_xml_get_property_string_required (node, GLADE_XML_TAG_ID, NULL);
- if (!class_name || !widget_name)
+ if (!widget_name) {
+ g_free (class_name);
return;
+ }
g_assert (strcmp (class_name, widget->widget_class->name) == 0);
glade_widget_set_name (widget, widget_name);
+ g_free (class_name);
+ g_free (widget_name);
/* Children */
child = glade_xml_node_get_children (node);
@@ -1359,7 +1413,8 @@ glade_widget_fill_from_node (GladeXmlNode *node, GladeWidget *widget)
continue;
if (!glade_widget_new_child_from_node (child, widget->project, widget)) {
- g_warning ("Failed to read child");
+ g_warning ("Failed to read child of %s",
+ glade_widget_get_name (widget));
continue;
}
}
@@ -1400,7 +1455,7 @@ glade_widget_new_from_node_real (GladeXmlNode *node,
{
GladeWidgetClass *klass;
GladeWidget *widget;
- const gchar *class_name;
+ gchar *class_name;
GObject *widget_gtk;
char *widget_name;
@@ -1412,6 +1467,7 @@ glade_widget_new_from_node_real (GladeXmlNode *node,
return NULL;
klass = glade_widget_class_get_by_name (class_name);
+ g_free (class_name);
if (!klass)
return NULL;
@@ -1440,31 +1496,20 @@ glade_widget_new_from_node_real (GladeXmlNode *node,
/**
* When looking for an internal child we have to walk up the hierarchy...
*/
-static GladeWidget *
+static GtkWidget *
glade_widget_get_internal_child (GladeWidget *parent,
const gchar *internal)
{
- GladeWidget *ancestor;
- GladeWidget *child = NULL;
-
- ancestor = parent;
- while (ancestor)
- {
- if (ancestor->widget_class->get_internal_child)
- {
- GtkWidget *widget;
- ancestor->widget_class->get_internal_child (ancestor->widget, internal, &widget);
- if (widget)
- {
- child = glade_widget_get_from_gtk_widget (widget);
- if (child)
- break;
- }
+ while (parent) {
+ if (parent->widget_class->get_internal_child) {
+ GtkWidget *widget_gtk;
+ parent->widget_class->get_internal_child (parent->widget, internal, &widget_gtk);
+ return widget_gtk;
}
- ancestor = glade_widget_get_parent (ancestor);
+ parent = glade_widget_get_parent (parent);
}
- return child;
+ return NULL;
}
static gboolean
@@ -1496,25 +1541,17 @@ glade_widget_new_child_from_node (GladeXmlNode *node,
internalchild = glade_xml_get_property_string (node, GLADE_XML_TAG_INTERNAL_CHILD);
if (internalchild)
{
- child = glade_widget_get_internal_child (parent, internalchild);
- if (!child)
- {
- g_warning ("Failed to get internal child %s", internalchild);
- g_free (internalchild);
- return FALSE;
- }
+ GtkWidget *child_gtk = glade_widget_get_internal_child (parent, internalchild);
+ GladeWidgetClass *child_class =
+ glade_widget_class_get_by_name (G_OBJECT_TYPE_NAME (child_gtk));
+ child = glade_widget_new_for_internal_child (child_class, parent, child_gtk, internalchild);
glade_widget_fill_from_node (child_node, child);
+ g_free (internalchild);
}
else
{
child = glade_widget_new_from_node_real (child_node, project, parent);
- if (!child)
- /* not enough memory... and now, how can I signal it
- * and not make the caller believe that it was a parsing
- * problem?
- */
- return FALSE;
-
+ g_return_val_if_fail (child != NULL, FALSE);
gtk_container_add (GTK_CONTAINER (parent->widget), child->widget);
}
@@ -1552,5 +1589,8 @@ glade_widget_new_child_from_node (GladeXmlNode *node,
GladeWidget *
glade_widget_read (GladeProject *project, GladeXmlNode *node)
{
- return glade_widget_new_from_node_real (node, project, NULL);
+ GladeWidget *widget =
+ glade_widget_new_from_node_real (node, project, NULL);
+ glade_widget_debug (widget);
+ return widget;
}