Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@
щелчка** (слабый / средний / сильный — отдельно от вибрации при нажатии и тоже хранится в
самом тачпаде) и **частота** (каждый шаг / через шаг / редко, как в PC Manager; любое
значение 50–500 мс — в `config.json`, `TouchpadEdgeHapticsMs`). По просьбе с 4PDA (XIC-73).
- **Сильное нажатие на тачпад как назначаемое действие.** Продавите тачпад заметно сильнее
обычного клика — выполнится выбранное действие, тот же список, что у клавиш (Настройки →
Тачпад → «Сильное нажатие»). Как в Xiaomi PC Manager, где это скриншот; прошивка в этот момент
щёлкает второй раз, так что «дожатие» чувствуется. Распознаётся по давлению пальца из
обычного ввода тачпада; с «Нет действия» ничего лишнего не работает (XIC-78).
- **Действие «Скриншот» (Win+Shift+S) для любой клавиши.** Раньше скриншот делала только
штатная клавиша.

## [0.15.0] — 2026-09-22

Expand Down
9 changes: 9 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
Mi-кнопка и «мёртвые» клавиши (включая мультимедиа и калькулятор), авто-герцовка (по питанию +
удержание частоты), запоминание и лимит яркости по питанию, «режим совы», тачпад и сенсорный экран
вкл/выкл, мёртвая зона у нижнего края тачпада, сила вибрации и усилие нажатия тачпада,
сильное нажатие на тачпад как назначаемое действие,
виджет «Монитор», индикатор-метрика в трее (Вт/CPU/GPU/RAM/°C цифрой на втором значке),
окно настроек в стиле Win11, проверка обновлений (оповещение, без самообновления),
опциональный HTTP API для управления из локальной сети (телефон/Home Assistant). Всё управление железом —
Expand Down Expand Up @@ -222,6 +223,14 @@ WMI-событий). `Program.cs`: single-instance mutex → DI-контейне
`PluginGesture.dll`, XIC-73): зовётся с воркера `TouchpadEdgeSliders` на шаге ползунка, не
ждёт замка — если идёт запись настроек, щелчок пропускается; сила щелчка — команда `0x58`,
тоже в самом тачпаде, частота — `TouchpadEdgeHapticsMs` в конфиге),
`TouchpadInput` (XIC-78: **один** `RawTouchpadReader` на процесс — Raw Input даёт процессу одно
окно-получатель на usage, второй читатель молча отобрал бы ввод у первого; счётчик
пользователей Acquire/Release, давление разбирается только пока кому-то нужно — краевым
ползункам хватает координат), `TouchpadHeavyPress` + `HeavyPressDetector` (сильное нажатие:
Tip Pressure контакта с Confidence > 500, раз за касание — как в `PluginGesture.dll` PC Manager;
на TM2424 клик ≈ 130, сильное ≈ 1000. Действие — через `KeyRouter.Run`, список общий с клавишами;
второй щелчок прошивки `0x59` пишется только при явном вкл/выкл, с «Нет действия» не подписан
и давление не читается),
`UpdateCheck` (оповещение о новой версии: один GET к GitHub `/releases/latest` — эндпоинт сам
отсекает скользящий pre-release; не чаще раза в сутки, тумблер = выключатель трафика,
самообновления нет намеренно — запущенный exe не перезаписать, XIC-20),
Expand Down
16 changes: 12 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ touchscreen, refresh-rate control), Battery (charge threshold with a hint, "trav
lock-screen sound and toast, charger-wattage OSD, "weak PSU" threshold, battery health), Display
(brightness limit and memory; auto refresh rate, "Keep refresh rate" and the rates — the section is
hidden if refresh-rate control is off), Touchpad (bottom dead zone, edge sliders, vibration
strength and click force), Performance (mode visibility,
strength and click force, force press), Performance (mode visibility,
separately for AC and battery, with a switch above the list; startup mode, power profiles),
Keys (remapping), Notifications (where popups appear, how long
they stay, which lock-key popups to show), HTTP API (port, token, permissions) and About
Expand Down Expand Up @@ -603,6 +603,14 @@ The values live in the touchpad itself, so they survive sleep and reboots and ar
checking every write by reading it back. On a laptop with a different touchpad the section
simply doesn't appear.

