diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2006-06-25 19:54:14 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2006-06-25 19:54:14 +0000 |
commit | 36d1b086671d39276bcad3d388f1198003a23a98 (patch) | |
tree | d6aec545b0a46b0c6fd760226b5ff89421526df6 /src | |
parent | ac959a05e5b0d67b2edc4b74c6512557dd5f75cd (diff) | |
download | glade-36d1b086671d39276bcad3d388f1198003a23a98.tar.gz |
o gtk_window_set_decorated() all GtkWindows (bug 344817) o Fixed
* src/glade-widget.[ch]:
o gtk_window_set_decorated() all GtkWindows (bug 344817)
o Fixed glade_widget_rebuild(), now properties of internal widgets to composite
widgets' properties get transported along.
o Fixed popups to only get spawned by the widget in question
and not an unknown internal child.
o Added widget superuser modes (used by the backend to check when
its responsable for maintaining container sizes).
o glade_widget_rebuild () fixed so that properties on rebuilt internal
children are transfered.
* src/glade-project.c: let glade-widget take care of property superuser mode
at load time.
* src/glade-fixed.ch: connect_after on button_press to give a chance to
the selection
* src/glade-command.c: Fixed unifies for properties (check that they
are on the same widgets).
* src/glade-gtk.c:
o GtkBox check superuser mode to adjust box size
Diffstat (limited to 'src')
-rw-r--r-- | src/glade-command.c | 3 | ||||
-rw-r--r-- | src/glade-fixed.c | 17 | ||||
-rw-r--r-- | src/glade-gtk.c | 21 | ||||
-rw-r--r-- | src/glade-project.c | 4 | ||||
-rw-r--r-- | src/glade-widget.c | 169 | ||||
-rw-r--r-- | src/glade-widget.h | 6 |
6 files changed, 155 insertions, 65 deletions
diff --git a/src/glade-command.c b/src/glade-command.c index a5707be4..00e2cf40 100644 --- a/src/glade-command.c +++ b/src/glade-command.c @@ -520,7 +520,8 @@ glade_command_set_property_unifies (GladeCommand *this, GladeCommand *other) { pdata2 = l->data; - if (glade_property_class_match (pdata1->property->class, + if (pdata1->property->widget == pdata2->property->widget && + glade_property_class_match (pdata1->property->class, pdata2->property->class)) break; } diff --git a/src/glade-fixed.c b/src/glade-fixed.c index f058b545..f159fa77 100644 --- a/src/glade-fixed.c +++ b/src/glade-fixed.c @@ -323,8 +323,10 @@ glade_fixed_connect_child (GladeFixed *fixed, data = g_new (GFSigData, 1); + /* Connect-after here... leave a chance for selection + */ data->press_id = - g_signal_connect + g_signal_connect_after (child, "button-press-event", G_CALLBACK (GLADE_FIXED_GET_CLASS(fixed)->child_event), fixed); data->release_id = @@ -685,19 +687,6 @@ glade_fixed_replace_child_impl (GladeWidget *fixed, glade_fixed_connect_child (GLADE_FIXED (fixed), gnew_widget); } -static gboolean -glade_fixed_popup_menu (GtkWidget *widget, gpointer unused_data) -{ - GladeWidget *glade_widget; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - - glade_widget = glade_widget_get_from_gobject (widget); - glade_popup_widget_pop (glade_widget, NULL, TRUE); - - return TRUE; -} - static gint glade_fixed_event (GtkWidget *widget, GdkEvent *event, diff --git a/src/glade-gtk.c b/src/glade-gtk.c index d987a738..fa6bb641 100644 --- a/src/glade-gtk.c +++ b/src/glade-gtk.c @@ -529,15 +529,14 @@ glade_gtk_box_configure_end (GladeFixed *fixed, } glade_property_push_superuser (); - glade_command_set_properties_list (GLADE_WIDGET (fixed)->project, - prop_list); + if (prop_list) + glade_command_set_properties_list (GLADE_WIDGET (fixed)->project, + prop_list); glade_property_pop_superuser (); - for (l = glade_gtk_box_original_positions; l; l = l->next) - { g_free (l->data); - } + glade_gtk_box_original_positions = (g_list_free (glade_gtk_box_original_positions), NULL); @@ -835,7 +834,8 @@ glade_gtk_box_add_child (GObject *object, GObject *child) Try to remove the last placeholder if any, this way GtkBox`s size will not be changed. */ - if (!GLADE_IS_PLACEHOLDER (child)) + if (glade_widget_superuser () == FALSE && + !GLADE_IS_PLACEHOLDER (child)) { GList *l; GtkBox *box = GTK_BOX (object); @@ -850,7 +850,7 @@ glade_gtk_box_add_child (GObject *object, GObject *child) } } } - + gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child)); num_children = g_list_length (GTK_BOX (object)->children); @@ -901,8 +901,11 @@ glade_gtk_box_remove_child (GObject *object, GObject *child) gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child)); - glade_widget_property_get (gbox, "size", &size); - glade_widget_property_set (gbox, "size", size); + if (glade_widget_superuser () == FALSE) + { + glade_widget_property_get (gbox, "size", &size); + glade_widget_property_set (gbox, "size", size); + } } diff --git a/src/glade-project.c b/src/glade-project.c index 576eb75f..a662e71b 100644 --- a/src/glade-project.c +++ b/src/glade-project.c @@ -1162,8 +1162,6 @@ glade_project_loading_done_idle (gpointer data) project->loading = project->changed = FALSE; - glade_property_pop_superuser (); - return FALSE; } @@ -1217,8 +1215,6 @@ glade_project_new_from_interface (GladeInterface *interface, const gchar *path) project->objects = NULL; project->loading = TRUE; - glade_property_push_superuser (); - for (i = 0; i < interface->n_toplevels; ++i) { widget = glade_widget_read ((gpointer)project, interface->toplevels[i]); diff --git a/src/glade-widget.c b/src/glade-widget.c index cd2c68b9..e2e6d1a1 100644 --- a/src/glade-widget.c +++ b/src/glade-widget.c @@ -432,12 +432,6 @@ glade_widget_setup_events (GladeWidget *gwidget, GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK); - if (GTK_WIDGET_TOPLEVEL (widget)) - g_signal_connect (G_OBJECT (widget), "delete_event", - G_CALLBACK (glade_widget_hide_on_delete), NULL); - - g_signal_connect (G_OBJECT (widget), "popup_menu", - G_CALLBACK (glade_widget_popup_menu), NULL); } static gboolean @@ -672,13 +666,17 @@ glade_widget_build_object (GladeWidgetClass *klass, GladeWidget *widget, GladeWi } static GList * -glade_widget_dup_properties (GList *template_props) +glade_widget_dup_properties (GList *template_props, gboolean as_load) { GList *list, *properties = NULL; for (list = template_props; list && list->data; list = list->next) { GladeProperty *prop = list->data; + + if (prop->class->save == FALSE && as_load) + continue; + properties = g_list_prepend (properties, glade_property_dup (prop, NULL)); } return g_list_reverse (properties); @@ -706,6 +704,7 @@ glade_widget_sync_packing_props (GladeWidget *widget) } } + static GObject * glade_widget_constructor (GType type, guint n_construct_properties, @@ -751,7 +750,7 @@ glade_widget_constructor (GType type, if (gwidget->construct_template) { properties = glade_widget_dup_properties - (gwidget->construct_template->properties); + (gwidget->construct_template->properties, FALSE); glade_widget_set_properties (gwidget, properties); } @@ -786,7 +785,6 @@ glade_widget_constructor (GType type, if (gwidget->construct_reason == GLADE_CREATE_USER) glade_widget_sync_custom_props (gwidget); - if (gwidget->parent && gwidget->packing_properties == NULL) glade_widget_set_packing_properties (gwidget, gwidget->parent); @@ -1488,10 +1486,10 @@ glade_widget_dup_internal (GladeWidget *parent, GladeWidget *template) typedef struct { GladeWidget *widget; GtkWidget *placeholder; - GList *packing; + GList *properties; - gchar *internal_name; - GList *internal_list; + gchar *internal_name; + GList *internal_list; } GladeChildExtract; static GList * @@ -1499,7 +1497,7 @@ glade_widget_extract_children (GladeWidget *gwidget) { GladeChildExtract *extract; GList *extract_list = NULL; - GList *children, *list, *l; + GList *children, *list; children = glade_widget_class_container_get_children (gwidget->widget_class, gwidget->object); @@ -1508,23 +1506,25 @@ glade_widget_extract_children (GladeWidget *gwidget) { GObject *child = G_OBJECT(list->data); GladeWidget *gchild = glade_widget_get_from_gobject (child); - +#if 0 + g_print ("Extracting %s from %s\n", + gchild ? gchild->name : + GLADE_IS_PLACEHOLDER (child) ? "placeholder" : "unknown widget", + gwidget->name); +#endif if (gchild && gchild->internal) { - GList *internal_children; - /* Recurse and collect any deep child hierarchies * inside composite widgets. */ - if ((internal_children = - glade_widget_extract_children (gchild)) != NULL) - { - extract = g_new0 (GladeChildExtract, 1); - extract->internal_name = g_strdup (gchild->internal); - extract->internal_list = internal_children; - - extract_list = g_list_prepend (extract_list, extract); - } + extract = g_new0 (GladeChildExtract, 1); + extract->internal_name = g_strdup (gchild->internal); + extract->internal_list = glade_widget_extract_children (gchild); + extract->properties = + glade_widget_dup_properties (gchild->properties, TRUE); + + extract_list = g_list_prepend (extract_list, extract); + } else if (gchild || GLADE_IS_PLACEHOLDER (child)) { @@ -1536,11 +1536,9 @@ glade_widget_extract_children (GladeWidget *gwidget) /* Make copies of the packing properties */ - for (l = gchild->packing_properties; l; l = l->next) - extract->packing = g_list_prepend - (extract->packing, - glade_property_dup - (GLADE_PROPERTY (l->data), gchild)); + extract->properties = + glade_widget_dup_properties + (gchild->packing_properties, TRUE); glade_widget_remove_child (gwidget, gchild); } @@ -1557,6 +1555,9 @@ glade_widget_extract_children (GladeWidget *gwidget) } } + g_print ("Extracted %d out of %d children from child %s\n", + g_list_length (extract_list), g_list_length (children), gwidget->name); + if (children) g_list_free (children); @@ -1570,6 +1571,9 @@ glade_widget_insert_children (GladeWidget *gwidget, GList *children) GladeWidget *gchild; GObject *internal_object; GList *list, *l; + + g_print ("Inserting %d children into widget %s\n", + g_list_length (children), gwidget->name); for (list = children; list; list = list->next) { @@ -1596,6 +1600,26 @@ glade_widget_insert_children (GladeWidget *gwidget, GList *children) /* This will free the list... */ glade_widget_insert_children (gchild, extract->internal_list); + /* Set the properties after inserting the children */ + for (l = extract->properties; l; l = l->next) + { + GValue value = { 0, }; + GladeProperty *saved_prop = l->data; + GladeProperty *widget_prop = + glade_widget_get_property (gchild, + saved_prop->class->id); + + glade_property_get_value (saved_prop, &value); + glade_property_set_value (widget_prop, &value); + g_value_unset (&value); + + /* Free them as we go ... */ + g_object_unref (saved_prop); + } + + if (extract->properties) + g_list_free (extract->properties); + g_free (extract->internal_name); } else if (extract->widget) @@ -1603,7 +1627,7 @@ glade_widget_insert_children (GladeWidget *gwidget, GList *children) glade_widget_add_child (gwidget, extract->widget, FALSE); g_object_unref (extract->widget); - for (l = extract->packing; l; l = l->next) + for (l = extract->properties; l; l = l->next) { GValue value = { 0, }; GladeProperty *saved_prop = l->data; @@ -1615,10 +1639,11 @@ glade_widget_insert_children (GladeWidget *gwidget, GList *children) glade_property_set_value (widget_prop, &value); g_value_unset (&value); + /* Free them as we go ... */ g_object_unref (saved_prop); } - if (extract->packing) - g_list_free (extract->packing); + if (extract->properties) + g_list_free (extract->properties); } else { @@ -1630,6 +1655,7 @@ glade_widget_insert_children (GladeWidget *gwidget, GList *children) } g_free (extract); } + if (children) g_list_free (children); } @@ -2334,9 +2360,9 @@ glade_widget_dup (GladeWidget *template) g_return_val_if_fail (GLADE_IS_WIDGET (template), NULL); - glade_property_push_superuser (); + glade_widget_push_superuser (); widget = glade_widget_dup_internal (NULL, template); - glade_property_pop_superuser (); + glade_widget_pop_superuser (); return widget; } @@ -2366,7 +2392,7 @@ glade_widget_rebuild (GladeWidget *glade_widget) /* Extract and keep the child hierarchies aside... */ children = glade_widget_extract_children (glade_widget); - + /* Hold a reference to the old widget while we transport properties * and children from it */ @@ -2388,12 +2414,14 @@ glade_widget_rebuild (GladeWidget *glade_widget) /* Reparent any children of the old object to the new object * (this function will consume and free the child list). */ + glade_widget_push_superuser (); glade_widget_insert_children (glade_widget, children); + glade_widget_pop_superuser (); /* Custom properties aren't transfered in build_object, since build_object * is only concerned with object creation. */ - glade_widget_sync_custom_props (glade_widget); + glade_widget_sync_custom_props (glade_widget); /* Sync packing. */ @@ -3029,6 +3057,12 @@ glade_widget_set_object (GladeWidget *gwidget, GObject *new_object) if (g_type_is_a (gwidget->widget_class->type, GTK_TYPE_WIDGET)) { + + /* Make sure dialogs and such have close buttons. + */ + if (g_type_is_a (gwidget->widget_class->type, GTK_TYPE_WINDOW)) + gtk_window_set_decorated (GTK_WINDOW (new_object), TRUE); + /* Disable any built-in DnD */ gtk_drag_dest_unset (GTK_WIDGET (new_object)); @@ -3038,6 +3072,13 @@ glade_widget_set_object (GladeWidget *gwidget, GObject *new_object) */ GLADE_WIDGET_GET_KLASS (gwidget)->setup_events (gwidget, GTK_WIDGET (new_object)); + + if (GTK_WIDGET_TOPLEVEL (new_object)) + g_signal_connect (G_OBJECT (new_object), "delete_event", + G_CALLBACK (glade_widget_hide_on_delete), NULL); + + g_signal_connect (G_OBJECT (new_object), "popup_menu", + G_CALLBACK (glade_widget_popup_menu), NULL); glade_widget_connect_signal_handlers (GTK_WIDGET(new_object), @@ -3504,6 +3545,7 @@ glade_widget_read (GladeProject *project, GladeWidgetInfo *info) { GladeWidget *widget; + glade_widget_push_superuser (); loading_project = project; if ((widget = glade_widget_new_from_widget_info @@ -3514,6 +3556,7 @@ glade_widget_read (GladeProject *project, GladeWidgetInfo *info) } loading_project = NULL; + glade_widget_pop_superuser (); return widget; } @@ -3562,3 +3605,55 @@ glade_widget_launch_editor (GladeWidget *widget) } } while ((parent = parent->parent) != NULL); } + + +static gint glade_widget_su_stack = 0; + +/** + * glade_widget_superuser: + * + * Checks if we are in superuser mode. + * + * Superuser mode is when we are + * - Loading a project + * - Dupping a widget recursively + * - Rebuilding an instance for a construct-only property + * + * In these cases, we must act like a load, this should be checked + * from the plugin when implementing containers, when undo/redo comes + * around, the plugin is responsable for maintaining the same container + * size when widgets are added/removed. + */ +gboolean +glade_widget_superuser (void) +{ + return glade_widget_su_stack > 0; +} + +/** + * glade_widget_push_superuser: + * + * Sets superuser mode + */ +void +glade_widget_push_superuser (void) +{ + glade_property_push_superuser (); + glade_widget_su_stack++; +} + + +/** + * glade_widget_pop_superuser: + * + * Unsets superuser mode + */ +void +glade_widget_pop_superuser (void) +{ + if (--glade_widget_su_stack < 0) + { + g_critical ("Bug: widget super user stack is corrupt.\n"); + } + glade_property_pop_superuser (); +} diff --git a/src/glade-widget.h b/src/glade-widget.h index c2bbc20b..e1b4f54f 100644 --- a/src/glade-widget.h +++ b/src/glade-widget.h @@ -278,6 +278,12 @@ GladeWidget *glade_widget_get_parent (GladeWidget *w LIBGLADEUI_API void glade_widget_set_parent (GladeWidget *widget, GladeWidget *parent); +LIBGLADEUI_API +gboolean glade_widget_superuser (void); +LIBGLADEUI_API +void glade_widget_push_superuser (void); +LIBGLADEUI_API +void glade_widget_pop_superuser (void); G_END_DECLS |