From 2b375d9704d23dfa72eff1260451050208026413 Mon Sep 17 00:00:00 2001 From: Frank Praznik 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 842dcf6f8a..6784bf0803 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 069a0d9637..5073472da4 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 a69b70f693..7ea5a582f5 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);