SDL: Fix text_input_v3 preedit string

From a90a2e7582a73f7b69b14437287aa15945bf5989 Mon Sep 17 00:00:00 2001
From: Weng Xuetian <[EMAIL REDACTED]>
Date: Sun, 30 Jan 2022 16:44:44 -0800
Subject: [PATCH] Fix text_input_v3 preedit string

For every batch of text_input_v3 updates, if there is no preedit in this
batch, preedit should be cleared.
---
 src/video/wayland/SDL_waylandevents.c   | 8 +++++++-
 src/video/wayland/SDL_waylandkeyboard.h | 1 +
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index bf2aeea5b54..85d4edfc82c 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -1505,7 +1505,9 @@ text_input_preedit_string(void *data,
                           int32_t cursor_begin,
                           int32_t cursor_end)
 {
+    SDL_WaylandTextInput *text_input = data;
     char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
+    text_input->has_preedit = SDL_TRUE;
     if (text) {
         size_t text_bytes = SDL_strlen(text), i = 0;
         size_t cursor = 0;
@@ -1557,7 +1559,11 @@ text_input_done(void *data,
                 struct zwp_text_input_v3 *zwp_text_input_v3,
                 uint32_t serial)
 {
-    /* No-op */
+    SDL_WaylandTextInput *text_input = data;
+    if (!text_input->has_preedit) {
+        SDL_SendEditingText("", 0, 0);
+    }
+    text_input->has_preedit = SDL_FALSE;
 }
 
 static const struct zwp_text_input_v3_listener text_input_listener = {
diff --git a/src/video/wayland/SDL_waylandkeyboard.h b/src/video/wayland/SDL_waylandkeyboard.h
index dd8c146e6b2..604e0f37f81 100644
--- a/src/video/wayland/SDL_waylandkeyboard.h
+++ b/src/video/wayland/SDL_waylandkeyboard.h
@@ -27,6 +27,7 @@ typedef struct SDL_WaylandTextInput
 {
     struct zwp_text_input_v3 *text_input;
     SDL_Rect cursor_rect;
+    SDL_bool has_preedit;
 } SDL_WaylandTextInput;
 
 extern int Wayland_InitKeyboard(_THIS);