**Force press.** Press the touchpad noticeably harder than a normal click to run any action —
the same list as for keys, plus "Screenshot (Win+Shift+S)" (Settings → Touchpad → "Force press",
`TouchpadHeavyPressAction` in `config.json`). Like in Xiaomi PC Manager, where it takes a
screenshot. The press is recognised from the finger pressure the touchpad already reports
(normal click ≈ 130, force press ≈ 1000, threshold 500), and while the action is on the firmware
clicks a second time so you feel it went through. The normal click still happens as well. With
"No action" nothing extra runs: pressure isn't even parsed.

### Key remapping

Each key gets its own action: **Settings → Keys**. The slots are the single click, double click and
Expand Down Expand Up @@ -638,9 +646,9 @@ never touches: disable the touchscreen in Device Manager and it stays that way.
the launched program inherits them.

In `config.json` these are `*Action`/`*Command` pairs (`MiClick`, `MiDouble`, `MiHold`,
`SettingsKey`, `AiKey`, `ProjKey`); action values: `modes`, `charge`, `panel`, `owl`, `monitor`,
`touchpad`, `touchscreen`, `autobright`, `hz`, `travel`, `projection`, `settings`, `copilot`, `play`, `next`, `prev`,
`stop`, `calc`, `launch`, `none`:
`SettingsKey`, `AiKey`, `ProjKey`, and `TouchpadHeavyPress` for a force press); action values:
`modes`, `charge`, `panel`, `owl`, `monitor`, `touchpad`, `touchscreen`, `autobright`, `hz`, `travel`,
`projection`, `screenshot`, `settings`, `copilot`, `play`, `next`, `prev`, `stop`, `calc`, `launch`, `none`:

```json
"MiClickAction": "modes",
Expand Down
16 changes: 12 additions & 4 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ dotnet publish src/XiControl.csproj -c Release -r win-x64 --self-contained -p:Pu
звук и файл «В дорогу», звук и уведомление на локскрине, OSD мощности зарядника, порог
«слабого блока», здоровье батареи), Экран (лимит и запоминание яркости; авто-герцовка,
«Удерживать частоту» и частоты — раздел скрыт, если управление частотой выключено),
Тачпад (мёртвая зона у нижнего края, края-ползунки, сила вибрации и усилие нажатия),
Тачпад (мёртвая зона у нижнего края, края-ползунки, сила вибрации и усилие нажатия, сильное нажатие),
Производительность (видимость режимов — отдельно для сети и для батареи, переключатель наверху
списка; режим при старте, профили питания), Клавиши
(переназначение), Уведомления (положение подсказок на экране, сколько висят, какие из
Expand Down Expand Up @@ -601,6 +601,14 @@ PC Manager и проверен на TM2424.
попадают: приложение читает их один раз на старте и пишет только по вашему выбору, проверяя
каждую запись чтением обратно. На ноутбуке с другим тачпадом раздела просто нет.

**Сильное нажатие.** Продавите тачпад заметно сильнее обычного клика — выполнится любое
действие из того же списка, что у клавиш, плюс «Скриншот (Win+Shift+S)» (Настройки → Тачпад →
«Сильное нажатие», `TouchpadHeavyPressAction` в `config.json`). Как в Xiaomi PC Manager, где на
нём скриншот. Нажатие распознаётся по давлению пальца, которое тачпад и так сообщает (обычный
клик ≈ 130, сильное нажатие ≈ 1000, порог 500), а пока действие выбрано, прошивка щёлкает второй
раз — чувствуется, что «дожали». Обычный клик при этом тоже срабатывает. С «Нет действия»
ничего лишнего не работает: давление даже не разбирается.

### Переназначение клавиш

Каждой клавише — своё действие: **Настройки → Клавиши**. Слоты — одиночный клик, двойной
Expand Down Expand Up @@ -637,9 +645,9 @@ Windows. Громкости в списке нет намеренно: для н
XiControl работает с правами администратора — запущенная программа их унаследует.

В `config.json` это пары `*Action`/`*Command` (`MiClick`, `MiDouble`, `MiHold`, `SettingsKey`,
`AiKey`, `ProjKey`), значения действий: `modes`, `charge`, `panel`, `owl`, `monitor`,
`travel`, `touchpad`, `touchscreen`, `autobright`, `hz`, `projection`, `settings`, `copilot`, `play`, `next`,
`prev`, `stop`, `calc`, `launch`, `none`:
`AiKey`, `ProjKey` и `TouchpadHeavyPress` для сильного нажатия), значения действий: `modes`,
`charge`, `panel`, `owl`, `monitor`, `travel`, `touchpad`, `touchscreen`, `autobright`, `hz`, `projection`,
`screenshot`, `settings`, `copilot`, `play`, `next`, `prev`, `stop`, `calc`, `launch`, `none`:

```json
"MiClickAction": "modes",
Expand Down
4 changes: 4 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,10 @@
настроек, а в его плагине краевых жестов (`PluginGesture.dll`). Первый шаг жеста щёлкает сразу,
дальше — на каждой порции шагов; у Xiaomi раз в 250 мс, но на пальце это ощущалось отставанием.
Сила щелчка (команда `0x58`) и частота — в настройках (XIC-73, по просьбе с 4PDA).
- **Сильное нажатие на тачпад как назначаемое действие** — распознаётся по давлению пальца из
обычного ввода (как в PC Manager: > 500 при клике ≈ 130 и сильном ≈ 1000), прошивка отвечает
вторым щелчком (`0x59`). Писать в тачпад для распознавания не нужно; с «Нет действия» давление
даже не разбирается. Заодно — действие «Скриншот» для клавиш (XIC-78).

