Commit 38a4c4dd authored by Carlos Garnacho's avatar Carlos Garnacho

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: #1277
parent 2db6dbd1
Pipeline #57548 passed with stage
in 7 minutes and 36 seconds
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment