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
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@
панели зависит от её варианта, и по нему не сказать, новее ли каталожная. Версия экрана читается
только по кнопке проверки, в локальном сеансе при включённом экране; по удалённому рабочему столу
она неизвестна, и это нормально (XIC-104).
- **Ярлык в меню «Пуск».** Пакет winget ставит XiControl как portable-программу, а такая ярлыков
не создаёт — найти приложение можно было только по exe. Теперь ярлык добавляется по желанию:
тумблер «Ярлык в меню „Пуск“» в Настройки → Общие или клик по приветствию первого запуска. Запуск
из «Пуска» сразу открывает окно настроек.
- **Повторный запуск поднимает уже работающий XiControl.** Раньше вторая копия молча закрывалась, и
клик по exe не давал ничего, кроме запроса UAC. Теперь открывается окно настроек работающей копии,
а если оно уже открыто — выходит на передний план. Если работающая копия принадлежит другому
пользователю этого компьютера или это старая версия, XiControl так и скажет. Автозапуск по-прежнему
ничего не открывает (XIC-106).

### Исправлено
- **Проверка драйверов отбрасывает пакеты чужой модели.** Сервер Xiaomi называет в ответе модель,
Expand Down
18 changes: 15 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ Mi-кнопка и «мёртвые» клавиши (включая мульт
вкл/выкл, мёртвая зона у нижнего края тачпада, сила вибрации и усилие нажатия тачпада,
сильное нажатие на тачпад как назначаемое действие,
виджет «Монитор», индикатор-метрика в трее (Вт/CPU/GPU/NPU/RAM/°C цифрой на втором значке),
окно настроек в стиле Win11, проверка обновлений (оповещение, без самообновления), проверка
окно настроек в стиле Win11, ярлык в меню «Пуск» по желанию (повторный запуск поднимает
работающую копию), проверка обновлений (оповещение, без самообновления), проверка
драйверов и BIOS у Xiaomi по кнопке (сверка, без скачивания и установки),
опциональный HTTP API для управления из локальной сети (телефон/Home Assistant). Всё управление железом —
через штатный WMI-интерфейс прошивки `MiCommonInterface` (протокол MIFS, ODM Bitland).
Expand Down Expand Up @@ -128,7 +129,8 @@ config.json рядом с exe, XIC-34) — папка программы. Фак
## Архитектура

Одно трей-приложение, **без службы** (проверено: admin-процесса достаточно и для SET/GET, и для
WMI-событий). `Program.cs`: single-instance mutex → DI-контейнер
WMI-событий). `Program.cs`: single-instance mutex (вторая копия не стартует, а будит первую
через `InstanceWake` — кроме запуска с `--autostart`, XIC-106) → DI-контейнер
(`Microsoft.Extensions.DependencyInjection`, все синглтоны; провайдер владеет Dispose в обратном
порядке создания — компоненты инжектированное не диспоузят) → `TrayApp.Start()` → `Application.Run()`.

