194 lines
15 KiB
Markdown
194 lines
15 KiB
Markdown
# SplitOverlay
|
||
|
||
**Русский** · [English below](#english)
|
||
|
||
> Название репозитория — **SplitOverlay**. В коде, в имени exe, установщика и в папке настроек приложение называется **KeyOverlay**.
|
||
|
||
Полупрозрачный оверлей для Windows, который поверх всех окон показывает раскладку программируемой
|
||
(Vial / QMK) split-клавиатуры, например [Silakka54](https://github.com/Squalius-cephalus/silakka54).
|
||
Нужен, чтобы учить слои: смотришь на экран и видишь, что где лежит.
|
||
|
||

|
||
|
||
## Возможности
|
||
|
||
- Рисует плату по файлу раскладки Vial (`.vil`): все слои, `MO`/`TG`/`LT`/mod-tap, `Shift+цифра` и т.д.
|
||
- Прозрачные клавиши слоя (`KC_TRNS`) показываются приглушённо с нижнего слоя, как в QMK.
|
||
- **Автоопределение слоя с платы** (нужна прошивка с командой из [`firmware/`](firmware/)); без неё слой переключается вручную.
|
||
- **Символы по языку ввода**: буквы на клавишах меняются вместе с раскладкой Windows (RU, EN и любая другая). Нужные символы выдаёт сама Windows.
|
||
- **Разделение половинок**: каждая половина отдельным окном, двигаются независимо.
|
||
- Подсветка нажатых клавиш, регулировка прозрачности и размера, значок в трее.
|
||
- Оверлей прозрачен для мыши и не забирает фокус.
|
||
|
||
| Слой 1 | Разделение половинок | Язык ввода |
|
||
|---|---|---|
|
||
|  |  |  |
|
||
|
||
## Установка
|
||
|
||
Скачай со страницы [Releases](https://gittea.khad1997pav.ru/khadzhibekovpa/SplitOverlay/releases) установщик `KeyOverlay-<версия>-setup.exe`
|
||
или портативный `KeyOverlay-<версия>-portable.zip`. Установка идёт без прав администратора.
|
||
Exe не подписан, поэтому SmartScreen может предупредить («Подробнее» → «Выполнить в любом случае»).
|
||
|
||
Раскладку сохрани в Vial: **File → Save current layout** (`.vil`). При первом запуске приложение
|
||
попросит выбрать этот файл; можно также передать путь аргументом: `KeyOverlay.exe "путь\к\раскладке.vil"`.
|
||
|
||
## Управление
|
||
|
||
| Действие | Как |
|
||
|---|---|
|
||
| Следующий / предыдущий слой | Ctrl+Alt+PgDn / Ctrl+Alt+PgUp (отключает автоопределение) |
|
||
| Показать / скрыть | Ctrl+Alt+K или двойной клик по значку в трее |
|
||
| Прозрачность, размер, слой, язык, разделение, перечитать файл | меню значка в трее |
|
||
| Переместить оверлей | трей → «Режим перемещения», тащить мышью, колесо меняет размер |
|
||
|
||
## Прошивка (для автоопределения слоя)
|
||
|
||
Обычная клавиатура не сообщает ПК, какой слой активен, и в протоколе Vial такой команды нет.
|
||
Поэтому в [`firmware/`](firmware/) лежит небольшое дополнение для QMK/Vial: команда HID `0xE0`,
|
||
которая возвращает активный слой. Подробности, сборка и инструкция по прошивке: [`firmware/README.md`](firmware/README.md).
|
||
Готовые `.uf2` для Silakka54 (LED, v1.4led) лежат в Releases.
|
||
|
||
## Сборка из исходников
|
||
|
||
Нужен [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) под Windows.
|
||
|
||
```
|
||
git clone https://gittea.khad1997pav.ru/khadzhibekovpa/SplitOverlay.git
|
||
cd SplitOverlay
|
||
dotnet test tests/KeyOverlay.Core.Tests
|
||
dotnet run --project src/KeyOverlay -- "путь\к\раскладке.vil"
|
||
```
|
||
|
||
Установщик и портативная сборка (Inno Setup берётся из NuGet, в систему ничего не ставится):
|
||
|
||
```
|
||
dotnet publish src/KeyOverlay -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -o dist/app
|
||
dotnet restore installer/tools.csproj
|
||
installer/packages/tools.innosetup/6.4.3/tools/ISCC.exe /DAppVersion=1.0.0 installer/KeyOverlay.iss
|
||
```
|
||
|
||
Установщик кладёт в пакет файлы прошивки из `firmware/*.uf2`: соберите их (см. `firmware/README.md`)
|
||
или скачайте из Releases и положите в `firmware/`.
|
||
|
||
## Устройство проекта
|
||
|
||
```
|
||
src/KeyOverlay.Core парсер .vil, подписи кейкодов, геометрия платы, протокол слоя (без зависимости от Windows)
|
||
src/KeyOverlay WPF-оверлей: окна, хук клавиатуры, опрос платы по HID, язык ввода, трей
|
||
tests/ тесты Core (xUnit)
|
||
firmware/ команда слоя для QMK/Vial и сборка прошивки в Docker
|
||
installer/ скрипт Inno Setup
|
||
```
|
||
|
||
## Как это работает
|
||
|
||
**Core** (`src/KeyOverlay.Core`, .NET 8, без зависимости от Windows, покрыт тестами):
|
||
|
||
- `Keymap` читает `.vil` (JSON): поле `layout` — слои × 10 строк матрицы × 6 колонок. Строки 0–4 — левая половина,
|
||
5–9 — правая, `-1` — клавиши нет. Прозрачные клавиши (`KC_TRNS`) проваливаются на нижний слой, как в QMK.
|
||
- `Keycodes` превращает кейкоды Vial/QMK в подписи (`KC_BSPACE` → «Bksp», `LSFT(KC_1)` → «!», `MO(2)` → «MO 2»).
|
||
- `BoardGeometry` — положение клавиш Silakka54: 4×6 с шагом по колонкам и 3 больших пальца на половину.
|
||
- `ScanCodes` и `PressedKeys` — разбор скан-кодов (физическая клавиша не зависит от языка) и учёт нажатых.
|
||
- `LayerProtocol` — формат команды слоя для прошивки; `KeyLocalizer` — замена подписей по языку ввода.
|
||
|
||
**Приложение** (`src/KeyOverlay`, WPF):
|
||
|
||
- Окно прозрачное, без рамки, поверх всех окон; стили `WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW`
|
||
делают его прозрачным для мыши, без фокуса и без значка в панели задач.
|
||
- `KeyboardHook` — глобальный low-level hook: подсветка нажатых клавиш и горячие клавиши. События всегда передаются дальше.
|
||
- `LayerPoller` — раз в ~80 мс спрашивает плату по Raw HID (usage page `0xFF60`, usage `0x61`, библиотека HidSharp), реконнект при отключении.
|
||
- `InputLanguage` — язык берётся у окна на переднем плане (`GetKeyboardLayout`), символы клавиш вычисляет Windows (`ToUnicodeEx`).
|
||
- `OverlayController` связывает окна, хук, опрос платы, трей и настройки; режим разделения создаёт второе окно для правой половины.
|
||
|
||
## Поддерживаемые кейкоды
|
||
|
||
| Что | Примеры |
|
||
|---|---|
|
||
| Буквы, цифры, знаки, F1–F24 | `KC_A`, `KC_1`, `KC_SCOLON`, `KC_F12` |
|
||
| Навигация и служебные | `KC_ENTER`, `KC_BSPACE`, `KC_DELETE`, стрелки, `KC_PGUP`, `KC_HOME`, `KC_PSCREEN` |
|
||
| Модификаторы | `KC_LSHIFT`, `KC_RCTRL`, `KC_LALT`, `KC_LGUI` |
|
||
| Медиа | `KC_MPLY`, `KC_VOLU`, `KC_BRIU` |
|
||
| Обёртки с модификаторами | `LSFT(KC_1)`, `LCTL(KC_C)` (а также `S`, `C`, `A`, `G`, правые варианты) |
|
||
| Слои | `MO(n)`, `TG(n)`, `TO(n)`, `TT(n)`, `OSL(n)`, `DF(n)`, `LT(n, kc)` |
|
||
| Mod-tap | `LCTL_T(kc)`, `MT(MOD_LSFT, kc)` |
|
||
| Прозрачная / пустая | `KC_TRNS`, `KC_NO` |
|
||
|
||
Всё остальное (макросы, tap dance, `QK_BOOT` и т.п.) показывается сокращённым именем кейкода без расшифровки.
|
||
Сейчас геометрия рассчитана на **Silakka54** (матрица 10×6, 54 клавиши); для других плат нужна своя геометрия.
|
||
|
||
## Настройки
|
||
|
||
Файл `%APPDATA%\KeyOverlay\settings.json` создаётся автоматически и меняется через меню трея.
|
||
|
||
| Поле | Значение |
|
||
|---|---|
|
||
| `VilPath` | путь к файлу раскладки `.vil` |
|
||
| `Opacity` | прозрачность 0.2–1.0 |
|
||
| `Scale` | размер 0.5–2.0 |
|
||
| `Left`, `Top` | позиция окна (левой половины в режиме разделения) |
|
||
| `RightLeft`, `RightTop` | позиция правой половины в режиме разделения |
|
||
| `Layer` | последний выбранный вручную слой |
|
||
| `AutoLayer` | определять слой по данным платы |
|
||
| `HighlightPressed` | подсвечивать нажатые клавиши |
|
||
| `LocalizeKeys` | показывать символы выбранного языка ввода |
|
||
| `SplitHalves` | показывать половинки отдельными окнами |
|
||
|
||
Чтобы сбросить настройки, закрой приложение и удали этот файл.
|
||
|
||
## Если что-то не работает
|
||
|
||
- **В подписи «плата не отвечает».** Авто-определение слоя работает только с прошивкой из [`firmware/`](firmware/). Проверь, что прошиты обе половины,
|
||
кабель подключён к главной (для файла LEFT — левой), а Vial закрыт. Пока слой можно выбрать вручную (Ctrl+Alt+PgUp/PgDn).
|
||
- **Оверлея не видно.** Нажми Ctrl+Alt+K или двойной клик по значку в трее. Если окно осталось за пределами экрана, удали `settings.json`.
|
||
- **SmartScreen / антивирус ругается.** Exe не подписан, а приложение использует глобальный перехват клавиш (нужен для подсветки). Исходники открыты, собрать можно самому.
|
||
- **Поверх игры оверлея нет.** Окно показывается поверх оконных и borderless-приложений, но не поверх эксклюзивного полноэкранного режима.
|
||
- **Буквы не меняются при смене языка.** Проверь пункт «Символы по языку ввода» в меню трея. Язык берётся у окна, в которое ты печатаешь.
|
||
|
||
## Идеи и планы
|
||
|
||
- Геометрия других плат (описание в JSON), имена слоёв.
|
||
- Подпись exe и автообновление.
|
||
- Автоматическое отслеживание изменений файла `.vil`.
|
||
|
||
## Участие
|
||
|
||
Issues и pull request приветствуются. Перед отправкой запусти `dotnet test tests/KeyOverlay.Core.Tests`; CI делает то же самое и собирает приложение.
|
||
|
||
## Приватность
|
||
|
||
Перехват клавиш (low-level hook) нужен только для подсветки нажатых клавиш и горячих клавиш.
|
||
Нажатия нигде не сохраняются и не отправляются, события всегда передаются дальше без изменений.
|
||
Приложение ничего не отправляет в сеть. Настройки лежат в `%APPDATA%\KeyOverlay\settings.json`.
|
||
|
||
## Ограничения
|
||
|
||
- Только Windows (WPF), x64.
|
||
- Определение слоя с платы работает через Raw HID и требует прошивки с командой `0xE0`; половина, подключённая к ПК, должна быть главной.
|
||
- Caps Lock на подписях не отражается; мёртвые клавиши показываются знаком акцента.
|
||
- Vial GUI и оверлей не стоит держать открытыми одновременно: оба общаются с одним HID-интерфейсом.
|
||
|
||
## Лицензия
|
||
|
||
Приложение: [MIT](LICENSE). Дополнение для прошивки (`firmware/keyoverlay_hid.c`) собирается внутрь
|
||
QMK/Vial и распространяется под GPL-2.0-or-later. Исходники плат и Vial принадлежат их авторам:
|
||
[vial-qmk](https://github.com/vial-kb/vial-qmk), [Squalius-cephalus/silakka54](https://github.com/Squalius-cephalus/silakka54).
|
||
|
||
---
|
||
|
||
## English
|
||
|
||
KeyOverlay is a semi-transparent, click-through Windows overlay that shows the keymap of a programmable
|
||
(Vial / QMK) split keyboard such as the Silakka54, always on top, to help you learn your layers.
|
||
|
||
**Features:** draws the board from a Vial `.vil` layout (all layers, `MO`/`TG`/`LT`/mod-tap, transparent keys
|
||
falling through to lower layers); **detects the active layer from the keyboard** via a small QMK/Vial firmware
|
||
command (`firmware/`); **shows the characters of the active Windows input language**; can **split the two halves
|
||
into separate windows**; highlights pressed keys; tray icon with opacity/size options.
|
||
|
||
**Install:** download the setup or portable zip from [Releases](https://gittea.khad1997pav.ru/khadzhibekovpa/SplitOverlay/releases); save your layout in Vial via
|
||
*File → Save current layout* and pick that `.vil` on first run. **Build:** .NET 8 SDK, `dotnet test tests/KeyOverlay.Core.Tests`,
|
||
`dotnet run --project src/KeyOverlay`. Windows only (x64). Key hook is used only for highlighting and hotkeys; nothing is stored or sent.
|
||
|
||
License: MIT for the app; the firmware add-on is GPL-2.0-or-later (it is compiled into QMK/Vial).
|