61 lines
3.6 KiB
Markdown
61 lines
3.6 KiB
Markdown
# magic4pc — LG Magic Remote для HTPC
|
|
|
|
## Что это
|
|
Go-клиент для LG Magic Remote (webOS приложение на TV).
|
|
Форк: https://github.com/mallexxx/magic4pc_altclient (бранч `bazzite-linux`)
|
|
Оригинал: https://github.com/netham45/magic4pc_altclient
|
|
|
|
## Архитектура
|
|
- **TV сервер**: webOS приложение на LG TV (192.168.1.75:42831), шлёт UDP
|
|
- **HTPC клиент**: `/usr/local/bin/magic4pc`, UDP-клиент на фиксированном source port **9106**
|
|
- **xdotool**: единый persistent процесс через stdin pipe — мышь и клавиши
|
|
- **ydotool**: для gamescope-специфичных команд (Ctrl+1, Ctrl+2) через `/run/user/1000/.ydotool_socket`
|
|
|
|
## Ключевые фиксы (история)
|
|
| Проблема | Решение |
|
|
|----------|---------|
|
|
| TV "service error" / не реконнектится | Фиксированный source UDP port 9106 (`ListenUDP(":9106")`) |
|
|
| TV зависает в "waiting for client" | Server keepalive timeout 10s → auto-reconnect |
|
|
| KDE XTest диалог при каждом клике | Единый xdotool процесс (не новый на каждую кнопку) |
|
|
| KDE XTest диалог при рестарте xdotool | `XwaylandEisNoPrompt=true` в kwinrc |
|
|
| Кривые координаты мыши | Динамический scale через `xdotool getdisplaygeometry` |
|
|
| Крестик слал Ctrl/a/s/d | TV keycodes 37-40 → `Left/Up/Right/Down` keysym |
|
|
| Цифры слали мусор | ASCII keycodes → `string(rune(key))` |
|
|
|
|
## Маппинг кнопок
|
|
| Кнопка | Keycode | Gaming Mode (gamescope) | KDE Desktop |
|
|
|--------|---------|------------------------|-------------|
|
|
| Красная | 403 | Ctrl+1 (Steam меню) | Super (Win) |
|
|
| Зелёная | 404 | Escape | Escape |
|
|
| Жёлтая | 405 | Ctrl+2 (Steam QAM) | Средняя кнопка мыши |
|
|
| Синяя | 406 | Правый клик | Правый клик |
|
|
| Back | 461 | Mouse X1 (back) | Mouse X1 (back) |
|
|
| Enter/OK | 13 | Return | Return |
|
|
| Ch Up | 33 | PageUp | PageUp |
|
|
| Ch Down | 34 | PageDown | PageDown |
|
|
| D-pad Left | 37 | Left | Left |
|
|
| D-pad Up | 38 | Up | Up |
|
|
| D-pad Right | 39 | Right | Right |
|
|
| D-pad Down | 40 | Down | Down |
|
|
| Play | 415 | XF86AudioPlay | XF86AudioPlay |
|
|
| Stop | 413 | XF86AudioStop | XF86AudioStop |
|
|
| Pause | 19 | XF86AudioPause | XF86AudioPause |
|
|
| Цифры 0-9 | 48-57 | 0-9 | 0-9 |
|
|
| GUIDE | 458 | Правый клик | Правый клик |
|
|
| Мышь (тач) | — | mousemove (scaled) | mousemove (scaled) |
|
|
| Тап | mousedown/up | Left click | Left click |
|
|
| Скролл | wheel | scroll 4/5 | scroll 4/5 |
|
|
|
|
## Определение сессии
|
|
`isGamescopeSession()` — читает `/proc/*/cmdline`, ищет `kwin_wayland`. Если нет → gamescope.
|
|
|
|
## Koordinаты мыши
|
|
TV шлёт координаты в пространстве 0–1920 × 0–1080.
|
|
При старте xdotool запрашивается `xdotool getdisplaygeometry` → вычисляется scale.
|
|
Работает корректно при любом разрешении экрана.
|
|
|
|
## Проблемы которые могут вернуться
|
|
- **xdotool умирает** (write error) → KDE показывает XTest диалог. Разрешить и включить `XwaylandEisNoPrompt=true`.
|
|
- **TV "service error"** — если висит намертво, cold reboot TV (выдернуть из розетки).
|
|
- **Бинарь слетает** после `rpm-ostree upgrade` → пересобрать и скопировать.
|