Xwayland: a new keymap can be applied to previous keycodes
When wl_keyboard.key
events are sent to xwayland apps and a wl_keyboard.keymap
event is sent immediately after that, the keycodes are translated with the new keymap registered with wl_keyboard.keymap
, not with the old keymap.
This becomes a problem when I run wtype x
on xterm under Hyprland.
What I expect is wtype
creates a virtual keyboard and send x
to the compositor, then the compositor sends x
to xterm.
However, xterm doesn't receive x
. When I debugged with xev, xterm seems to be receiving ESC
instead.
Here's what's happening:
-
wtype
creates a newzwp_virtual_keyboard_v1
object and sends an unique keymap and keycodes to Hyprland. - Hyprland sends the unique keymap and the keycodes to xwayland.
-
wtype
destroys thezwp_virtual_keyboard_v1
object. - Hyprland sends a normal keymap to xwayland.
- The keysyms xterm receives are translated with the normal keymap.
I'm not familiar with x11 protocol and I don't know whether the keycodes translation is done in xwayland or in x11 clients. But if the translation is done in xwayland and the cause is that xwayland buffers some keycodes and just translates them later with the latest keymap, I think xwayland should be updated to translate all the keycodes in the buffer with the old keymap and send them to clients when it receives a new keymap.
Actually I'm a maintainer of labwc and fixed this problem (link) by delaying keymap update. But a new keymap being applied to previous keycodes doesn't feel right and it would be nice if it's fixed in xwayland side.