[gtk/wip/carlosg/toggle-osk-sparingly] imwayland: Toggle OSK more sparingly



commit 38a4c4dd370739c329a84d2495015e8c016df46a
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Feb 8 23:11:48 2019 +0100

    imwayland: Toggle OSK more sparingly
    
    Specifically it is avoided to be toggled if:
    - Just received focus (in order to preserve OSK state across focus changes)
    - Moving cursor around. Still allow some jitter as perfect accuracy is not
      possible.
    
    Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1277

 modules/input/imwayland.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
---
diff --git a/modules/input/imwayland.c b/modules/input/imwayland.c
index 67b9c6e641..41cb296336 100644
--- a/modules/input/imwayland.c
+++ b/modules/input/imwayland.c
@@ -731,6 +731,8 @@ gtk_im_context_wayland_focus_in (GtkIMContext *context)
   if (!global->text_input)
     return;
 
+  if (context_wayland->gesture)
+    gtk_event_controller_reset (GTK_EVENT_CONTROLLER (context_wayland->gesture));
   global->current = context;
 
   if (global->focused)
@@ -764,9 +766,30 @@ gtk_im_context_wayland_set_cursor_location (GtkIMContext *context,
                                             GdkRectangle *rect)
 {
   GtkIMContextWayland *context_wayland;
+  int side;
 
   context_wayland = GTK_IM_CONTEXT_WAYLAND (context);
 
+  if (context_wayland->cursor_rect.x == rect->x &&
+      context_wayland->cursor_rect.y == rect->y &&
+      context_wayland->cursor_rect.width == rect->width &&
+      context_wayland->cursor_rect.height == rect->height)
+    return;
+
+  /* Reset the gesture if the cursor changes too far (eg. clicking
+   * between disjoint positions in the text).
+   *
+   * Still Allow some jittering (a square almost double the cursor rect height
+   * on either side) as clicking on the exact same position between characters
+   * is hard.
+   */
+  side = context_wayland->cursor_rect.height;
+
+  if (context_wayland->gesture &&
+      (ABS (rect->x - context_wayland->cursor_rect.x) >= side ||
+       ABS (rect->y - context_wayland->cursor_rect.y) >= side))
+    gtk_event_controller_reset (GTK_EVENT_CONTROLLER (context_wayland->gesture));
+
   context_wayland->cursor_rect = *rect;
   notify_cursor_location (context_wayland);
   commit_state (context_wayland);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]