Expand Down Expand Up @@ -271,7 +273,17 @@ WMI-событий). `Program.cs`: single-instance mutex → DI-контейне
другой источник — на ближайшей смене питания. Таблица и решение — чистые `OverlayFor`/`Decide` под тестами),
`AutoStart` (задача планировщика с SID в имени — своя на каждого пользователя, задача старого
образца `XiControl` мигрирует при следующем переключении; самопочинка на старте чинит и пропавший
путь, и устаревшую версию exe, дев-сборки `0.0.0` в сверке не участвуют), `AwakeMode` («режим совы»: подписанный
путь, и устаревшую версию exe, дев-сборки `0.0.0` в сверке не участвуют), `StartMenuShortcut`
(XIC-106: winget-пакет portable и ярлыков не создаёт — свой `.lnk` в Start Menu\Programs профиля
через `IShellLinkW`, только по тумблеру или клику по приветствию первого запуска; состояние — сам
файл, без поля в конфиге; аргумент `--show` открывает настройки; самопочинка на старте — по тем же
правилам, что у `AutoStart`, ярлык на другую папку той же версии не перехватывается; слоты vtable
проверяет тест на живом `.lnk` во временной папке), `InstanceWake` (будильник второй копии:
auto-reset событие `Local\XiControlShow` создаётся сразу за мьютексом, чтобы ранний сигнал не
потерялся; вторая копия делает `AllowSetForegroundWindow` и сигналит, первая открывает настройки или
выводит вперёд уже открытое окно без пересборки. Событие сеансовое при глобальном мьютексе:
копия другого пользователя или старая версия будильника не найдёт — тогда сообщение «уже запущен»),
`AwakeMode` («режим совы»: подписанный
запрос питания `PowerCreateRequest` — всегда SystemRequired + крышка на AC, экран держится
DisplayRequired — кроме `OwlIgnoreDisplay: true` в config.json, тогда только «не спать»; не
SetThreadExecutionState — тот привязан к потоку и в `powercfg /requests` без причины, XIC-93; исходное действие крышки
Expand Down
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ where there are no watts to show, you can watch load or degrees instead.*
(Settings → General). When off, no icon, no timer and no data sources are created: zero extra load.
- 🌐 UI language: Russian / English / Chinese (中文).
- 🚀 Autostart via Task Scheduler (no UAC prompt at logon, works on battery).
- 📌 Start menu shortcut on request — launching from Start opens Settings, and if Xi Control is
already running, it brings that copy up instead of starting a second one.
- 🛰️ **HTTP API for the local network** (optional, **off by default**) — control it from a
phone or from Home Assistant automations: read status and charge (`GET /status`),
switch mode, charge protection, "travel" and owl. A command allowlist, token authorization
Expand Down Expand Up @@ -217,6 +219,8 @@ moved to another drive or a flash stick, and survives a Windows reinstall with n
protected by "administrators only" permissions, and that's precisely why the API cannot be
enabled — or its token swapped — by editing the user config.
- Autostart is a Windows Task Scheduler entry; by its nature it lives in the system, not in the folder.
The same goes for the Start menu shortcut, if you turn it on: it sits in your profile's Start menu
folder and points at this exe.

### Antivirus false positives

Expand Down Expand Up @@ -271,7 +275,7 @@ Launch `XiControl.exe` (confirm the UAC prompt) — a tray icon appears.
| Keyboard backlight key | OSD with the level (off / 50% / 100% / auto) |

All options live in the **Settings…** window (tray menu item): tabs General (language,
autostart, panel theme, update check, logging, tray indicator), Features (owl, touchpad,
autostart, Start menu shortcut, panel theme, update check, logging, tray indicator), Features (owl, touchpad,
touchscreen, refresh-rate control), Battery (charge threshold with a hint, "travel" sound and file,
lock-screen sound and toast, charger-wattage OSD, "weak PSU" threshold, battery health), Display
(brightness limit and memory, auto-brightness by sensor with the curve graph; auto refresh rate, "Keep refresh rate" and the rates — the section is
Expand Down Expand Up @@ -301,6 +305,15 @@ next toggle. Self-repair on launch covers not only a missing exe but also a task
**outdated build** — the typical case when the portable version is unpacked into a new folder.
Besides logon, the task also fires when you return to the session via fast user switching.

The winget package is portable and creates no Start menu shortcut, so Xi Control adds its own — only
when you ask: the "Start menu shortcut" toggle (Settings → General) or a click on the first-run
notification. The shortcut opens Settings right away. If Xi Control is already running, launching it
again (by the shortcut or the exe) brings up the running copy's Settings window instead of a second
copy. The UAC prompt on that click stays: the app needs administrator rights. If the running copy
belongs to another user on this PC, or is an older version, you get a message saying so. A
shortcut pointing at a removed or older build is fixed on launch, like the autostart task.
`winget uninstall` can't remove it — turn the toggle off before uninstalling.

### Travel mode (a one-off charge to 100%)

You usually keep battery care on (say, 80%), but before a trip you want a full charge. Press the
Expand Down
15 changes: 14 additions & 1 deletion README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@
ни источники данных: ноль дополнительной нагрузки.
- 🌐 Язык интерфейса: русский / английский / китайский (中文).
- 🚀 Автозапуск через Планировщик заданий (без UAC-запроса при входе, работает на батарее).
- 📌 Ярлык в меню «Пуск» по желанию — запуск из «Пуска» открывает настройки, а если Xi Control уже
работает, поднимает его, а не вторую копию.
- 🛰️ **HTTP API для локальной сети** (опционально, по умолчанию **выключен**) — управляй с
телефона или из автоматизаций Home Assistant: чтение статуса и заряда (`GET /status`),
переключение режима, защиты заряда, «В дорогу» и совы. Белый список команд, авторизация по
Expand Down Expand Up @@ -220,6 +222,8 @@ winget install Oksion.XiControl
Файл защищён правами «изменять может только администратор», и именно поэтому API нельзя
включить или подменить его токен правкой пользовательского конфига.
- Автозапуск — задача Планировщика Windows, она по своей природе живёт в системе, а не в папке.
Как и ярлык в «Пуске», если его включить: он лежит в папке меню «Пуск» вашего профиля и ведёт на
этот exe.

### Антивирусы и ложные срабатывания

Expand Down Expand Up @@ -275,7 +279,7 @@ dotnet publish src/XiControl.csproj -c Release -r win-x64 --self-contained -p:Pu
| Клавиша подсветки клавиатуры | OSD с уровнем (выкл / 50% / 100% / авто) |

Все опции собраны в окне **«Настройки…»** (пункт меню трея): вкладки Общие (язык,
автозапуск, тема панелей, проверка обновлений, логирование, индикатор в трее), Функции
автозапуск, ярлык в «Пуске», тема панелей, проверка обновлений, логирование, индикатор в трее), Функции
(сова, тачпад, сенсорный экран, управление частотой), Батарея (порог заряда с пояснением,
звук и файл «В дорогу», звук и уведомление на локскрине, OSD мощности зарядника, порог
«слабого блока», здоровье батареи), Экран (лимит и запоминание яркости, авто-яркость по датчику с графиком кривой; авто-герцовка,
Expand Down Expand Up @@ -307,6 +311,15 @@ dotnet publish src/XiControl.csproj -c Release -r win-x64 --self-contained -p:Pu
Кроме входа в систему задача срабатывает на возврат в сеанс при быстром переключении
пользователей.

Пакет winget — portable и ярлыков в «Пуск» не создаёт, поэтому Xi Control кладёт свой — только
по вашему желанию: тумблер «Ярлык в меню „Пуск“» (Настройки → Общие) или клик по приветствию
первого запуска. Ярлык сразу открывает настройки. Если Xi Control уже работает, повторный запуск
(ярлыком или exe) открывает окно настроек у работающей копии, а не поднимает вторую. Запрос UAC
на этот клик остаётся: приложению нужны права администратора. Если работающая копия принадлежит
другому пользователю этого компьютера или это старая версия, появится сообщение об этом. Ярлык
на удалённую или старую сборку чинится при запуске, как задача автозапуска. `winget uninstall`
его не уберёт — выключите тумблер перед удалением.

### Режим «В дорогу» (разовый заряд до 100%)

Обычно держишь «беречь батарею» (скажем, 80%), но перед поездкой хочется полный заряд. Нажми
Expand Down
6 changes: 6 additions & 0 deletions src/Localization/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
"settings.language.desc": "Language of the menu, panel and pop-ups.",
"settings.autostart": "Start with Windows",
"settings.autostart.desc": "Via Task Scheduler, without a UAC prompt.",
"settings.startmenu": "Start menu shortcut",
"settings.startmenu.desc": "Launching from Start opens the settings window — or brings up the running XiControl instead of a second copy.",
"settings.general.comfort": "Comfort",
"settings.brightness.desc": "Separately for AC and battery; no Power profiles.",
"settings.battery.sub": "Charge threshold, travel mode and the charge-ready sound.",
Expand Down Expand Up @@ -531,6 +533,10 @@
"theme.system": "Follow Windows",
"toast.firstrun.title": "XiControl is running in the tray",
"toast.firstrun.text": "Click the tray icon for the quick panel, right-click for the menu. Holding the Mi button also opens the panel.",
"toast.firstrun.startmenu": "Click this notification to add XiControl to the Start menu.",
"toast.startmenu.added": "XiControl has been added to the Start menu. You can remove the shortcut in Settings → General.",
"toast.startmenu.failed": "Couldn't add the Start menu shortcut — see the log for details.",
"err.title": "Error",
"err.running.elsewhere": "XiControl is already running — for another user on this PC, or as an older version that can't be brought up from here. To start this copy, close that one: tray menu → Exit.",
"err.noiface": "MIFS interface not found. Requires administrator rights and a compatible Xiaomi/Redmi laptop."
}
6 changes: 6 additions & 0 deletions src/Localization/lang/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
"settings.language.desc": "Язык меню, панели и всплывашек.",
"settings.autostart": "Запускать при входе в Windows",
"settings.autostart.desc": "Через Планировщик заданий, без запроса UAC.",
"settings.startmenu": "Ярлык в меню «Пуск»",
"settings.startmenu.desc": "Запуск из «Пуска» открывает окно настроек, а если XiControl уже работает — поднимает его, а не вторую копию.",
"settings.general.comfort": "Удобства",
"settings.brightness.desc": "Отдельно для сети и батареи; без «Профилей».",
"settings.battery.sub": "Порог заряда, режим «В дорогу» и звук готовности.",
Expand Down Expand Up @@ -531,6 +533,10 @@
"theme.system": "Как в Windows",
"toast.firstrun.title": "XiControl работает в трее",
"toast.firstrun.text": "Клик по значку — быстрая панель, правый клик — меню. Удержание кнопки Mi тоже открывает панель.",
"toast.firstrun.startmenu": "Нажмите на это уведомление — и XiControl появится в меню «Пуск».",
"toast.startmenu.added": "XiControl добавлен в меню «Пуск». Убрать ярлык можно в Настройки → Общие.",
"toast.startmenu.failed": "Не получилось добавить ярлык в меню «Пуск» — подробности в журнале.",
"err.title": "Ошибка",
"err.running.elsewhere": "XiControl уже запущен — у другого пользователя этого компьютера или в старой версии, которую отсюда не вызвать. Чтобы запустить эту копию, закройте ту: меню в трее → «Выход».",
"err.noiface": "Интерфейс MIFS не найден. Нужны права администратора и совместимый ноутбук Xiaomi/Redmi."
}
Loading
Loading