Diagnostics collects what this session doesn't allow, logs it, and lists
it in the settings panel (with a dot on the gear): KWin not launching
sloposk as its keyboard (detected by WAYLAND_SOCKET, since KWin offers the
input-method global to every client), fake input missing or too old,
org.kde.keyboard unreachable, and the D-Bus control name taken.
Modifier combos go through fake input even in text fields: KWin drops
the input method's modifier mask for most clients, so Ctrl+A typed "a".
The desktop file is generated with an absolute Exec, which KWin needs to
match it: one for the installed binary, one for the build's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The grab bar didn't move the window by mouse, and the corner grip never
resized it (the bar's handler took over its drag). The bar and grip now
start the window manager's move/resize, and Super+LMB/RMB work too.
A KWin rule in kwinrulesrc keeps the window above and unfocused, off the
taskbar, pager and switcher, and remembers its position. KWin now places
the window and keeps it on screen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- DebouncedStore, taken out of WindowSettings, now also saves the opacity
slider once a drag ends instead of on every step
- SIGTERM/SIGINT (how KWin stops the input method) quit normally, so
pending geometry and settings are written
- The slider's minimum opacity comes from Settings instead of a copy in QML
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A second long-press finishes the first (typing its choice) before
opening its own popup, instead of sharing one
- Popups move down over their key when the room above is too small
- No popup over an unknown key: an empty rect made every cell zero wide
- A repeated touch id cancels the stale pointer instead of leaking it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Opacity slider for the panel behind the keys (10–100%); keys stay opaque
- Blur Behind: asks the compositor (KWin) to blur under the rounded panel
via KF6 WindowSystem; skipped at full opacity
- Settings panel draws over the window background so changes show live,
and scrolls when it doesn't fit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- HardwareKeys presses a key's unshifted keysym on touch and releases it
on lift, through fake input; held keys repeat and combine as on a
physical keyboard (games, Shift+click)
- Shift/Ctrl/Alt/Super are plain held keys, caps lock is the system's,
dead keys compose in the app
- No long-press, flick, trackpad or rollover in this mode; nothing is
left held when the mode is turned off or touches are cancelled
- Settings switch; default stays the touch (virtual keyboard) mode
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- KWinFakeInput (org_kde_kwin_fake_input v6, offered by KWin to the
input-method process): keysyms with real modifier keys held
- The KWin backend uses the input method in text fields and fake input
everywhere else, so shortcuts, terminals and the desktop get keys
- Text rules (auto-capitalization, double-space) only apply in fields
- Always Show setting keeps the keyboard up without a text field
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Full (iPad Pro) mode: every typing key from the keymap, number row,
tab, caps lock, ctrl/super/alt; shifted symbol shown above and flickable
- Dead keys compose with the locale's XKB compose table
- Ctrl/Alt/Super stick like shift and turn keys into shortcuts; a tapped
or held shift joins shortcuts and non-text keys, auto-shift and caps
lock don't
- Auto-capitalization and caps lock only capitalize letters; the user's
shift picks the keymap's shifted level
- Mode switch in settings keeps key size by resizing the window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Template sections placed above or to the right of the typing keys;
the user picks any mix in settings, typing keys included
- keysym keys send XKB keysyms on press, optionally repeating
- Geometry lays blocks side by side with one key unit; stretch keys are
resolved at layout time so composed blocks line up
- Toggling a block resizes the window so keys keep their size
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
- Double-space replaced the space via a Backspace keysym, which clients
apply after the commit: use delete_surrounding_text with the commit
- Tests use a shared FakeEngine that applies ops to a simulated field
- Double-tap shift locks at a sentence start; typing between taps doesn't
- Organization name set: config lives in ~/.config/sloposk/
- Settings (auto-capitalization, double-space period) with a ⚙ panel
- Letter rows come from the compositor's XKB keymap; other letters of the
layout become long-press alternates; globe switches the system layout
over org.kde.keyboard
- One JSON template for non-letter layers; stretch keys even out rows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- VisibilityController: show on field focus, dismiss until next focus,
manual show/hide/toggle overrides
- FloatingWindow: resize from the corner grip, clamp to screen
- WindowSettings: geometry per screen, debounced saves
- DBusControl: org.sloposk.Keyboard Show/Hide/Toggle for global shortcuts
- org.sloposk.keyboard.desktop so System Settings lists it as a virtual keyboard
- README with build/run/layout docs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PointerTracker: per-finger gesture state machine (pure, unit-tested)
- AlternatesPicker + AlternatesPopup.qml: long-press choices, finger selects
- Space long-press trackpad moves the cursor with arrow keysyms
- Slide from .?123 onto a symbol types it and switches back
- New finger commits pending taps (iOS rollover)
- Flick animation: secondary symbol slides down as the finger moves
- Transparent popup margin with an input region that passes clicks through
- tst_keyboardsurface: end-to-end gesture tests on the real QML
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Registers as KWin's virtual keyboard (input-method-unstable-v1), shows a
non-focusable layer-shell overlay, and commits Unicode text. Verified in a
nested headless KWin with the textprobe tool.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>