# gpui_linux: Fix X11 keyboard state synchronization \(\#53903\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/6a3111de791aa07212d3225f4b2edf9f7179a1a5)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 6a3111de791aa07212d3225f4b2edf9f7179a1a5

Requested commit: 6a3111de791aa07212d3225f4b2edf9f7179a1a5

Commit: 6a3111de791aa07212d3225f4b2edf9f7179a1a5

Tree: 0b543a16ea722bd48adf8c5a3a2b4e6bce22fb1e

Author: Smit Barmase

Committer: GitHub

## Message

```
gpui_linux: Fix X11 keyboard state synchronization (#53903)

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:
  - #14282: Caps Lock / Neo 2 regressions from the earlier X11 fixes
  - #31193: German key resolution
- #26468: `space` with Cyrillic and Czech layouts / non-locked layout
groups
  - #40678: macro-style shifted input like `Shift+]`

Release Notes:

- Fixed issue on Linux X11 where you coundn't input space key in some
cases.
```

## Parents

- [f9662f484d32116f1a875791e36bd10490a14b66](https://git.cafe/gitcafe/zed/commit/f9662f484d32116f1a875791e36bd10490a14b66?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/6a3111de791aa07212d3225f4b2edf9f7179a1a5?format=markdown)
