[gtk/wip/exalm/gtktext-selection-fix] text: Use the widget y coordinate for gestures
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/exalm/gtktext-selection-fix] text: Use the widget y coordinate for gestures
- Date: Fri, 23 Jul 2021 18:53:47 +0000 (UTC)
commit 00cc99818d649ac0f77dd1c637d78967aba5d8e5
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Fri Jul 23 14:15:43 2021 +0500
text: Use the widget y coordinate for gestures
Currently we use layout coordinates and widget height when determining
where a click or drag has happened. If the widget has top padding (which it
does inside a GtkEntry, for example), the area where it's possible to select
text is shifted down, so the part of GtkText above the layout is not counted
as the draggable area and instead the equal area below the widget is counted.
Since GtkText is always single-line, there's no need to do any of that and
we can use widget coordinates. Then the draggable area matches the widget
and the problems goes away.
gtk/gtktext.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtktext.c b/gtk/gtktext.c
index 8d1bde4674..8e051fe413 100644
--- a/gtk/gtktext.c
+++ b/gtk/gtktext.c
@@ -2662,24 +2662,19 @@ in_selection (GtkText *self,
return retval;
}
-static void
+static int
gesture_get_current_point_in_layout (GtkGestureSingle *gesture,
- GtkText *self,
- int *x,
- int *y)
+ GtkText *self)
{
- int tx, ty;
+ int tx;
GdkEventSequence *sequence;
- double px, py;
+ double px;
sequence = gtk_gesture_single_get_current_sequence (gesture);
- gtk_gesture_get_point (GTK_GESTURE (gesture), sequence, &px, &py);
- gtk_text_get_layout_offsets (self, &tx, &ty);
+ gtk_gesture_get_point (GTK_GESTURE (gesture), sequence, &px, NULL);
+ gtk_text_get_layout_offsets (self, &tx, NULL);
- if (x)
- *x = px - tx;
- if (y)
- *y = py - ty;
+ return px - tx;
}
static void
@@ -2737,7 +2732,8 @@ gtk_text_click_gesture_pressed (GtkGestureClick *gesture,
current = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), current);
- gesture_get_current_point_in_layout (GTK_GESTURE_SINGLE (gesture), self, &x, &y);
+ x = gesture_get_current_point_in_layout (GTK_GESTURE_SINGLE (gesture), self);
+ y = widget_y;
gtk_text_reset_blink_time (self);
if (!gtk_widget_has_focus (widget))
@@ -2989,10 +2985,14 @@ gtk_text_drag_gesture_update (GtkGestureDrag *gesture,
GdkEventSequence *sequence;
GdkEvent *event;
int x, y;
+ double start_y;
gtk_text_selection_bubble_popup_unset (self);
- gesture_get_current_point_in_layout (GTK_GESTURE_SINGLE (gesture), self, &x, &y);
+ x = gesture_get_current_point_in_layout (GTK_GESTURE_SINGLE (gesture), self);
+ gtk_gesture_drag_get_start_point (gesture, NULL, &start_y);
+ y = start_y + offset_y;
+
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]