summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-06-02 00:07:45 +0000
committerMatthias Clasen <mclasen@redhat.com>2020-06-02 00:07:45 +0000
commit572386e4cecbb867e35d984d4f7f225a613f6eed (patch)
treee0fe2ec4b83ae4bdc1bbef1f15ba92438caee016
parent67a972182efe63d374a349770629be19094d19f8 (diff)
parent9d15e64f0b37561a89e21675e12efa56ac44c8b6 (diff)
downloadgtk+-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.c2
-rw-r--r--gtk/gtkcolumnviewcolumn.c4
-rw-r--r--gtk/gtkprintbackend.c16
-rw-r--r--gtk/gtkwidget.c5
-rw-r--r--testsuite/gtk/action.c66
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);