diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2008-03-11 00:18:02 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2008-03-11 00:18:02 +0000 |
commit | 4143760c93c5aef6c54d1796861004b6dfb15ba9 (patch) | |
tree | 77de6bc6c58a43196b5cf0b8962368e07ea32fb3 | |
parent | 92d17d167d2da3ca8da866c8ed28ef6638616ae2 (diff) | |
download | glade-4143760c93c5aef6c54d1796861004b6dfb15ba9.tar.gz |
Avoid crashing on id 0 (bug 442860)
* gladeui/glade-id-allocator.c: Avoid crashing on id 0 (bug 442860)
* gladeui/glade-widget.c, gladeui/glade-project.c: Moved
widget name policing to gladeproject.
* gladeui/glade-editor.c: Dont commit name values if name
already exists in the project.
svn path=/branches/gnome-2-22/; revision=1740
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | gladeui/glade-app.c | 10 | ||||
-rw-r--r-- | gladeui/glade-editor.c | 5 | ||||
-rw-r--r-- | gladeui/glade-id-allocator.c | 2 | ||||
-rw-r--r-- | gladeui/glade-project.c | 27 | ||||
-rw-r--r-- | gladeui/glade-widget.c | 17 |
6 files changed, 63 insertions, 13 deletions
@@ -1,5 +1,20 @@ 2008-03-10 Tristan Van Berkom <tvb@gnome.org> + * gladeui/glade-app.c: Now if an empty project is loaded + and anothther project with widgets is loaded, they will + also be shown at load time (first widget in the layout + gets autoloaded). + + * gladeui/glade-id-allocator.c: Avoid crashing on id 0 (bug 442860) + + * gladeui/glade-widget.c, gladeui/glade-project.c: Moved + widget name policing to gladeproject. + + * gladeui/glade-editor.c: Dont commit name values if name + already exists in the project. + +2008-03-10 Tristan Van Berkom <tvb@gnome.org> + * NEWS, configure.ac: Rolling 3.4.3 * plugins/gtk+/gtk+.xml.in: Backing out GtkScaleButton diff --git a/gladeui/glade-app.c b/gladeui/glade-app.c index c7eebecf..9dc242b1 100644 --- a/gladeui/glade-app.c +++ b/gladeui/glade-app.c @@ -38,6 +38,7 @@ #include "glade-cursor.h" #include "glade-catalog.h" #include "glade-fixed.h" +#include "glade-design-view.h" #include "glade-marshallers.h" #include "glade-accumulators.h" @@ -916,6 +917,8 @@ void glade_app_add_project (GladeProject *project) { GladeApp *app; + GladeDesignView *view; + GladeDesignLayout *layout; g_return_if_fail (GLADE_IS_PROJECT (project)); /* If the project was previously loaded, don't re-load */ @@ -945,9 +948,12 @@ glade_app_add_project (GladeProject *project) glade_app_set_project (project); /* Select the first window in the project */ - if (g_list_length (app->priv->projects) == 1) + if (g_list_length (app->priv->projects) == 1 || + !(view = glade_design_view_get_from_project (project)) || + !(layout = glade_design_view_get_layout (view)) || + !GTK_BIN (layout)->child) { - GList *node; + const GList *node; for (node = glade_project_get_objects (project); node != NULL; node = g_list_next (node)) diff --git a/gladeui/glade-editor.c b/gladeui/glade-editor.c index 3723c020..535f69a2 100644 --- a/gladeui/glade-editor.c +++ b/gladeui/glade-editor.c @@ -412,7 +412,8 @@ glade_editor_widget_name_changed (GtkWidget *editable, GladeEditor *editor) widget = editor->loaded_widget; new_name = gtk_editable_get_chars (GTK_EDITABLE (editable), 0, -1); - glade_command_set_name (widget, new_name); + if (!glade_project_get_widget_by_name (widget->project, new_name)) + glade_command_set_name (widget, new_name); g_free (new_name); } @@ -646,7 +647,7 @@ glade_editor_get_table_from_class (GladeEditor *editor, GladeEditorTable *table; GList *list; - g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor)); + g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL); for (list = editor->widget_tables; list; list = list->next) { diff --git a/gladeui/glade-id-allocator.c b/gladeui/glade-id-allocator.c index e2053171..b208cd43 100644 --- a/gladeui/glade-id-allocator.c +++ b/gladeui/glade-id-allocator.c @@ -154,7 +154,7 @@ glade_id_allocator_release (GladeIDAllocator *allocator, { g_return_if_fail (allocator != NULL); - id--; + id = id > 0 ? id - 1 : 0; allocator->data[id >> 5] |= 1 << (id & 31); } diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c index 7928b78e..40f0c967 100644 --- a/gladeui/glade-project.c +++ b/gladeui/glade-project.c @@ -947,6 +947,15 @@ glade_project_add_object (GladeProject *project, /* Dont add widgets that are already in the project */ if (glade_project_has_object (project, object)) return; + + /* Police widget names here (just rename them on the way in the project) + */ + if (glade_project_get_widget_by_name (project, gwidget->name) != NULL) + { + gchar *name = glade_project_new_widget_name (project, gwidget->name); + glade_widget_set_name (gwidget, name); + g_free (name); + } /* Code body starts here */ reentrancy_count++; @@ -1127,10 +1136,28 @@ glade_project_remove_object (GladeProject *project, GObject *object) void glade_project_widget_name_changed (GladeProject *project, GladeWidget *widget, const char *old_name) { + GladeWidget *iter; + GList *l; g_return_if_fail (GLADE_IS_PROJECT (project)); g_return_if_fail (GLADE_IS_WIDGET (widget)); glade_project_release_widget_name (project, widget, old_name); + + /* Police widget names here (just rename them on the way in the project) + */ + for (l = project->priv->objects; l; l = l->next) + { + iter = glade_widget_get_from_gobject (l->data); + + if (widget != iter && + !strcmp (widget->name, iter->name)) + { + gchar *name = glade_project_new_widget_name (project, widget->name); + glade_widget_set_name (widget, name); + g_free (name); + } + + } g_signal_emit (G_OBJECT (project), glade_project_signals [WIDGET_NAME_CHANGED], diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c index 2634e9d8..bb019b94 100644 --- a/gladeui/glade-widget.c +++ b/gladeui/glade-widget.c @@ -1348,14 +1348,7 @@ glade_widget_dup_internal (GladeWidget *parent, } else { - gchar *name; - - if (exact) - name = g_strdup (template_widget->name); - else - name = glade_project_new_widget_name (template_widget->project, - template_widget->name); - + gchar *name = g_strdup (template_widget->name); gwidget = glade_widget_adaptor_create_widget (template_widget->adaptor, FALSE, "name", name, @@ -2613,6 +2606,14 @@ glade_widget_set_name (GladeWidget *widget, const gchar *name) { g_return_if_fail (GLADE_IS_WIDGET (widget)); if (widget->name != name) { + + if (widget->project && + glade_project_get_widget_by_name (widget->project, name)) + { + /* print a warning ? */ + return; + } + if (widget->name) g_free (widget->name); widget->name = g_strdup (name); |