ime: track IME focus independently from keyboard focus

Replace the seat->ime.focused boolean with a terminal instace pointer,
seat->ime_focus.

Set and reset this on ime::enter() and ime::leave() events, and use
this instead of seat->kbd_focus on all other IME events.

This fixes two issues:

a) buggy compositors that sometimes sends an IME enter event without
  first having sent a keyboard enter event.

b) seats may be IME capable while still lacking the keyboard
  capability. Such seats will *always* see IME enter events without a
  corresponding keyboard enter event.
This commit is contained in:
Daniel Eklöf 2022-06-15 18:41:08 +02:00
parent d852178540
commit 96f23b4c64
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 21 additions and 14 deletions

View file

@ -3576,7 +3576,7 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da
grid_render(term);
tll_foreach(term->wl->seats, it) {
if (it->item.kbd_focus == term)
if (it->item.ime_focus == term)
ime_update_cursor_rect(&it->item);
}
@ -4058,7 +4058,7 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data)
grid_render(term);
tll_foreach(term->wl->seats, it) {
if (it->item.kbd_focus == term)
if (it->item.ime_focus == term)
ime_update_cursor_rect(&it->item);
}