Skip to content

gpui_linux: Fix X11 keyboard state synchronization#53903

Merged
SomeoneToIgnore merged 2 commits intomainfrom
fix-xinput-key-press-and-release
Apr 16, 2026
Merged

gpui_linux: Fix X11 keyboard state synchronization#53903
SomeoneToIgnore merged 2 commits intomainfrom
fix-xinput-key-press-and-release

Conversation

@smitbarmase
Copy link
Copy Markdown
Member

@smitbarmase smitbarmase commented Apr 14, 2026

Closes #49329

This area has regressed a few times across #34514, #35361, and #44234. The problem is that we were still mixing XKB client-side and server-side state handling on the same xkb::State.

On X11, XkbStateNotify already keeps the client state synchronized. But the key event path was still doing two extra things on the shared state.xkb:

  • calling update_key()
  • rewriting the same state from KeyPress / KeyRelease.state

The libxkbcommon X11 docs say that XkbStateNotify is the more accurate source of truth for X11 clients and that there is no need to call xkb_state_update_key() once the client state is synchronized. This follows the libxkbcommon X11 client model more closely by keeping persistent state notify-driven and using event-local state only for lookup.

This PR fixes that by:

  • removing the remaining update_key() calls from X11 KeyPress / KeyRelease
  • keeping the long-lived state.xkb driven only by XkbStateNotify and keymap notifications
  • creating a temporary event-local xkb::State for per-event lookup

I also added regression tests around the historical bugs in this area:

Release Notes:

  • Fixed issue on Linux X11 where you coundn't input space key in some cases.
@cla-bot cla-bot Bot added the cla-signed The user has signed the Contributor License Agreement label Apr 14, 2026
@zed-community-bot zed-community-bot Bot added the staff Pull requests authored by a current member of Zed staff label Apr 14, 2026
@SomeoneToIgnore SomeoneToIgnore self-assigned this Apr 14, 2026
@SomeoneToIgnore SomeoneToIgnore merged commit 6a3111d into main Apr 16, 2026
43 checks passed
@SomeoneToIgnore SomeoneToIgnore deleted the fix-xinput-key-press-and-release branch April 16, 2026 07:46
G36maid pushed a commit to G36maid/zed that referenced this pull request Apr 29, 2026
)

Closes zed-industries#49329

This area has regressed a few times across zed-industries#34514, zed-industries#35361, and zed-industries#44234.
The problem is that we were still mixing XKB client-side and server-side
state handling on the same `xkb::State`.

On X11, `XkbStateNotify` already keeps the client state synchronized.
But the key event path was still doing two extra things on the shared
`state.xkb`:
  - calling `update_key()`
  - rewriting the same state from `KeyPress` / `KeyRelease.state`

The libxkbcommon X11 docs say that `XkbStateNotify` is the more accurate
source of truth for X11 clients and that there is no need to call
`xkb_state_update_key()` once the client state is synchronized. This
follows the libxkbcommon X11 client model more closely by keeping
persistent state notify-driven and using event-local state only for
lookup.

This PR fixes that by:
- removing the remaining `update_key()` calls from X11 `KeyPress` /
`KeyRelease`
- keeping the long-lived `state.xkb` driven only by `XkbStateNotify` and
keymap notifications
  - creating a temporary event-local `xkb::State` for per-event lookup

I also added regression tests around the historical bugs in this area:
  - zed-industries#14282: Caps Lock / Neo 2 regressions from the earlier X11 fixes
  - zed-industries#31193: German key resolution
- zed-industries#26468: `space` with Cyrillic and Czech layouts / non-locked layout
groups
  - zed-industries#40678: macro-style shifted input like `Shift+]`

Release Notes:

- Fixed issue on Linux X11 where you coundn't input space key in some
cases.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement staff Pull requests authored by a current member of Zed staff

2 participants