[2026-05-08] HTPC Bazzite docs: system, access, magic4pc, gaming plans
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
# HTPC — Доступ и управление
|
||||||
|
|
||||||
|
## SSH
|
||||||
|
```bash
|
||||||
|
ssh -i ~/.ssh/id_rsa bazzite@192.168.1.86
|
||||||
|
```
|
||||||
|
Пароль sudo: `bazzite`
|
||||||
|
|
||||||
|
## Go (на HTPC)
|
||||||
|
Go установлен в `/usr/local/go/bin/go` (не в PATH по умолчанию).
|
||||||
|
Сборка: `cd ~/magic4pc && /usr/local/go/bin/go build -o magic4pc_new .`
|
||||||
|
|
||||||
|
## Git workflow (magic4pc)
|
||||||
|
- Mac: `~/Developer/magic4pc_altclient`, бранч `bazzite-linux`
|
||||||
|
- Remote `linux` → `ssh://bazzite@192.168.1.86/var/home/bazzite/magic4pc.git` (bare repo)
|
||||||
|
- Worktree на HTPC: `/home/bazzite/magic4pc`
|
||||||
|
- Remote `origin` → `https://github.com/mallexxx/magic4pc_altclient.git`
|
||||||
|
|
||||||
|
Деплой:
|
||||||
|
```bash
|
||||||
|
# На Mac:
|
||||||
|
git push linux bazzite-linux
|
||||||
|
|
||||||
|
# На HTPC:
|
||||||
|
cd ~/magic4pc && git pull && /usr/local/go/bin/go build -o magic4pc_new .
|
||||||
|
sudo systemctl stop magic4pc
|
||||||
|
sudo rm /usr/local/bin/magic4pc
|
||||||
|
sudo cp magic4pc_new /usr/local/bin/magic4pc
|
||||||
|
sudo systemctl start magic4pc
|
||||||
|
```
|
||||||
|
|
||||||
|
> ⚠️ Нельзя `cp` поверх работающего бинаря — "Text file busy". Всегда сначала `stop` → `rm` → `cp` → `start`.
|
||||||
|
|
||||||
|
## systemd сервис
|
||||||
|
Файл: `/etc/systemd/system/magic4pc.service`
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Magic Remote client for LG TV
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=bazzite
|
||||||
|
Group=bazzite
|
||||||
|
ExecStart=/usr/local/bin/magic4pc-run.sh
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
StartLimitIntervalSec=0
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
`StartLimitIntervalSec=0` — без лимита рестартов (иначе при crash-loop убивается).
|
||||||
|
|
||||||
|
## Run script
|
||||||
|
`/usr/local/bin/magic4pc-run.sh` — ждёт X display, делает `xhost +local:`, запускает бинарь.
|
||||||
|
|
||||||
|
## ydotoold
|
||||||
|
User-юнит: `~/.config/systemd/user/ydotoold.service`
|
||||||
|
Socket: `/run/user/1000/.ydotool_socket`
|
||||||
|
Управление: `systemctl --user status ydotoold`
|
||||||
|
|
||||||
|
## Логи
|
||||||
|
```bash
|
||||||
|
journalctl -u magic4pc -n 50 --no-pager
|
||||||
|
journalctl -u magic4pc -f # live
|
||||||
|
```
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# HTPC — Планы: Игры и Эмуляторы
|
||||||
|
|
||||||
|
## Статус системы
|
||||||
|
- [x] Bazzite установлен, автологин в Gaming Mode
|
||||||
|
- [x] 1080p@60Hz, аудио LPCM работает
|
||||||
|
- [x] LG Magic Remote работает (magic4pc)
|
||||||
|
- [x] Без пароля при входе
|
||||||
|
- [ ] EmuDeck
|
||||||
|
- [ ] Proton-GE
|
||||||
|
- [ ] MangoHud
|
||||||
|
- [ ] Эмуляторы
|
||||||
|
|
||||||
|
## Следующие шаги
|
||||||
|
|
||||||
|
### 1. EmuDeck
|
||||||
|
Установка через официальный скрипт:
|
||||||
|
```bash
|
||||||
|
# В KDE Desktop Mode (не gamescope):
|
||||||
|
curl -L https://raw.githubusercontent.com/dragoonDorise/EmuDeck/main/install.sh | bash
|
||||||
|
```
|
||||||
|
Настроит RetroArch, PCSX2, Yuzu/Ryujinx и др. автоматически.
|
||||||
|
ROM-и класть в `~/Emulation/roms/<system>/`
|
||||||
|
|
||||||
|
### 2. Proton-GE
|
||||||
|
Через ProtonUp-Qt (устанавливается из Discover или Flatpak):
|
||||||
|
```bash
|
||||||
|
flatpak install flathub net.davidotek.pupgui2
|
||||||
|
```
|
||||||
|
Или через EmuDeck — он включает ProtonUp-Qt.
|
||||||
|
|
||||||
|
### 3. MangoHud (FPS overlay)
|
||||||
|
Уже есть в Bazzite. Включить для игры:
|
||||||
|
- В Steam: Properties → Launch Options: `mangohud %command%`
|
||||||
|
- Глобально: `MANGOHUD=1` в environment
|
||||||
|
|
||||||
|
### 4. Эмуляторы (план)
|
||||||
|
|
||||||
|
| Платформа | Эмулятор | Статус |
|
||||||
|
|-----------|----------|--------|
|
||||||
|
| NES | RetroArch (Nestopia) | Через EmuDeck |
|
||||||
|
| SNES | RetroArch (bsnes/Snes9x) | Через EmuDeck |
|
||||||
|
| Sega Mega Drive | RetroArch (Genesis Plus GX) | Через EmuDeck |
|
||||||
|
| PS2 | PCSX2 | Через EmuDeck |
|
||||||
|
| N64 | RetroArch (Mupen64Plus) | Через EmuDeck |
|
||||||
|
| Switch | Ryujinx (или Suyu) | Через EmuDeck |
|
||||||
|
|
||||||
|
### 5. ROM-и
|
||||||
|
Скопировать в `~/Emulation/roms/` по папкам после установки EmuDeck.
|
||||||
|
EmuDeck сам создаст структуру директорий.
|
||||||
|
|
||||||
|
### 6. Steam ROM Manager
|
||||||
|
Входит в EmuDeck — добавляет эмуляторные игры в Steam библиотеку с обложками.
|
||||||
|
После добавления они появятся в Gaming Mode как обычные Steam игры.
|
||||||
|
|
||||||
|
## Железо — ограничения
|
||||||
|
- RX 570: Switch эмуляция может быть медленной (Vulkan поддерживается)
|
||||||
|
- i7-6800K (Broadwell-E): PS2 и Switch — проверить производительность
|
||||||
|
- 32GB RAM: достаточно для всего
|
||||||
|
|
||||||
|
## Управление в эмуляторах
|
||||||
|
Magic Remote (magic4pc) работает как мышь + клавиатура.
|
||||||
|
Для эмуляторов нужен геймпад — варианты:
|
||||||
|
- Bluetooth геймпад (PS4/PS5/Xbox)
|
||||||
|
- USB геймпад
|
||||||
|
- Настроить маппинг Magic Remote кнопок на gamepad через Steam Input (если эмулятор в Steam)
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
# 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` → пересобрать и скопировать.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# HTPC — Система (Bazzite Linux)
|
||||||
|
|
||||||
|
## Железо
|
||||||
|
- CPU: Intel Core i7-6800K
|
||||||
|
- RAM: 32 GB
|
||||||
|
- GPU: AMD Radeon RX 570
|
||||||
|
- Подключение к TV: HDMI
|
||||||
|
- TV: LG webOS (192.168.1.75)
|
||||||
|
- HTPC IP: 192.168.1.86
|
||||||
|
|
||||||
|
## ОС
|
||||||
|
- **Bazzite 44** (Fedora-based, immutable OSTree)
|
||||||
|
- Вариант: `bazzite-deck` (Steam Gaming Mode / gamescope)
|
||||||
|
- Пользователь: `bazzite`
|
||||||
|
- Hostname: `htpc`
|
||||||
|
|
||||||
|
## Режимы запуска
|
||||||
|
- **Gaming Mode (gamescope-session-steam)** — автологин по умолчанию, Steam Big Picture
|
||||||
|
- **KDE Desktop** — переключение из меню Steam → "Switch to Desktop"
|
||||||
|
|
||||||
|
## Автологин
|
||||||
|
Файл: `/etc/gdm/custom.conf`
|
||||||
|
```ini
|
||||||
|
[daemon]
|
||||||
|
AutomaticLoginEnable=True
|
||||||
|
AutomaticLogin=bazzite
|
||||||
|
Session=gamescope-session-steam
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
`/etc/environment`:
|
||||||
|
```
|
||||||
|
GAMESCOPE_DISABLE_HDR=1
|
||||||
|
```
|
||||||
|
|
||||||
|
`~/.config/environment.d/gamescope.conf`:
|
||||||
|
```
|
||||||
|
GAMESCOPE_WIDTH=1920
|
||||||
|
GAMESCOPE_HEIGHT=1080
|
||||||
|
GAMESCOPE_REFRESH=60
|
||||||
|
```
|
||||||
|
|
||||||
|
## Разрешение
|
||||||
|
- **1080p @ 60Hz** — рабочий режим
|
||||||
|
- 4K вызывает AMD HDA audio clock bug: пиксельный клок ~594 MHz → HDMI audio 880 Hz вместо 440 Hz
|
||||||
|
|
||||||
|
## Аудио
|
||||||
|
TV поддерживает только LPCM 2ch, 32000/44100/48000/96000/192000 Hz, 16/20/24 bit.
|
||||||
|
|
||||||
|
`~/.config/wireplumber/wireplumber.conf.d/fix-hdmi.conf` — S16LE, 48000 Hz, no suspend
|
||||||
|
`~/.config/pipewire/pipewire.conf.d/99-hdmi-fix.conf` — allowed-rates [44100, 48000]
|
||||||
|
|
||||||
|
## OSTree / Обновления
|
||||||
|
- `/usr/local/bin` слетает при `rpm-ostree` upgrade (новый `/usr` overlay)
|
||||||
|
- Бинари держать в `/home/bazzite/` или пересобирать после обновлений
|
||||||
|
- Проверить после апдейта: `systemctl status magic4pc`
|
||||||
|
|
||||||
|
## KDE Xwayland настройки
|
||||||
|
`~/.config/kwinrc`:
|
||||||
|
```ini
|
||||||
|
[Xwayland]
|
||||||
|
EavesdropMode=2
|
||||||
|
XwaylandEisNoPrompt=true
|
||||||
|
```
|
||||||
|
`XwaylandEisNoPrompt=true` — отключает диалог разрешения XTest (нужен для magic4pc/xdotool).
|
||||||
Reference in New Issue
Block a user