diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c
index e1947c437..2f337a363 100644
--- a/clutter/clutter/clutter-text.c
+++ b/clutter/clutter/clutter-text.c
@@ -411,6 +411,7 @@ clutter_text_input_focus_class_init (ClutterTextInputFocusClass *klass)
   focus_class->delete_surrounding = clutter_text_input_focus_delete_surrounding;
   focus_class->commit_text = clutter_text_input_focus_commit_text;
   focus_class->set_preedit_text = clutter_text_input_focus_set_preedit_text;
+  focus_class->set_preedit_text_with_mode = clutter_text_input_focus_set_preedit_text;
 }
 
 static void
diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c
index 87f4b636a..b5a0644ea 100644
--- a/src/wayland/meta-wayland-text-input.c
+++ b/src/wayland/meta-wayland-text-input.c
@@ -73,8 +73,6 @@ struct _MetaWaylandTextInput
   uint32_t content_type_purpose;
   uint32_t text_change_cause;
   gboolean enabled;
-
-  guint done_idle_id;
 };
 
 struct _MetaWaylandTextInputFocus
@@ -119,52 +117,6 @@ increment_serial (MetaWaylandTextInput *text_input,
                        GUINT_TO_POINTER (serial + 1));
 }
 
-static gboolean
-done_idle_cb (gpointer user_data)
-{
-  ClutterInputFocus *focus = user_data;
-  MetaWaylandTextInput *text_input;
-  struct wl_resource *resource;
-
-  text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
-
-  wl_resource_for_each (resource, &text_input->focus_resource_list)
-    {
-      zwp_text_input_v3_send_done (resource,
-                                   lookup_serial (text_input, resource));
-    }
-
-  text_input->done_idle_id = 0;
-  return G_SOURCE_REMOVE;
-}
-
-static void
-meta_wayland_text_input_focus_defer_done (ClutterInputFocus *focus)
-{
-  MetaWaylandTextInput *text_input;
-
-  text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
-
-  if (text_input->done_idle_id != 0)
-    return;
-
-  /* This operates on 3 principles:
-   * - GDBus uses G_PRIORITY_DEFAULT to put messages in the thread default main
-   *   context.
-   * - All relevant ClutterInputFocus methods are ultimately backed by
-   *   DBus methods inside IBus.
-   * - We want to run .done after them all. The slightly lower
-   *   G_PRIORITY_DEFAULT + 1 priority should ensure we at least group
-   *   all messages seen so far.
-   *
-   * FIXME: .done may be delayed indefinitely if there's a high enough
-   *        priority idle source in the main loop. It's unlikely that
-   *        recurring idles run at this high priority though.
-   */
-  text_input->done_idle_id = g_idle_add_full (G_PRIORITY_DEFAULT + 1,
-                                              done_idle_cb, focus, NULL);
-}
-
 static void
 meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
                                                   int                offset,
@@ -185,9 +137,9 @@ meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
       zwp_text_input_v3_send_delete_surrounding_text (resource,
                                                       before_length,
                                                       after_length);
+      zwp_text_input_v3_send_done (resource,
+                                   lookup_serial (text_input, resource));
     }
-
-  meta_wayland_text_input_focus_defer_done (focus);
 }
 
 static void
@@ -204,9 +156,9 @@ meta_wayland_text_input_focus_commit_text (ClutterInputFocus *focus,
       zwp_text_input_v3_send_preedit_string (resource, NULL, 0, 0);
       zwp_text_input_v3_send_preedit_commit_mode (resource, ZWP_TEXT_INPUT_V3_COMMIT_MODE_CLEAR);
       zwp_text_input_v3_send_commit_string (resource, text);
+      zwp_text_input_v3_send_done (resource,
+                                   lookup_serial (text_input, resource));
     }
-
-  meta_wayland_text_input_focus_defer_done (focus);
 }
 
 static void
@@ -228,9 +180,9 @@ meta_wayland_text_input_focus_set_preedit_text_with_mode (ClutterInputFocus *foc
     {
       zwp_text_input_v3_send_preedit_string (resource, text, pos, pos);
       zwp_text_input_v3_send_preedit_commit_mode (resource, mode);
+      zwp_text_input_v3_send_done (resource,
+                                   lookup_serial (text_input, resource));
     }
-
-  meta_wayland_text_input_focus_defer_done (focus);
 }
 
 static void
