summaryrefslogtreecommitdiff
path: root/gtk/gtktexthandle.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-01-22 16:41:00 +0100
committerCarlos Garnacho <carlosg@gnome.org>2014-01-22 17:10:07 +0100
commit9fe26a93eb9996333fc28ac4a7f15d13b1c1f09d (patch)
treeeca5e05a483c427debf787c5ec1411782aaa0475 /gtk/gtktexthandle.c
parent328404795b916b0273b4a01129f744e16493a995 (diff)
downloadgtk+-9fe26a93eb9996333fc28ac4a7f15d13b1c1f09d.tar.gz
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.
Diffstat (limited to 'gtk/gtktexthandle.c')
-rw-r--r--gtk/gtktexthandle.c42
1 files 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
@@ -252,6 +252,40 @@ _gtk_text_handle_ensure_widget (GtkTextHandle *handle,
}
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);