فهرست منبع

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.
Frank Praznik 3 ماه پیش
والد
کامیت
2b375d9704
3فایلهای تغییر یافته به همراه21 افزوده شده و 4 حذف شده
  1. 18 1
      src/video/wayland/SDL_waylandevents.c
  2. 2 1
      src/video/wayland/SDL_waylandevents_c.h
  3. 1 2
      src/video/wayland/SDL_waylandvideo.c

+ 18 - 1
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...
 

+ 2 - 1
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);

+ 1 - 2
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);