ericek111andClaude Opus 5.5 e532f5c072 Smooth flick animation: scale the symbol instead of its font size
font.pixelSize is an integer, so the old animation stepped in whole
pixels and re-laid out the text each step: width and height jumped,
centering snapped x sideways and y even moved backwards. Draw at the
final size and animate scale and position, which are continuous.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:30:15 +02:00

sloposk

iPad-style floating on-screen keyboard for Plasma Wayland. Qt 6, C++ core, QML UI.

  • Flick a key down for its secondary symbol; long-press for accented alternates
  • iOS shift: tap = one letter, double-tap = caps lock, hold = shift while held
  • Letters follow the system keyboard layout; the globe key switches it
  • Auto-capitalization, double-space → ". " (both optional, ⚙ on the bottom bar), backspace repeat → word delete
  • Long-press space = trackpad; slide from .?123 onto a symbol and release
  • Floating: drag the bottom bar, resize from the corner; geometry is remembered per screen

Build & test

cmake -B build -G Ninja && cmake --build build
ctest --test-dir build

Needs Qt ≥ 6.8 (Quick, WaylandClient, DBus, Test), LayerShellQt, xkbcommon, wayland-protocols.

Run

KWin only offers the input-method protocol to the process it launches itself.

Where How
Nested session (safe) kwin_wayland --no-lockscreen --socket sloposk-dev --width 1400 --height 900 --inputmethod $PWD/build/src/sloposk kwrite
Desktop cmake --install build --prefix ~/.local, then System Settings → Keyboard → Virtual Keyboard → sloposk
UI only build/src/sloposk (stays visible, types nowhere)

Show/hide, e.g. from a global shortcut: qdbus org.sloposk.Keyboard /Keyboard org.sloposk.Keyboard.Toggle

Dev hooks: SLOPOSK_AUTOTYPE=text commits on focus; SLOPOSK_SCREENSHOT=file.png saves the window and quits.

Layouts

Letters come from the system keymap (what KWin sends to every client): its Q/A/Z rows become the three letter rows. Letters elsewhere, e.g. Slovak ľščťž on the number row, become long-press alternates. The globe key switches the system layout over org.kde.keyboard, so the physical keyboard follows.

Everything else is layouts/template.json; ~/.local/share/sloposk/template.json replaces it.

{"type": "letters", "row": 0, "flicks": ["1", "2", "3"]},
{"type": "backspace", "width": 1.5, "stretch": true}
  • Key: a string, or an object with type (char space backspace enter shift layer globe dismiss spacer letters), label, shifted, flick, alternates, width (key units), target (for layer), stretch
  • letters: the keymap row row (0–2), with flicks handed out left to right
  • stretch: the key grows so its row is as wide as the layer's widest (letter counts vary by layout)
  • Top-level alternates: long-press choices per letter, after the keymap's own

Settings

~/.config/sloposk/sloposk.conf, also editable from the ⚙ panel: typing/autoCapitalize, typing/doubleSpacePeriod.

Architecture

qml/        view only
input/      touch → PointerTracker gestures → KeyboardController rules
engine/     key output → text ops (DirectEngine; prediction/swipe later)
backend/    text ops → compositor (KWin input-method-v1); the compositor's keymap
layout/     template JSON + keymap letters → Layout → LayoutModel (geometry, hit testing)
window/     floating layer-shell placement, visibility, saved geometry
app/        D-Bus control and system layouts, dev hooks
settings/   persisted user preferences

sloposk_core (everything compositor-independent, plus the Sloposk QML module) is a static library shared by the app and the tests.

S
Description
Vibecoded OSK for KDE Plasma
Readme
279 KiB
Languages
C++ 84.7%
QML 10.8%
CMake 2.6%
C 1.9%