From 2b375d9704d23dfa72eff1260451050208026413 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Sun, 5 Jan 2025 17:53:20 -0500
Subject: [PATCH] wayland: Don't enable the text-input protocol when using
Fcitx
Otherwise, key repeat will be broken. Enabling it under Wayland isn't recommended anyway.
---
src/video/wayland/SDL_waylandevents.c | 19 ++++++++++++++++++-
src/video/wayland/SDL_waylandevents_c.h | 3 ++-
src/video/wayland/SDL_waylandvideo.c | 3 +--
3 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index 842dcf6f8a701..6784bf0803995 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -2669,7 +2669,7 @@ void Wayland_create_primary_selection_device(SDL_VideoData *d)
}
}
-void Wayland_create_text_input(SDL_VideoData *d)
+static void Wayland_create_text_input(SDL_VideoData *d)
{
SDL_WaylandTextInput *text_input = NULL;
@@ -2696,6 +2696,23 @@ void Wayland_create_text_input(SDL_VideoData *d)
}
}
+void Wayland_create_text_input_manager(SDL_VideoData *d, uint32_t id)
+{
+#ifdef HAVE_FCITX
+ const char *im_module = SDL_getenv("SDL_IM_MODULE");
+ if (im_module && SDL_strcmp(im_module, "fcitx") == 0) {
+ /* Override the Wayland text-input protocol when Fcitx is enabled, like how GTK_IM_MODULE does.
+ *
+ * The Fcitx wiki discourages enabling it under Wayland via SDL_IM_MODULE, so its presence must
+ * be intentional, and this workaround is needed for fixing key repeat detection.
+ */
+ return;
+ }
+#endif
+
+ d->text_input_manager = wl_registry_bind(d->registry, id, &zwp_text_input_manager_v3_interface, 1);
+ Wayland_create_text_input(d);
+}
// Pen/Tablet support...
diff --git a/src/video/wayland/SDL_waylandevents_c.h b/src/video/wayland/SDL_waylandevents_c.h
index 069a0d96379fb..5073472da4e53 100644
--- a/src/video/wayland/SDL_waylandevents_c.h
+++ b/src/video/wayland/SDL_waylandevents_c.h
@@ -157,7 +157,8 @@ extern int Wayland_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS);
extern void Wayland_create_data_device(SDL_VideoData *d);
extern void Wayland_create_primary_selection_device(SDL_VideoData *d);
-extern void Wayland_create_text_input(SDL_VideoData *d);
+
+extern void Wayland_create_text_input_manager(SDL_VideoData *d, uint32_t id);
extern void Wayland_input_initialize_seat(SDL_VideoData *d);
extern void Wayland_display_destroy_input(SDL_VideoData *d);
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index a69b70f6932a2..7ea5a582f5a1b 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -1234,8 +1234,7 @@ static void display_handle_global(void *data, struct wl_registry *registry, uint
} else if (SDL_strcmp(interface, "xdg_activation_v1") == 0) {
d->activation_manager = wl_registry_bind(d->registry, id, &xdg_activation_v1_interface, 1);
} else if (SDL_strcmp(interface, "zwp_text_input_manager_v3") == 0) {
- d->text_input_manager = wl_registry_bind(d->registry, id, &zwp_text_input_manager_v3_interface, 1);
- Wayland_create_text_input(d);
+ Wayland_create_text_input_manager(d, id);
} else if (SDL_strcmp(interface, "wl_data_device_manager") == 0) {
d->data_device_manager = wl_registry_bind(d->registry, id, &wl_data_device_manager_interface, SDL_min(3, version));
Wayland_create_data_device(d);