[gtk/kill-display-changed: 1/4] window: Implement display change via root/unroot
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/kill-display-changed: 1/4] window: Implement display change via root/unroot
- Date: Thu, 2 May 2019 00:14:17 +0000 (UTC)
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]