Fix double-space period, shift double-tap; settings; letters from system keymap

- 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>
This commit is contained in:
2026-10-14 20:28:39 +02:00
co-authored by Claude Opus 5.5
parent c6c977eb4c
commit 5277ab16ff
49 changed files with 1162 additions and 359 deletions
+34
View File
@@ -0,0 +1,34 @@
#pragma once
#include "engine/InputEngine.h"
#include <QList>
#include <QString>
// Records what the keyboard sends and applies it to a simulated field, so
// tests check the text a user would see rather than the calls made.
class FakeEngine : public InputEngine
{
public:
void commitText(const QString &text) override { output += text; }
void replaceBeforeCursor(const QString &before, const QString &text) override
{
if (output.endsWith(before))
output.chop(before.size());
else
mismatchedReplacements++;
output += text;
}
void sendKeysym(quint32 keysym, Qt::KeyboardModifiers modifiers) override
{
keysyms.append(keysym);
lastModifiers = modifiers;
}
QString output; // the field's text
int mismatchedReplacements = 0; // replaced text that wasn't before the cursor
QList<quint32> keysyms;
Qt::KeyboardModifiers lastModifiers;
};