summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-11-06 15:50:26 +0100
committerBenjamin Otte <otte@redhat.com>2016-11-06 15:50:26 +0100
commite0600346e25844b00a95b354f9d914e4f055ce69 (patch)
tree575c9bbaae2652b0810c1dbd5a45e1352dcfb80d
parentb7619a2603c62c955054fd8623ff61c4c1a9974a (diff)
downloadgtk+-e0600346e25844b00a95b354f9d914e4f055ce69.tar.gz
scrolledwindow: Turn into no-window widget
-rw-r--r--gtk/gtkscrolledwindow.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index b3d95bb7a7..a662234506 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -222,6 +222,8 @@ struct _GtkScrolledWindowPrivate
GtkWidget *hscrollbar;
GtkWidget *vscrollbar;
+ GdkWindow *view_window;
+
GtkCssGadget *gadget;
GtkCssNode *overshoot_node[4];
GtkCssNode *undershoot_node[4];
@@ -2006,7 +2008,7 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
scrolled_window->priv = priv =
gtk_scrolled_window_get_instance_private (scrolled_window);
- gtk_widget_set_has_window (widget, TRUE);
+ gtk_widget_set_has_window (widget, FALSE);
gtk_widget_set_can_focus (widget, TRUE);
/* Instantiated by gtk_scrolled_window_set_[hv]adjustment
@@ -3245,7 +3247,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
gtk_widget_set_allocation (widget, allocation);
if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (gtk_widget_get_window (widget),
+ gdk_window_move_resize (priv->view_window,
allocation->x, allocation->y,
allocation->width, allocation->height);
@@ -3925,6 +3927,9 @@ static void
gtk_scrolled_window_map (GtkWidget *widget)
{
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
+ GtkScrolledWindowPrivate *priv = scrolled_window->priv;
+
+ gdk_window_show (priv->view_window);
GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->map (widget);
@@ -3935,9 +3940,12 @@ static void
gtk_scrolled_window_unmap (GtkWidget *widget)
{
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
+ GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->unmap (widget);
+ gdk_window_hide (priv->view_window);
+
gtk_scrolled_window_update_animating (scrolled_window);
indicator_stop_fade (&scrolled_window->priv->hindicator);
@@ -3948,19 +3956,22 @@ static GdkWindow *
create_indicator_window (GtkScrolledWindow *scrolled_window,
GtkWidget *child)
{
+ GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GtkWidget *widget = GTK_WIDGET (scrolled_window);
GtkAllocation allocation;
GdkWindow *window;
gtk_scrolled_window_allocate_scrollbar (scrolled_window, child, &allocation);
- window = gdk_window_new_child (gtk_widget_get_window (widget),
+ window = gdk_window_new_child (priv->view_window,
gtk_widget_get_events (widget),
&allocation);
gtk_widget_register_window (widget, window);
if (scrolled_window->priv->use_indicators)
gtk_widget_set_parent_window (child, window);
+ else
+ gtk_widget_set_parent_window (child, priv->view_window);
return window;
}
@@ -4119,6 +4130,7 @@ static void
remove_indicator (GtkScrolledWindow *scrolled_window,
Indicator *indicator)
{
+ GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GtkWidget *scrollbar;
GtkStyleContext *context;
GtkAdjustment *adjustment;
@@ -4154,6 +4166,7 @@ remove_indicator (GtkScrolledWindow *scrolled_window,
g_object_ref (scrollbar);
gtk_widget_unparent (scrollbar);
+ gtk_widget_set_parent_window (scrollbar, priv->view_window);
gtk_widget_set_parent (scrollbar, GTK_WIDGET (scrolled_window));
g_object_unref (scrollbar);
@@ -4208,21 +4221,21 @@ gtk_scrolled_window_realize (GtkWidget *widget)
{
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
- GdkWindow *window;
GtkAllocation allocation;
gtk_widget_get_allocation (widget, &allocation);
- window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
- gtk_widget_get_events (widget)
- | GDK_ENTER_NOTIFY_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_POINTER_MOTION_MASK,
- &allocation);
+ priv->view_window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
+ gtk_widget_get_events (widget)
+ | GDK_ENTER_NOTIFY_MASK
+ | GDK_LEAVE_NOTIFY_MASK
+ | GDK_POINTER_MOTION_MASK,
+ &allocation);
- gtk_widget_set_window (widget, window);
- gtk_widget_register_window (widget, window);
- gtk_widget_set_realized (widget, TRUE);
+ gtk_widget_register_window (widget, priv->view_window);
+
+ if (gtk_bin_get_child (GTK_BIN (widget)))
+ gtk_widget_set_parent_window (gtk_bin_get_child (GTK_BIN (widget)), priv->view_window);
priv->hindicator.window = create_indicator_window (scrolled_window, priv->hscrollbar);
priv->vindicator.window = create_indicator_window (scrolled_window, priv->vscrollbar);
@@ -4231,6 +4244,8 @@ gtk_scrolled_window_realize (GtkWidget *widget)
priv->vindicator.scrollbar = priv->vscrollbar;
gtk_scrolled_window_sync_use_indicators (scrolled_window);
+
+ GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->realize (widget);
}
static void
@@ -4282,6 +4297,10 @@ gtk_scrolled_window_unrealize (GtkWidget *widget)
gtk_widget_unregister_window (widget, priv->vindicator.window);
indicator_reset (&priv->hindicator);
+ gtk_widget_unregister_window (widget, priv->view_window);
+ gdk_window_destroy (priv->view_window);
+ priv->view_window = NULL;
+
GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->unrealize (widget);
}