# 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 - Optional PC key blocks: function row, navigation (ins/home/pg up, del/end/pg dn, arrows), numeric keypad; any mix, typing keys included (⚙) - Floating: drag the bottom bar, resize from the corner; geometry is remembered per screen ## Build & test ```sh 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. ```json {"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` `keysym`), `label`, `shifted`, `flick`, `alternates`, `width` (key units), `target` (for `layer`), `stretch` - `keysym`: sends the XKB keysym named by `keysym` (`Home`, `F5`, `Left`...) on press; `repeat` auto-repeats while held - `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 - Top-level `sections`: optional blocks, `{"id", "name", "placement": "above" | "right", "rows"}`; the user picks which show ## Settings `~/.config/sloposk/sloposk.conf`, also editable from the ⚙ panel: `typing/autoCapitalize`, `typing/doubleSpacePeriod`, `layout/visibleSections` (`main` plus section ids). ## 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.