## 🔜 Ближайшее
- Зафиксированных ближайших задач нет — см. «Идеи» ниже.
Expand Down
6 changes: 6 additions & 0 deletions docs/05-open-questions.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,12 @@ PC Manager шлёт её на каждом шаге яркости/громко
скольжения», 1 short; PC Manager держит 80, на TM2424 так и стоит). Проверено на железе и сделано:
щелчок на шаге наших краевых ползунков.

**Сильное нажатие (XIC-78)** вендорского канала не требует вовсе: PC Manager распознаёт его по
Tip Pressure (`0x0D/0x30`) в обычном PTP-вводе — давление контакта с Confidence больше 500. Замер
на TM2424: касание 35–55, клик 125–150, сильное 900–1200, и давление приходит всегда, при любом
`0x59`. Сам `0x59` (`[01|02, 00]`) — только второй щелчок прошивки в момент продавливания. Сделано
назначаемым действием.

Источники: [Precision touchpad tuning](https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/touchpad-tuning-guidelines),
[Input Device Haptics Implementation Guide](https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/input-haptics-implementation-guide).

Expand Down
1 change: 1 addition & 0 deletions docs/07-keymap.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
| `autobright` | Авто-яркость вкл/выкл (только на машинах с датчиком освещённости) |
| `hz` | Частота экрана по кругу — то же, что аппаратная клавиша герцовки, для моделей без неё. Подчиняется тумблеру «Управление частотой» (XIC-58) |
| `projection` | Проекция (`DisplaySwitch.exe`, фолбэк Win+P) |
| `screenshot` | Скриншот области (Win+Shift+S) — раньше был только у штатной клавиши скриншота; удобен на сильном нажатии тачпада (XIC-78) |
| `settings` | Параметры Windows |
| `copilot` | Copilot (Win+C) |
| `play` | Воспроизведение / пауза (`VK_MEDIA_PLAY_PAUSE`) |
Expand Down
7 changes: 7 additions & 0 deletions src/Config/AppConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,13 @@ public sealed class AppConfig
/// PC Manager держит 250, но так щелчки отстают от пальца и ощущаются странно.</summary>
public int TouchpadEdgeHapticsMs { get; set; } = 50;

/// <summary>Действие на сильное нажатие тачпада (XIC-78) — те же значения, что у клавиш
/// (*Action), плюс "screenshot". "none" — фича выключена (по умолчанию).</summary>
public string? TouchpadHeavyPressAction { get; set; } = "none";

/// <summary>Команда для действия "launch" (путь + аргументы), как у клавиш.</summary>
public string? TouchpadHeavyPressCommand { get; set; }

