[gtk/kill-display-changed: 1/4] window: Implement display change via root/unroot



commit 33a8108f199e659a1596324e0daf2b866d55c495
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed May 1 22:41:20 2019 +0000

    window: Implement display change via root/unroot
    
    Export gtk_widget_root/unroot privately,
    make them work on roots, and use them in
    gtk_window_set_display. This gets us to a
    single way to listen for display changes,
    the root property.

 gtk/gtkwidget.c        | 41 ++++++++++++++++++++++-------------------
 gtk/gtkwidgetprivate.h |  2 ++
 gtk/gtkwindow.c        |  4 +++-
 3 files changed, 27 insertions(+), 20 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index a458e8aca3..abd5f5fc24 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -632,8 +632,6 @@ static void             gtk_widget_real_move_focus              (GtkWidget
                                                                  GtkDirectionType  direction);
 static gboolean                gtk_widget_real_keynav_failed           (GtkWidget        *widget,
                                                                 GtkDirectionType  direction);
-static void             gtk_widget_root                         (GtkWidget        *widget);
-static void             gtk_widget_unroot                       (GtkWidget        *widget);
 #ifdef G_ENABLE_CONSISTENCY_CHECKS
 static void             gtk_widget_verify_invariants            (GtkWidget        *widget);
 static void             gtk_widget_push_verify_invariants       (GtkWidget        *widget);
@@ -2865,21 +2863,22 @@ gtk_widget_new (GType        type,
   return widget;
 }
 
-static void
+void
 gtk_widget_root (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
 
-  /* roots are rooted by default */
-  if (GTK_IS_ROOT (widget))
-    return;
-
-  g_assert (priv->root == NULL);
   g_assert (!priv->realized);
-  g_assert (priv->parent);
-  g_assert (priv->parent->priv->root);
 
-  priv->root = priv->parent->priv->root;
+  if (GTK_IS_ROOT (widget))
+    {
+      g_assert (priv->root == GTK_ROOT (widget));
+    }
+  else
+    {
+      g_assert (priv->root == NULL);
+      priv->root = priv->parent->priv->root;
+    }
 
   if (priv->context)
     gtk_style_context_set_display (priv->context, gtk_root_get_display (priv->root));
@@ -2889,19 +2888,16 @@ gtk_widget_root (GtkWidget *widget)
 
   GTK_WIDGET_GET_CLASS (widget)->root (widget);
 
-  g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_ROOT]);
+  if (!GTK_IS_ROOT (widget))
+    g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_ROOT]);
 }
 
-static void
+void
 gtk_widget_unroot (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GtkWidgetSurfaceTransformData *surface_transform_data;
 
-  /* roots are rooted by default and cannot be unrooted */
-  if (GTK_IS_ROOT (widget))
-    return;
-
   g_assert (priv->root);
   g_assert (!priv->realized);
 
@@ -2915,9 +2911,16 @@ gtk_widget_unroot (GtkWidget *widget)
   if (priv->context)
     gtk_style_context_set_display (priv->context, gdk_display_get_default ());
 
-  priv->root = NULL;
+  if (g_object_get_qdata (G_OBJECT (widget), quark_pango_context))
+    g_object_set_qdata (G_OBJECT (widget), quark_pango_context, NULL);
+
+  _gtk_tooltip_hide (widget);
 
-  g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_ROOT]);
+  if (!GTK_IS_ROOT (widget))
+    {
+      priv->root = NULL;
+      g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_ROOT]);
+    }
 }
 
 /**
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 8d8b656be0..11fd41a673 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -209,6 +209,8 @@ struct _GtkWidgetPrivate
   GdkCursor *cursor;
 };
 
+void          gtk_widget_root               (GtkWidget *widget);
+void          gtk_widget_unroot             (GtkWidget *widget);
 GtkCssNode *  gtk_widget_get_css_node       (GtkWidget *widget);
 void         _gtk_widget_set_visible_flag   (GtkWidget *widget,
                                              gboolean   visible);
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index bdff204913..de59910b0c 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -8510,7 +8510,9 @@ gtk_window_set_display (GtkWindow  *window,
                     G_CALLBACK (gtk_window_on_theme_variant_changed), window);
 #endif
 
-  _gtk_widget_propagate_display_changed (widget, previous_display);
+  gtk_widget_unroot (widget);
+  gtk_widget_root (widget);
+
   g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_DISPLAY]);
 
   if (was_mapped)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]