]> granicus.if.org Git - vim/commitdiff
patch 8.2.3654: GTK: a touch-drag does not update the selection v8.2.3654
authorChris Dalton <csmartdalton@gmail.com>
Tue, 23 Nov 2021 12:27:48 +0000 (12:27 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 23 Nov 2021 12:27:48 +0000 (12:27 +0000)
Problem:    GTK: a touch-drag does not update the selection.
Solution:   Add GDK_BUTTON1_MASK to the state. (Chris Dalton, close #9196,
            closes #9194)

src/gui_gtk_x11.c
src/version.c

index 4e89c4e70c24ed4af89ec2ce887907fd28acdedd..6381a95f6abc09c0fbc09b74a797aa90ef5bb62f 100644 (file)
@@ -396,6 +396,12 @@ static int using_gnome = 0;
 # define 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
@@ -1585,6 +1591,9 @@ process_motion_notify(int x, int y, GdkModifierType state)
     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 UNUSED,
 
     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;
 }
 
index 8566cc3ffe96b416588e4e811565ca1f0e8d03f8..f84925212271c67458f02ce244b2f3fb6c661f83 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3654,
 /**/
     3653,
 /**/