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.
This commit is contained in:
Alexander Mikhaylenko 2021-07-23 14:15:43 +05:00
parent 8d5ef4ab30
commit 00cc99818d

View File

@ -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);