System
- Linux Mint 22.3 (Cinnamon, 64-bit)
- Proton 11.0-1
- Keyboard: Czech (QWERTZ)
Issue
On the Czech layout, the number-row keys have a diacritic as the unshifted
character and the digit on Shift (e.g. key shows ě unshifted, 2 with
Shift). In-game, both the diacritic and the shifted digit are completely
unresponsive on these keys — pressing them does nothing, whether bound
directly or via a custom keybind. Confirmed in both Warframe and
Helldivers 2, so it doesn't look game-specific. Typing works fine everywhere
outside Proton (desktop, browser, etc.), and switching the whole system to
an EN layout "fixes" it immediately, which points at Proton/Wine's keyboard
handling rather than the games themselves.
One key on the row is unaffected: the key showing + unshifted / 1 with
Shift works normally in-game on both levels.
Suspected cause
Wine's X11→Windows virtual-key translation appears to only recognize a
fixed set of characters, mostly ASCII. My guess: it uses the unshifted
character on a key to decide whether that physical key gets a VK mapping at
all. Keys where the unshifted character is ASCII (like +) get mapped
normally, so both levels work. Keys where the unshifted character is a
non-ASCII diacritic (ě š č ř ž ý á í é) don't get any VK code assigned at
all — which is why even the shifted digit fails, not just the diacritic.
Workaround
I built a custom XKB layout variant that inherits the normal Czech layout
but swaps the two levels on just the number-row keys, so the unshifted
character becomes the digit (ASCII, so Wine maps it fine) and the diacritic
moves to Shift instead. Paired with a small wrapper script, this gets
applied automatically right before a game launches and reverted right after
it closes — so normal desktop typing is completely unaffected outside of
gaming sessions.
In practice: in-game, what used to be ě becomes 2, š becomes 3, and
so on (Shift now gives you the diacritic instead, if needed). Everything
reverts to standard Czech the moment the game exits, including cases where
the game launches through a separate launcher process.
Set up via Steam: point the game's Launch Options at the wrapper script,
followed by %command%, e.g.:
/home/<username>/czech-game-keyboard-fix/kb-wrapper.sh %command%
Run following in terminal to create XKB layout and scripts:
mkdir -p ~/czech-game-keyboard-fix/symbols
cat > ~/czech-game-keyboard-fix/symbols/czgame << 'EOF'
xkb_symbols "swap" {
include "cz(basic)"
name[Group1]="Czech (game-safe numbers)";
key <AE01> { [ 1, plus ] };
key <AE02> { [ 2, ecaron ] };
key <AE03> { [ 3, scaron ] };
key <AE04> { [ 4, ccaron ] };
key <AE05> { [ 5, rcaron ] };
key <AE06> { [ 6, zcaron ] };
key <AE07> { [ 7, yacute ] };
key <AE08> { [ 8, aacute ] };
key <AE09> { [ 9, iacute ] };
key <AE10> { [ 0, eacute ] };
};
EOF
cat > ~/czech-game-keyboard-fix/kb-game.sh << 'EOF'
#!/bin/bash
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
setxkbmap -layout czgame -variant swap -I"$SCRIPT_DIR" -print | xkbcomp -I"$SCRIPT_DIR" - $DISPLAY
EOF
cat > ~/czech-game-keyboard-fix/kb-normal.sh << 'EOF'
#!/bin/bash
setxkbmap cz
EOF
cat > ~/czech-game-keyboard-fix/kb-wrapper.sh << 'EOF'
#!/bin/bash
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
"$SCRIPT_DIR/kb-game.sh"
systemd-run --user --scope --quiet -- "$@"
"$SCRIPT_DIR/kb-normal.sh"
EOF
chmod +x ~/czech-game-keyboard-fix/kb-game.sh ~/czech-game-keyboard-fix/kb-normal.sh ~/czech-game-keyboard-fix/kb-wrapper.sh
echo "Done. Folder created at ~/czech-game-keyboard-fix"
System
Issue
On the Czech layout, the number-row keys have a diacritic as the unshifted
character and the digit on Shift (e.g. key shows
ěunshifted,2withShift). In-game, both the diacritic and the shifted digit are completely
unresponsive on these keys — pressing them does nothing, whether bound
directly or via a custom keybind. Confirmed in both Warframe and
Helldivers 2, so it doesn't look game-specific. Typing works fine everywhere
outside Proton (desktop, browser, etc.), and switching the whole system to
an EN layout "fixes" it immediately, which points at Proton/Wine's keyboard
handling rather than the games themselves.
One key on the row is unaffected: the key showing
+unshifted /1withShift works normally in-game on both levels.
Suspected cause
Wine's X11→Windows virtual-key translation appears to only recognize a
fixed set of characters, mostly ASCII. My guess: it uses the unshifted
character on a key to decide whether that physical key gets a VK mapping at
all. Keys where the unshifted character is ASCII (like
+) get mappednormally, so both levels work. Keys where the unshifted character is a
non-ASCII diacritic (
ě š č ř ž ý á í é) don't get any VK code assigned atall — which is why even the shifted digit fails, not just the diacritic.
Workaround
I built a custom XKB layout variant that inherits the normal Czech layout
but swaps the two levels on just the number-row keys, so the unshifted
character becomes the digit (ASCII, so Wine maps it fine) and the diacritic
moves to Shift instead. Paired with a small wrapper script, this gets
applied automatically right before a game launches and reverted right after
it closes — so normal desktop typing is completely unaffected outside of
gaming sessions.
In practice: in-game, what used to be
ěbecomes2,šbecomes3, andso on (Shift now gives you the diacritic instead, if needed). Everything
reverts to standard Czech the moment the game exits, including cases where
the game launches through a separate launcher process.
Set up via Steam: point the game's Launch Options at the wrapper script,
followed by
%command%, e.g.:Run following in terminal to create XKB layout and scripts: