[gtk+/wip/carlosg/event-delivery: 239/261] gtkscrolledwindows: Remove child windows
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/carlosg/event-delivery: 239/261] gtkscrolledwindows: Remove child windows
- Date: Mon, 8 May 2017 21:04:45 +0000 (UTC)
commit c9706dd6f479e7ffdd6f1d1d01cdfbd7963fc53b
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Apr 4 00:40:12 2017 +0200
gtkscrolledwindows: Remove child windows
Both for the view (compensated by widget clip) and the scrollbar
indicators (just not needed anymore).
gtk/gtkscrolledwindow.c | 216 ++++++++---------------------------------------
1 files changed, 35 insertions(+), 181 deletions(-)
---
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 46fcf40..5f36335 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -183,7 +183,6 @@
typedef struct
{
GtkWidget *scrollbar;
- GdkWindow *window;
gboolean over; /* either mouse over, or while dragging */
gint64 last_scroll_time;
guint conceil_timer;
@@ -208,8 +207,6 @@ struct _GtkScrolledWindowPrivate
GtkWidget *hscrollbar;
GtkWidget *vscrollbar;
- GdkWindow *view_window;
-
GtkCssGadget *gadget;
GtkCssNode *overshoot_node[4];
GtkCssNode *undershoot_node[4];
@@ -244,8 +241,6 @@ struct _GtkScrolledWindowPrivate
GArray *scroll_history;
GdkDevice *scroll_device;
- GdkWindow *scroll_window;
- GdkCursor *scroll_cursor;
/* These two gestures are mutually exclusive */
GtkGesture *drag_gesture;
@@ -338,7 +333,8 @@ static void gtk_scrolled_window_move_focus_out (GtkScrolledWindow *scrol
static void gtk_scrolled_window_relative_allocation(GtkWidget *widget,
GtkAllocation *allocation);
static void gtk_scrolled_window_inner_allocation (GtkWidget *widget,
- GtkAllocation *rect);
+ GtkAllocation *rect,
+ gboolean widget_relative);
static void gtk_scrolled_window_allocate_scrollbar (GtkScrolledWindow *scrolled_window,
GtkWidget *scrollbar,
GtkAllocation *allocation);
@@ -1080,43 +1076,6 @@ indicator_set_over (Indicator *indicator,
gtk_widget_queue_resize (indicator->scrollbar);
}
-static void
-translate_to_widget (GtkWidget *widget,
- GdkEvent *event,
- gint *x,
- gint *y)
-{
- GtkWidget *event_widget;
- GdkWindow *event_widget_window;
- GdkWindow *window;
- gdouble event_x, event_y;
- gint wx, wy;
- GtkAllocation allocation;
-
- event_widget = gtk_get_event_widget (event);
- event_widget_window = gtk_widget_get_window (event_widget);
- gdk_event_get_coords (event, &event_x, &event_y);
- window = event->any.window;
- while (window && window != event_widget_window)
- {
- gdk_window_get_position (window, &wx, &wy);
- event_x += wx;
- event_y += wy;
- window = gdk_window_get_parent (window);
- }
-
- if (!gtk_widget_get_has_window (event_widget))
- {
- gtk_widget_get_allocation (event_widget, &allocation);
- event_x -= allocation.x;
- event_y -= allocation.y;
- }
-
- gtk_widget_translate_coordinates (event_widget, widget,
- (gint)event_x, (gint)event_y,
- x, y);
-}
-
static gboolean
event_close_to_indicator (GtkScrolledWindow *sw,
Indicator *indicator,
@@ -1124,15 +1083,13 @@ event_close_to_indicator (GtkScrolledWindow *sw,
{
GtkScrolledWindowPrivate *priv;
GtkAllocation indicator_alloc;
- gint x, y;
+ gdouble x, y;
gint distance;
- gint win_x, win_y;
priv = sw->priv;
gtk_widget_get_allocation (indicator->scrollbar, &indicator_alloc);
- gdk_window_get_position (indicator->window, &win_x, &win_y);
- translate_to_widget (GTK_WIDGET (sw), event, &x, &y);
+ gdk_event_get_coords (event, &x, &y);
if (indicator->over)
distance = INDICATOR_FAR_DISTANCE;
@@ -1141,14 +1098,14 @@ event_close_to_indicator (GtkScrolledWindow *sw,
if (indicator == &priv->hindicator)
{
- if (y >= win_y - distance &&
- y < win_y + indicator_alloc.height + distance)
+ if (y >= indicator_alloc.y - distance &&
+ y < indicator_alloc.y + indicator_alloc.height + distance)
return TRUE;
}
else if (indicator == &priv->vindicator)
{
- if (x >= win_x - distance &&
- x < win_x + indicator_alloc.width + distance)
+ if (x >= indicator_alloc.x - distance &&
+ x < indicator_alloc.x + indicator_alloc.width + distance)
return TRUE;
}
@@ -1639,17 +1596,6 @@ gtk_scrolled_window_allocate (GtkCssGadget *gadget,
gtk_scrolled_window_allocate_scrollbar (scrolled_window,
priv->hscrollbar,
&child_allocation);
- if (priv->use_indicators)
- {
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (priv->hindicator.window,
- child_allocation.x,
- child_allocation.y,
- child_allocation.width,
- child_allocation.height);
- child_allocation.x = 0;
- child_allocation.y = 0;
- }
gtk_widget_size_allocate (priv->hscrollbar, &child_allocation);
}
@@ -1659,17 +1605,6 @@ gtk_scrolled_window_allocate (GtkCssGadget *gadget,
gtk_scrolled_window_allocate_scrollbar (scrolled_window,
priv->vscrollbar,
&child_allocation);
- if (priv->use_indicators)
- {
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (priv->vindicator.window,
- child_allocation.x,
- child_allocation.y,
- child_allocation.width,
- child_allocation.height);
- child_allocation.x = 0;
- child_allocation.y = 0;
- }
gtk_widget_size_allocate (priv->vscrollbar, &child_allocation);
}
@@ -1849,7 +1784,7 @@ gtk_scrolled_window_snapshot_overshoot (GtkScrolledWindow *scrolled_window,
return;
context = gtk_widget_get_style_context (widget);
- gtk_scrolled_window_inner_allocation (widget, &rect);
+ gtk_scrolled_window_inner_allocation (widget, &rect, TRUE);
overshoot_x = CLAMP (overshoot_x, - MAX_OVERSHOOT_DISTANCE, MAX_OVERSHOOT_DISTANCE);
overshoot_y = CLAMP (overshoot_y, - MAX_OVERSHOOT_DISTANCE, MAX_OVERSHOOT_DISTANCE);
@@ -1896,7 +1831,7 @@ gtk_scrolled_window_snapshot_undershoot (GtkScrolledWindow *scrolled_window,
GtkAdjustment *adj;
context = gtk_widget_get_style_context (widget);
- gtk_scrolled_window_inner_allocation (widget, &rect);
+ gtk_scrolled_window_inner_allocation (widget, &rect, TRUE);
adj = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar));
if (gtk_adjustment_get_value (adj) < gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))
@@ -2826,7 +2761,8 @@ gtk_scrolled_window_get_property (GObject *object,
static void
gtk_scrolled_window_inner_allocation (GtkWidget *widget,
- GtkAllocation *rect)
+ GtkAllocation *rect,
+ gboolean widget_relative)
{
GtkWidget *child;
GtkBorder border = { 0 };
@@ -2840,6 +2776,14 @@ gtk_scrolled_window_inner_allocation (GtkWidget *widget,
rect->width -= border.left + border.right;
rect->height -= border.top + border.bottom;
}
+
+ if (widget_relative)
+ {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation (widget, &allocation);
+ rect->x -= allocation.x;
+ rect->y -= allocation.y;
+ }
}
static void
@@ -2985,7 +2929,6 @@ static void
gtk_scrolled_window_relative_allocation (GtkWidget *widget,
GtkAllocation *allocation)
{
- GtkAllocation content_allocation, widget_allocation;
GtkScrolledWindow *scrolled_window;
GtkScrolledWindowPrivate *priv;
gint sb_width;
@@ -3003,13 +2946,7 @@ gtk_scrolled_window_relative_allocation (GtkWidget *widget,
gtk_widget_measure (priv->hscrollbar, GTK_ORIENTATION_VERTICAL, -1,
&sb_height, NULL, NULL, NULL);
- gtk_css_gadget_get_content_allocation (priv->gadget, &content_allocation, NULL);
- gtk_widget_get_allocation (widget, &widget_allocation);
-
- allocation->x = content_allocation.x - widget_allocation.x;
- allocation->y = content_allocation.y - widget_allocation.y;
- allocation->width = content_allocation.width;
- allocation->height = content_allocation.height;
+ gtk_css_gadget_get_content_allocation (priv->gadget, allocation, NULL);
/* Subtract some things from our available allocation size */
if (priv->vscrollbar_visible && !priv->use_indicators)
@@ -3115,7 +3052,7 @@ gtk_scrolled_window_allocate_scrollbar (GtkScrolledWindow *scrolled_window,
priv = scrolled_window->priv;
- gtk_scrolled_window_inner_allocation (widget, &content_allocation);
+ gtk_scrolled_window_inner_allocation (widget, &content_allocation, FALSE);
gtk_widget_measure (priv->vscrollbar, GTK_ORIENTATION_HORIZONTAL, -1,
&sb_width, NULL, NULL, NULL);
gtk_widget_measure (priv->hscrollbar, GTK_ORIENTATION_VERTICAL, -1,
@@ -3189,11 +3126,6 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
gtk_widget_set_allocation (widget, allocation);
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (priv->view_window,
- allocation->x, allocation->y,
- allocation->width, allocation->height);
-
gtk_css_gadget_allocate (priv->gadget,
allocation,
gtk_widget_get_allocated_baseline (widget),
@@ -3203,38 +3135,21 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget,
}
static void
-install_scroll_cursor (GtkScrolledWindow *scrolled_window,
- GdkWindow *window)
+install_scroll_cursor (GtkScrolledWindow *scrolled_window)
{
- GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GdkDisplay *display;
GdkCursor *cursor;
- if (priv->scroll_window)
- return;
-
- priv->scroll_window = window;
- priv->scroll_cursor = gdk_window_get_cursor (priv->scroll_window);
- if (priv->scroll_cursor)
- g_object_ref (priv->scroll_cursor);
-
- display = gdk_window_get_display (priv->scroll_window);
+ display = gtk_widget_get_display (GTK_WIDGET (scrolled_window));
cursor = gdk_cursor_new_from_name (display, "all-scroll");
- gdk_window_set_cursor (priv->scroll_window, cursor);
+ gtk_widget_set_cursor (GTK_WIDGET (scrolled_window), cursor);
g_clear_object (&cursor);
}
static void
uninstall_scroll_cursor (GtkScrolledWindow *scrolled_window)
{
- GtkScrolledWindowPrivate *priv = scrolled_window->priv;
-
- if (priv->scroll_window)
- {
- gdk_window_set_cursor (priv->scroll_window, priv->scroll_cursor);
- priv->scroll_window = NULL;
- g_clear_object (&priv->scroll_cursor);
- }
+ gtk_widget_set_cursor (GTK_WIDGET (scrolled_window), NULL);
}
static gboolean
@@ -3290,7 +3205,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
if (input_source == GDK_SOURCE_TRACKPOINT ||
input_source == GDK_SOURCE_TOUCHPAD)
- install_scroll_cursor (scrolled_window, gdk_event_get_window ((GdkEvent *)event));
+ install_scroll_cursor (scrolled_window);
if (shifted)
{
@@ -3865,9 +3780,6 @@ 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);
@@ -3878,42 +3790,15 @@ 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);
indicator_stop_fade (&scrolled_window->priv->vindicator);
}
-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 (priv->view_window,
- GDK_ALL_EVENTS_MASK,
- &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;
-}
-
static void
indicator_set_fade (Indicator *indicator,
gdouble pos)
@@ -3925,14 +3810,12 @@ indicator_set_fade (Indicator *indicator,
visible = indicator->current_pos != 0.0 || indicator->target_pos != 0.0;
- if (visible && !gdk_window_is_visible (indicator->window))
+ if (visible && !gtk_widget_get_mapped (indicator->scrollbar))
{
- gdk_window_show (indicator->window);
indicator->conceil_timer = g_timeout_add (INDICATOR_FADE_OUT_TIME, maybe_hide_indicator, indicator);
}
- if (!visible && gdk_window_is_visible (indicator->window))
+ if (!visible && gtk_widget_get_mapped (indicator->scrollbar))
{
- gdk_window_hide (indicator->window);
g_source_remove (indicator->conceil_timer);
indicator->conceil_timer = 0;
}
@@ -4007,7 +3890,6 @@ indicator_stop_fade (Indicator *indicator)
indicator->conceil_timer = 0;
}
- gdk_window_hide (indicator->window);
gtk_progress_tracker_finish (&indicator->tracker);
indicator->current_pos = indicator->source_pos = indicator->target_pos = 0;
indicator->last_scroll_time = 0;
@@ -4049,9 +3931,11 @@ setup_indicator (GtkScrolledWindow *scrolled_window,
indicator->scrollbar = scrollbar;
+ /* FIXME: This shouldn't be necessary anymore, but it is for scrollbars
+ * to receive events.
+ */
g_object_ref (scrollbar);
gtk_widget_unparent (scrollbar);
- gtk_widget_set_parent_window (scrollbar, indicator->window);
gtk_widget_set_parent (scrollbar, GTK_WIDGET (scrolled_window));
g_object_unref (scrollbar);
@@ -4059,7 +3943,6 @@ setup_indicator (GtkScrolledWindow *scrolled_window,
g_signal_connect (adjustment, "value-changed",
G_CALLBACK (indicator_value_changed), indicator);
- gdk_window_hide (indicator->window);
gtk_widget_set_opacity (scrollbar, 0.0);
indicator->current_pos = 0.0;
}
@@ -4068,7 +3951,6 @@ static void
remove_indicator (GtkScrolledWindow *scrolled_window,
Indicator *indicator)
{
- GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GtkWidget *scrollbar;
GtkStyleContext *context;
GtkAdjustment *adjustment;
@@ -4102,15 +3984,14 @@ remove_indicator (GtkScrolledWindow *scrolled_window,
indicator->tick_id = 0;
}
+ /* FIXME: This shouldn't be necessary anymore, but it is for scrollbars
+ * to receive events.
+ */
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);
- if (indicator->window)
- gdk_window_hide (indicator->window);
-
gtk_widget_set_opacity (scrollbar, 1.0);
indicator->current_pos = 1.0;
}
@@ -4163,18 +4044,6 @@ gtk_scrolled_window_realize (GtkWidget *widget)
gtk_widget_get_allocation (widget, &allocation);
- priv->view_window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
- GDK_ALL_EVENTS_MASK,
- &allocation);
-
- 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);
-
priv->hindicator.scrollbar = priv->hscrollbar;
priv->vindicator.scrollbar = priv->vscrollbar;
@@ -4205,12 +4074,6 @@ indicator_reset (Indicator *indicator)
indicator->tick_id = 0;
}
- if (indicator->window)
- {
- gdk_window_destroy (indicator->window);
- indicator->window = NULL;
- }
-
indicator->scrollbar = NULL;
indicator->over = FALSE;
gtk_progress_tracker_finish (&indicator->tracker);
@@ -4224,18 +4087,9 @@ gtk_scrolled_window_unrealize (GtkWidget *widget)
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
- gtk_widget_set_parent_window (priv->hscrollbar, NULL);
- gtk_widget_unregister_window (widget, priv->hindicator.window);
indicator_reset (&priv->hindicator);
-
- gtk_widget_set_parent_window (priv->vscrollbar, NULL);
- gtk_widget_unregister_window (widget, priv->vindicator.window);
indicator_reset (&priv->vindicator);
- 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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]