diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-06-02 00:07:45 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-06-02 00:07:45 +0000 |
commit | 572386e4cecbb867e35d984d4f7f225a613f6eed (patch) | |
tree | e0fe2ec4b83ae4bdc1bbef1f15ba92438caee016 | |
parent | 67a972182efe63d374a349770629be19094d19f8 (diff) | |
parent | 9d15e64f0b37561a89e21675e12efa56ac44c8b6 (diff) | |
download | gtk+-572386e4cecbb867e35d984d4f7f225a613f6eed.tar.gz |
Merge branch 'matthiasc/for-master' into 'master'
print backend: Fix list model handling in dispose
See merge request GNOME/gtk!2013
-rw-r--r-- | demos/gtk-demo/listview_settings.c | 2 | ||||
-rw-r--r-- | gtk/gtkcolumnviewcolumn.c | 4 | ||||
-rw-r--r-- | gtk/gtkprintbackend.c | 16 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 5 | ||||
-rw-r--r-- | testsuite/gtk/action.c | 66 |
5 files changed, 90 insertions, 3 deletions
diff --git a/demos/gtk-demo/listview_settings.c b/demos/gtk-demo/listview_settings.c index deecdaeb57..c00024a68e 100644 --- a/demos/gtk-demo/listview_settings.c +++ b/demos/gtk-demo/listview_settings.c @@ -343,6 +343,8 @@ do_listview_settings (GtkWidget *do_widget) sorter = gtk_string_sorter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name")); gtk_column_view_column_set_sorter (name_column, sorter); g_object_unref (sorter); + + g_object_unref (builder); } if (!gtk_widget_get_visible (window)) diff --git a/gtk/gtkcolumnviewcolumn.c b/gtk/gtkcolumnviewcolumn.c index 0d4cb1c234..5b61633d7a 100644 --- a/gtk/gtkcolumnviewcolumn.c +++ b/gtk/gtkcolumnviewcolumn.c @@ -313,11 +313,12 @@ gtk_column_view_column_get_first_cell (GtkColumnViewColumn *self) } void -gtk_column_view_column_add_cell (GtkColumnViewColumn *self, +gtk_column_view_column_add_cell (GtkColumnViewColumn *self, GtkColumnViewCell *cell) { self->first_cell = cell; + gtk_widget_set_visible (GTK_WIDGET (cell), self->visible); gtk_column_view_column_queue_resize (self); } @@ -454,6 +455,7 @@ gtk_column_view_column_create_header (GtkColumnViewColumn *self) return; self->header = gtk_column_view_title_new (self); + gtk_widget_set_visible (self->header, self->visible); gtk_list_item_widget_add_child (gtk_column_view_get_header_widget (self->view), self->header); gtk_column_view_column_queue_resize (self); diff --git a/gtk/gtkprintbackend.c b/gtk/gtkprintbackend.c index eadd4125d5..2071379a1b 100644 --- a/gtk/gtkprintbackend.c +++ b/gtk/gtkprintbackend.c @@ -29,6 +29,7 @@ #include "gtkprintbackendprivate.h" +static void gtk_print_backend_finalize (GObject *object); static void gtk_print_backend_dispose (GObject *object); static void gtk_print_backend_set_property (GObject *object, guint prop_id, @@ -251,6 +252,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class) backend_parent_class = g_type_class_peek_parent (class); + object_class->finalize = gtk_print_backend_finalize; object_class->dispose = gtk_print_backend_dispose; object_class->set_property = gtk_print_backend_set_property; object_class->get_property = gtk_print_backend_get_property; @@ -348,11 +350,21 @@ gtk_print_backend_dispose (GObject *object) /* We unref the printers in dispose, not in finalize so that * we can break refcount cycles with gtk_print_backend_destroy */ - g_clear_object (&priv->printers); + g_list_store_remove_all (priv->printers); backend_parent_class->dispose (object); } +static void +gtk_print_backend_finalize (GObject *object) +{ + GtkPrintBackend *backend = GTK_PRINT_BACKEND (object); + GtkPrintBackendPrivate *priv = backend->priv; + + g_clear_object (&priv->printers); + + backend_parent_class->finalize (object); +} static void fallback_printer_request_details (GtkPrinter *printer) @@ -361,7 +373,7 @@ fallback_printer_request_details (GtkPrinter *printer) static gboolean fallback_printer_mark_conflicts (GtkPrinter *printer, - GtkPrinterOptionSet *options) + GtkPrinterOptionSet *options) { return FALSE; } diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 18a6b048fa..73f223ecd4 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -10718,6 +10718,7 @@ void _gtk_widget_update_parent_muxer (GtkWidget *widget) { GtkActionMuxer *muxer; + GtkWidget *child; muxer = (GtkActionMuxer*)g_object_get_qdata (G_OBJECT (widget), quark_action_muxer); if (muxer == NULL) @@ -10725,6 +10726,10 @@ _gtk_widget_update_parent_muxer (GtkWidget *widget) gtk_action_muxer_set_parent (muxer, gtk_widget_get_parent_muxer (widget, FALSE)); + for (child = gtk_widget_get_first_child (widget); + child != NULL; + child = gtk_widget_get_next_sibling (child)) + _gtk_widget_update_parent_muxer (child); } GtkActionMuxer * diff --git a/testsuite/gtk/action.c b/testsuite/gtk/action.c index d64f876be5..97a607d53a 100644 --- a/testsuite/gtk/action.c +++ b/testsuite/gtk/action.c @@ -326,6 +326,71 @@ test_inheritance3 (void) g_object_unref (box1_actions); } +/* this checks a particular bug I've seen: when the action muxer + * hierarchy is already set up, adding action groups 'in the middle' + * does not properly update the muxer hierarchy, causing actions + * to be missed. + */ +static void +test_inheritance4 (void) +{ + GtkWidget *window; + GtkWidget *box; + GtkWidget *button; + GSimpleActionGroup *win_actions; + GSimpleActionGroup *box_actions; + GActionEntry entries[] = { + { "action", activate, NULL, NULL, NULL }, + }; + int activated; + + /* Our hierarchy looks like this: + * + * window win.action + * | + * box + * | + * button + */ + window = gtk_window_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + button = gtk_button_new (); + + gtk_window_set_child (GTK_WINDOW (window), box); + gtk_box_append (GTK_BOX (box), button); + + win_actions = g_simple_action_group_new (); + g_action_map_add_action_entries (G_ACTION_MAP (win_actions), + entries, G_N_ELEMENTS (entries), + &activated); + + gtk_widget_insert_action_group (window, "win", G_ACTION_GROUP (win_actions)); + + gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "box.action"); + + /* no box1.action yet, but the action muxers are set up, with windows' muxer + * being the parent of button's, since box has no muxer yet. + */ + g_assert_false (gtk_widget_get_sensitive (button)); + + box_actions = g_simple_action_group_new (); + g_action_map_add_action_entries (G_ACTION_MAP (box_actions), + entries, G_N_ELEMENTS (entries), + &activated); + + gtk_widget_insert_action_group (box, "box", G_ACTION_GROUP (box_actions)); + + /* now box has a muxer, and buttons muxer should be updated to inherit + * from it + */ + g_assert_true (gtk_widget_get_sensitive (button)); + + gtk_window_destroy (GTK_WINDOW (window)); + + g_object_unref (win_actions); + g_object_unref (box_actions); +} + static int cut_activated; static int copy_activated; static int paste_activated; @@ -661,6 +726,7 @@ main (int argc, g_test_add_func ("/action/inheritance", test_inheritance); g_test_add_func ("/action/inheritance2", test_inheritance2); g_test_add_func ("/action/inheritance3", test_inheritance3); + g_test_add_func ("/action/inheritance4", test_inheritance4); g_test_add_func ("/action/text", test_text); g_test_add_func ("/action/overlap", test_overlap); g_test_add_func ("/action/overlap2", test_overlap2); |