A split-layout fork of CoreKeyboard — a Qt6/X11 on-screen keyboard — for wide displays, built for and tested on the Steam Deck. The keys are packed into the left and right quarters of the screen, leaving the middle empty and click-through so the desktop behind stays usable. It targets general desktop typing (full symbol and F-key coverage), not mobile text entry.
It installs as a separate flatpak (online.ferose.SplitKeyboard) alongside the stock
org.cubocore.CoreKeyboard, leaving the original untouched.
Highlights:
- Two-thumb split with a see-through, click-through middle.
- Single 7-row page — every key shifts via the real Shift, so there's no symbol page to toggle.
- Hybrid modifiers — tap to arm one for the next key, or hold it to type a chord; Caps is a classic lock.
- Multitouch — two thumbs at once.
- Ghosted panel — semi-transparent, so you can see what's behind it.
- Global hotkey —
Super+Ktoggles the keyboard from anywhere; the tray icon and re-launching the app do too. - Start on login — an optional tray toggle; when on, SplitKeyboard launches at login minimized to the tray (show it with the hotkey or tray icon).
Each row is a 30-column grid: 6 keys in the left quarter, 18 invisible spacer columns
(the empty middle), 6 keys in the right quarter — a single 7-row page where the physical
Shift does all shifting. The grid below is the human-readable form of
splitkeyboard/resources/en_US.keymap (the source of truth); || marks the center split.
C1 | C2 | C3 | C4 | C5 | C6 || C7 | C8 | C9 | C10 | C11 | C12
R1: F1 | F2 | F3 | F4 | F5 | F6 || F7 | F8 | F9 | F10 | F11 | F12
R2: ` | [ | ] | Home | Lt | Dn || Up | Rt | End | - | = | Hide
R3: Esc | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | Bksp
R4: Tab | q | w | e | r | t || y | u | i | o | p | Enter
R5: Caps | a | s | d | f | g || h | j | k | l | ; | '
R6: Shift | PrtScr| z | x | c | v || b | n | m | , | / | Shift
R7: Ctrl | Super | Alt | Space | Space | Del || \ | Space | Space | . | RAlt | RCtl
- QWERTY hand split between T|Y, G|H, and V|B (
bis right-hand). - Arrows form an inline
Lt Dn Up Rtstrip across R2, split by the center hole. - All 32 ASCII symbols fit on this one page with no duplicates — 11 typed directly, 21 from Shift.
splitkeyboard-demo-trimmed.mp4
A signed flatpak repo is hosted on GitHub Pages — install and auto-update with one command:
flatpak install --user https://ferose.github.io/SplitKeyboard/splitkeyboard.flatpakrefIt pulls the org.kde.Platform runtime from Flathub automatically and updates with the rest
of your apps (flatpak update). Or open the install page
and click through. Then see Run below.
Requires org.flatpak.Builder and org.kde.Sdk//6.10.
flatpak install -y flathub org.flatpak.Builder org.kde.Sdk//6.10
flatpak run org.flatpak.Builder --force-clean --user --install \
--install-deps-from=flathub --ccache builddir \
online.ferose.SplitKeyboard.ymlLaunch SplitKeyboard from your application launcher — it installs like any other app.
Toggle it from anywhere with Super+K, or from the tray icon.
To start it from a terminal instead:
flatpak run online.ferose.SplitKeyboard -platform xcb-platform xcb forces X11, which the input and window-masking code requires; the desktop
launcher already passes it.
X11 only. The keystroke injection (
XTest) is an X11 mechanism, so on a Wayland session the app runs through XWayland but cannot type into native Wayland windows — use it on an X11 desktop, e.g. the Steam Deck's desktop mode (KDE Plasma X11). The toggle hotkey is the exception: on KDE it registers with KGlobalAccel, soSuper+Ktoggles the keyboard even under a Wayland session (off KDE it falls back to an X11XGrabKey, which only works on X11).
Settings live in a settings.conf under [SplitKeyboard]. For the flatpak that's the
sandbox-redirected config dir,
~/.var/app/online.ferose.SplitKeyboard/config/SplitKeyboard/settings.conf (a from-source
build uses ~/.config/SplitKeyboard/settings.conf):
Mode=true— full-width bar docked at the bottom.Mode=false+WindowMode/WindowSize— floating resizable window.
SplitKeyboard is a vendored fork: the source (originally CoreKeyboard) lives in
splitkeyboard/ (forked from commit 454e241) and our changes are edited
straight into it — no patch files. Edit splitkeyboard/src/ for behavior and
splitkeyboard/resources/en_US.keymap for the layout (keep the Layout grid in
sync), then rebuild the flatpak. It depends only on Qt 6 and X11 — no external
libraries — and is built via the flatpak manifest. The KeyEngine modifier logic
is unit-tested via ./tests/run.sh; everything else is validated hands-on. The source is
heavily commented — splitkeyboard.cpp documents the layout/mask engine and the keymap
encoding, and keyengine.{h,cpp} the modifier state machine.
GPL-3.0-or-later — see LICENSE. SplitKeyboard is a fork of CoreKeyboard
(© CuboCore Group); the original GPL headers are preserved throughout the source.