From 9fe26a93eb9996333fc28ac4a7f15d13b1c1f09d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 22 Jan 2014 16:41:00 +0100 Subject: [PATCH] texthandle: Update child visibility of handles within scrollables If the rect a handle points to starts falling outside of the parent scrollable allocation, the handle will be automatically hidden, and shown again when the rectangle is visible too. --- gtk/gtktexthandle.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c index 145797da58..0f05d5aa82 100644 --- a/gtk/gtktexthandle.c +++ b/gtk/gtktexthandle.c @@ -251,6 +251,40 @@ _gtk_text_handle_ensure_widget (GtkTextHandle *handle, return priv->windows[pos].widget; } +static void +_handle_update_child_visible (GtkTextHandle *handle, + GtkTextHandlePosition pos) +{ + HandleWindow *handle_window; + GtkTextHandlePrivate *priv; + cairo_rectangle_int_t rect; + GtkAllocation allocation; + GtkWidget *parent; + + priv = handle->priv; + handle_window = &priv->windows[pos]; + + if (!priv->parent_scrollable) + { + gtk_widget_set_child_visible (handle_window->widget, TRUE); + return; + } + + parent = gtk_widget_get_parent (GTK_WIDGET (priv->parent_scrollable)); + rect = handle_window->pointing_to; + + gtk_widget_translate_coordinates (priv->parent, parent, + rect.x, rect.y, &rect.x, &rect.y); + + gtk_widget_get_allocation (GTK_WIDGET (parent), &allocation); + + if (rect.x < 0 || rect.x + rect.width > allocation.width || + rect.y < 0 || rect.y + rect.height > allocation.height) + gtk_widget_set_child_visible (handle_window->widget, FALSE); + else + gtk_widget_set_child_visible (handle_window->widget, TRUE); +} + static void _gtk_text_handle_update (GtkTextHandle *handle, GtkTextHandlePosition pos) @@ -273,9 +307,13 @@ _gtk_text_handle_update (GtkTextHandle *handle, GtkWidget *window; _gtk_text_handle_ensure_widget (handle, pos); + _gtk_text_handle_get_size (handle, &width, &height); rect.x = handle_window->pointing_to.x; rect.y = handle_window->pointing_to.y; - _gtk_text_handle_get_size (handle, &width, &height); + rect.width = width; + rect.height = 0; + + _handle_update_child_visible (handle, pos); window = gtk_widget_get_parent (handle_window->widget); gtk_widget_translate_coordinates (priv->parent, window, @@ -290,8 +328,6 @@ _gtk_text_handle_update (GtkTextHandle *handle, } height += handle_window->pointing_to.height; - rect.width = width; - rect.height = 0; rect.x -= rect.width / 2; gtk_widget_set_size_request (handle_window->widget, width, height);