input: rearm IME once after keyboard focus enter

This commit is contained in:
stalkerg 2026-02-18 17:35:47 +09:00
parent c291194a4e
commit 202fa4c3c8
2 changed files with 29 additions and 0 deletions

28
input.c
View file

@ -29,6 +29,7 @@
#include "keymap.h"
#include "kitty-keymap.h"
#include "macros.h"
#include "ime.h"
#include "quirks.h"
#include "render.h"
#include "search.h"
@ -717,6 +718,10 @@ keyboard_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
term_kbd_focus_in(term);
seat->kbd_focus = term;
seat->kbd.serial = serial;
#if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED
seat->ime.rearm_pending = true;
#endif
}
static bool
@ -780,6 +785,11 @@ keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
);
struct terminal *old_focused = seat->kbd_focus;
#if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED
seat->ime.rearm_pending = false;
#endif
seat->kbd_focus = NULL;
stop_repeater(seat, -1);
@ -1860,6 +1870,8 @@ keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
uint32_t mods_locked, uint32_t group)
{
struct seat *seat = data;
(void)wl_keyboard;
(void)serial;
mods_depressed &= ~seat->kbd.virtual_modifiers;
mods_latched &= ~seat->kbd.virtual_modifiers;
@ -1904,6 +1916,22 @@ keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
: false;
}
#if defined(FOOT_IME_ENABLED) && FOOT_IME_ENABLED
/*
* KWin can leave text-input in a non-committing state after focus switches.
* Rearm IME once on the first post-focus modifiers event.
*/
if (seat->ime.rearm_pending &&
seat->kbd_focus != NULL &&
seat->ime_focus == seat->kbd_focus &&
seat->ime_focus->ime_enabled)
{
seat->ime.rearm_pending = false;
ime_disable(seat);
ime_enable(seat);
}
#endif
if (seat->kbd_focus && seat->kbd_focus->active_surface == TERM_SURF_GRID)
term_xcursor_update_for_seat(seat->kbd_focus, seat);
}

View file

@ -256,6 +256,7 @@ struct seat {
} surrounding;
uint32_t serial;
bool rearm_pending;
} ime;
#endif
};