From 38a4c4dd370739c329a84d2495015e8c016df46a Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 8 Feb 2019 23:11:48 +0100 Subject: [PATCH] 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);