summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-01-18 23:31:09 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-03-16 19:50:21 +0100
commit07a5cf4996e3774c743bb5a8d97e07ca45d1b4c3 (patch)
tree7dcd8816438f0940f66a0090d6f6e7b72b9c26f3
parentd808298b68b919b4cd9eb834b2da8d0d72759c55 (diff)
downloadgtk+-07a5cf4996e3774c743bb5a8d97e07ca45d1b4c3.tar.gz
gtk/imwayland: Use serial to control outbound messages
Following the text-input protocol changes at https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/115, use the serial number to have the client push changes to the zwp_text_input_v3 object only after compositor/client states match. This specifically is more lenient to compositors pushing multiple .done events ahead of the client replying to them. Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3641
-rw-r--r--gtk/gtkimcontextwayland.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/gtk/gtkimcontextwayland.c b/gtk/gtkimcontextwayland.c
index e0259d0182..486435f9e0 100644
--- a/gtk/gtkimcontextwayland.c
+++ b/gtk/gtkimcontextwayland.c
@@ -48,6 +48,7 @@ struct _GtkIMContextWaylandGlobal
gboolean focused;
guint serial;
+ guint done_serial;
};
struct _GtkIMContextWaylandClass
@@ -207,11 +208,11 @@ text_input_commit (void *data,
}
static void
-text_input_commit_apply (GtkIMContextWaylandGlobal *global, gboolean valid)
+text_input_commit_apply (GtkIMContextWaylandGlobal *global)
{
GtkIMContextWayland *context;
context = GTK_IM_CONTEXT_WAYLAND (global->current);
- if (context->pending_commit && valid)
+ if (context->pending_commit)
g_signal_emit_by_name (global->current, "commit", context->pending_commit);
g_free (context->pending_commit);
context->pending_commit = NULL;
@@ -236,8 +237,7 @@ text_input_delete_surrounding_text (void *data,
}
static void
-text_input_delete_surrounding_text_apply (GtkIMContextWaylandGlobal *global,
- gboolean valid)
+text_input_delete_surrounding_text_apply (GtkIMContextWaylandGlobal *global)
{
GtkIMContextWayland *context;
gboolean retval;
@@ -248,7 +248,7 @@ text_input_delete_surrounding_text_apply (GtkIMContextWaylandGlobal *global,
len = context->pending_surrounding_delete.after_length
+ context->pending_surrounding_delete.before_length;
- if (len > 0 && valid)
+ if (len > 0)
g_signal_emit_by_name (global->current, "delete-surrounding",
-context->pending_surrounding_delete.before_length,
len, &retval);
@@ -262,16 +262,16 @@ text_input_done (void *data,
{
GtkIMContextWaylandGlobal *global = data;
gboolean result;
- gboolean valid;
-
+
+ global->done_serial = serial;
+
if (!global->current)
return;
- valid = serial == global->serial;
- text_input_delete_surrounding_text_apply(global, valid);
- text_input_commit_apply(global, valid);
+ text_input_delete_surrounding_text_apply (global);
+ text_input_commit_apply (global);
g_signal_emit_by_name (global->current, "retrieve-surrounding", &result);
- text_input_preedit_apply(global);
+ text_input_preedit_apply (global);
}
static void
@@ -288,6 +288,8 @@ notify_surrounding_text (GtkIMContextWayland *context)
global = gtk_im_context_wayland_get_global (context);
if (global == NULL)
return;
+ if (global->done_serial != global->serial)
+ return;
len = strlen (context->surrounding.text);
cursor = context->surrounding.cursor_idx;
@@ -362,6 +364,8 @@ notify_cursor_location (GtkIMContextWayland *context)
global = gtk_im_context_wayland_get_global (context);
if (global == NULL)
return;
+ if (global->done_serial != global->serial)
+ return;
rect = context->cursor_rect;
gtk_widget_translate_coordinates (context->widget,
@@ -452,6 +456,8 @@ notify_content_type (GtkIMContextWayland *context)
global = gtk_im_context_wayland_get_global (context);
if (global == NULL)
return;
+ if (global->done_serial != global->serial)
+ return;
g_object_get (context,
"input-hints", &hints,