changeset 26246:ed62078dfa30 v8.2.3654

patch 8.2.3654: GTK: a touch-drag does not update the selection Commit: https://github.com/vim/vim/commit/ee93e327ba31e8efb1b7de6209bdc992778b809b Author: Chris Dalton <csmartdalton@gmail.com> Date: Tue Nov 23 12:27:48 2021 +0000 patch 8.2.3654: GTK: a touch-drag does not update the selection Problem: GTK: a touch-drag does not update the selection. Solution: Add GDK_BUTTON1_MASK to the state. (Chris Dalton, close https://github.com/vim/vim/issues/9196, closes #9194)
author Bram Moolenaar <Bram@vim.org>
date Tue, 23 Nov 2021 13:30:04 +0100
parents c0aea719e669
children 6c9af12fbb17
files src/gui_gtk_x11.c src/version.c
diffstat 2 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -397,6 +397,12 @@ static int using_gnome = 0;
 #endif
 
 /*
+ * GTK doesn't set the GDK_BUTTON1_MASK state when dragging a touch. Add this
+ * state when dragging.
+ */
+static guint dragging_button_state = 0;
+
+/*
  * Parse the GUI related command-line arguments.  Any arguments used are
  * deleted from argv, and *argc is decremented accordingly.  This is called
  * when vim is started, whether or not the GUI has been started.
@@ -1585,6 +1591,9 @@ process_motion_notify(int x, int y, GdkM
     int_u   vim_modifiers;
     GtkAllocation allocation;
 
+    // Need to add GDK_BUTTON1_MASK state when dragging a touch.
+    state |= dragging_button_state;
+
     button = (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK |
 		       GDK_BUTTON3_MASK | GDK_BUTTON4_MASK |
 		       GDK_BUTTON5_MASK))
@@ -1811,7 +1820,11 @@ button_press_event(GtkWidget *widget,
     {
 	// Keep in sync with gui_x11.c.
 	// Buttons 4-7 are handled in scroll_event()
-	case 1: button = MOUSE_LEFT; break;
+	case 1:
+		button = MOUSE_LEFT;
+		// needed for touch-drag
+		dragging_button_state |= GDK_BUTTON1_MASK;
+		break;
 	case 2: button = MOUSE_MIDDLE; break;
 	case 3: button = MOUSE_RIGHT; break;
 	case 8: button = MOUSE_X1; break;
@@ -1906,6 +1919,13 @@ button_release_event(GtkWidget *widget U
 
     gui_send_mouse_event(MOUSE_RELEASE, x, y, FALSE, vim_modifiers);
 
+    switch (event->button)
+    {
+	case 1:  // MOUSE_LEFT
+	    dragging_button_state = 0;
+	    break;
+    }
+
     return TRUE;
 }
 
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3654,
+/**/
     3653,
 /**/
     3652,