gtktextview: Claim drag gesture after an actual selection change
authorCarlos Garnacho <carlosg@gnome.org>
Sun, 27 Nov 2022 12:18:18 +0000 (13:18 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 28 Nov 2022 14:46:41 +0000 (15:46 +0100)
This way, the drag gesture lets the click gesture ::release handler
happen if there was no actual changes to the selected text (i.e.
too short drags). This matches the ::release handler behavior match
the situations in which the OSK was being invoked by the wayland
GtkIMContext.

gtk/gtktextview.c

index 8679d8b2647a04a6b264239158dad05c74ab6001..7181993c4c35cb1fc06d7bd48b5c1643932ab149 100644 (file)
@@ -7418,6 +7418,9 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
   SelectionData *data;
   GdkDevice *device;
   GtkTextIter cursor;
+  GtkTextIter orig_start, orig_end;
+  GtkTextIter start, end;
+  GtkTextBuffer *buffer;
 
   data = g_object_get_qdata (G_OBJECT (gesture), quark_text_selection_data);
   sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
@@ -7477,22 +7480,19 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
 
   g_assert (data != NULL);
 
+  buffer = get_buffer (text_view);
+
+  gtk_text_buffer_get_iter_at_mark (buffer, &orig_start, data->orig_start);
+  gtk_text_buffer_get_iter_at_mark (buffer, &orig_end, data->orig_end);
+
   /* Text selection */
   if (data->granularity == SELECT_CHARACTERS)
     {
       move_mark_to_pointer_and_scroll (text_view, "insert");
+      gtk_text_buffer_get_selection_bounds (buffer, &start, &end);
     }
   else
     {
-      GtkTextIter start, end;
-      GtkTextIter orig_start, orig_end;
-      GtkTextBuffer *buffer;
-
-      buffer = get_buffer (text_view);
-
-      gtk_text_buffer_get_iter_at_mark (buffer, &orig_start, data->orig_start);
-      gtk_text_buffer_get_iter_at_mark (buffer, &orig_end, data->orig_end);
-
       get_iter_from_gesture (text_view, text_view->priv->drag_gesture,
                              &cursor, NULL, NULL);
 
@@ -7509,6 +7509,10 @@ gtk_text_view_drag_gesture_update (GtkGestureDrag *gesture,
                                          gtk_text_buffer_get_insert (buffer));
     }
 
+  if (gtk_text_iter_compare (&orig_start, &start) != 0 ||
+      gtk_text_iter_compare (&orig_end, &end) != 0)
+    gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+
   /* If we had to scroll offscreen, insert a timeout to do so
    * again. Note that in the timeout, even if the mouse doesn't
    * move, due to this scroll xoffset/yoffset will have changed