wayland: Represent preedit string cursor offset in bytes

Both IBus and ClutterInputFocus work in character offsets for the cursor
position in the preedit string. However the zwp_text_input protocol does
define the preedit string cursor offset to be in bytes.

Fixes client bugs in representing the caret within the preedit string,
as we were clearly giving the wrong offset.

Fixes: https://gitlab.gnome.org/GNOME/gtk/issues/2517

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1132
This commit is contained in:
Carlos Garnacho 2020-03-17 16:11:57 +01:00 committed by Robert Mader
parent fa74da0039
commit db9b60cc63

View File

@ -207,12 +207,14 @@ meta_wayland_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
{ {
MetaWaylandTextInput *text_input; MetaWaylandTextInput *text_input;
struct wl_resource *resource; struct wl_resource *resource;
gsize pos;
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input; text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
pos = g_utf8_offset_to_pointer (text, cursor) - text;
wl_resource_for_each (resource, &text_input->focus_resource_list) wl_resource_for_each (resource, &text_input->focus_resource_list)
{ {
zwp_text_input_v3_send_preedit_string (resource, text, cursor, cursor); zwp_text_input_v3_send_preedit_string (resource, text, pos, pos);
} }
meta_wayland_text_input_focus_defer_done (focus); meta_wayland_text_input_focus_defer_done (focus);