/// <summary>
/// Отладка: читать температуру из ACPI-термозоны, даже если Intel DPTF доступен (XIC-41).
/// Только правкой config.json — на Intel-машине путь фолбэка иначе не прогнать, он работает
Expand Down
1 change: 1 addition & 0 deletions src/Input/KeyRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ public void Run(string? action, string? command)
case "autobright": if (AutoBrightnessAvailable()) ToggleAutoBrightness?.Invoke(); break; // нет датчика — нечего включать
case "hz": if (_cfg.RefreshRateFeature) CycleRefreshRate?.Invoke(); break; // фича убрана — экран не трогаем
case "projection": Projection?.Invoke(); break;
case "screenshot": Screenshot?.Invoke(); break; // Win+Shift+S; и для сильного нажатия тачпада (XIC-78)
case "settings": OpenSettings?.Invoke(); break;
case "copilot": Copilot?.Invoke(); break;
case "play": MediaPlayPause?.Invoke(); break;
Expand Down
5 changes: 5 additions & 0 deletions src/Localization/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
"settings.act.autobright": "Auto-brightness on/off",
"settings.act.hz": "Cycle screen refresh rate",
"settings.act.projection": "Projection (Win+P)",
"settings.act.screenshot": "Screenshot (Win+Shift+S)",
"settings.act.settings": "Windows Settings",
"settings.act.copilot": "Copilot (Win+C)",
"settings.act.play": "Play / pause",
Expand Down Expand Up @@ -241,6 +242,10 @@
"settings.touchpad.pressure.140": "Firm",
"settings.touchpad.pressure.custom": "Custom ({0})",
"settings.touchpad.haptics.note": "These settings are stored in the touchpad itself and survive sleep and restarts.",
"settings.touchpad.heavy": "Force press",
"settings.touchpad.heavy.action": "Action",
"settings.touchpad.heavy.action.desc": "Press the touchpad noticeably harder than a normal click to run the chosen action, just like a key.",
"settings.touchpad.heavy.note": "The touchpad firmware detects a force press by itself and clicks a second time at that moment, so you can feel it went through. The normal click still happens too — you cannot press the pad hard without pressing it. Like in Xiaomi PC Manager, where a force press takes a screenshot.",
"settings.updates.check": "Check for updates",
"settings.updates.check.desc": "Ask GitHub once a day whether a new version is out. When off, the app makes no network requests at all. Updates are never installed automatically — we only tell you.",
"settings.updates.available": "Version {0} is available",
Expand Down
5 changes: 5 additions & 0 deletions src/Localization/lang/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
"settings.act.autobright": "Авто-яркость вкл/выкл",
"settings.act.hz": "Частота экрана по кругу",
"settings.act.projection": "Проекция (Win+P)",
"settings.act.screenshot": "Скриншот (Win+Shift+S)",
"settings.act.settings": "Параметры Windows",
"settings.act.copilot": "Copilot (Win+C)",
"settings.act.play": "Воспроизведение / пауза",
Expand Down Expand Up @@ -241,6 +242,10 @@
"settings.touchpad.pressure.140": "Тугое",
"settings.touchpad.pressure.custom": "Своё ({0})",
"settings.touchpad.haptics.note": "Настройки хранятся в самом тачпаде и сохраняются после сна и перезагрузки.",
"settings.touchpad.heavy": "Сильное нажатие",
"settings.touchpad.heavy.action": "Действие",
"settings.touchpad.heavy.action.desc": "Продавите тачпад заметно сильнее обычного клика — выполнится выбранное действие, как у клавиш.",
"settings.touchpad.heavy.note": "Прошивка тачпада сама различает сильное нажатие и в этот момент щёлкает второй раз — так понятно, что «дожали». Обычный клик при этом тоже срабатывает: продавить панель, не нажав, нельзя. Как в Xiaomi PC Manager, где на сильное нажатие стоит скриншот.",
"settings.updates.check": "Проверять обновления",
"settings.updates.check.desc": "Раз в сутки спрашивать у GitHub, вышла ли новая версия. Выключено — приложение не обращается в сеть вообще. Обновление не устанавливается само: мы только сообщаем.",
"settings.updates.available": "Доступна версия {0}",
Expand Down
Loading
Loading