docs: README komplett überarbeitet + install.sh für Full-Setup

- README.md: Vollständig dokumentiert (alle Tools, Services, udev-Regeln,
  COSMIC Applet, Razer Naga Swap, eGPU Tuning, Installation)
- install.sh: Automatisiertes Full-Setup-Script (Applet build, udev,
  Services, Tools, eGPU, DMS Widget)
- Verzeichnisstruktur aktualisiert
This commit is contained in:
Kay Türtscher 2026-06-29 21:24:15 +02:00
parent 625a90b3e7
commit 9faf944870
2 changed files with 366 additions and 110 deletions

375
README.md
View file

@ -1,8 +1,8 @@
# SuperX-goes-Arch
Arbeitsrepo für Linux-/Arch-Support auf dem **OneXPlayer Super X** (Ryzen AI Max+ 395, Radeon 8060S, 64GB).
Arbeitsrepo für Linux-/Arch-Support auf dem **OneXPlayer Super X** (Ryzen AI Max+ 395, Radeon 8060S, 128GB).
Betriebssystem: **Arch Linux** · Compositor: **Hyprland 0.55.4** · Shell: **DankMaterialShell (DMS)**
Betriebssystem: **Arch Linux** · Compositor: **COSMIC Desktop** (System76)
---
@ -13,13 +13,16 @@ Betriebssystem: **Arch Linux** · Compositor: **Hyprland 0.55.4** · Shell: **Da
| **Frostbay BLE (Kühlung)** | ✅ Produktiv | Fan/Pumpe via BlueZ/D-Bus steuern |
| **Frostbay RGB** | ⚠️ Funktional | BLE-Writes funktionieren, aber LED-Strips physisch nicht angeschlossen |
| **superx-ctrl.py** | ✅ Produktiv | Zentrale CLI-Steuerung (Frostbay + Tablet RGB + EC Turbo) |
| **DMS SuperXCtrl Widget** | ✅ Produktiv | GUI-Widget für Cooling/RGB-Steuerung im DMS-Panel |
| **COSMIC Applet** | ✅ Produktiv | Panel-Applet für Cooling/RGB-Steuerung |
| **DMS SuperXCtrl Widget** | ✅ Produktiv | GUI-Widget für Cooling/RGB-Steuerung im DMS-Panel (Hyprland) |
| **Turbo-Daemon** | ✅ Produktiv | Key-Combo-Listener für Turbo/Mode/KB-Tasten |
| **HHD Patch** | ✅ Produktiv | Turbo-Bypass für Super X ohne oxp-platform |
| **Tablet RGB (HIDRAW)** | ⚠️ Hardware fehlt | RGB-Steuerung des Tablet-Moduls via HIDRAW (1a86:1305 Interface 2) Code fertig, aber Tablet-Modul noch nicht verbaut |
| **Keyboard RGB** | ❌ Nicht steuerbar | Keyboard-RGB kann nicht angesteuert werden |
| **EC Turbo** | ✅ Produktiv | Turbo-Status lesen/setzen via EC (/sys/kernel/debug/ec/ec0/io) |
| **Mainboard RGB (WS2812B)** | 🔄 In Arbeit | Original-LEDs kommen morgen dann Reverse-Engineering am Mainboard-RGB2-Anschluss |
| **Razer Naga Swap** | ✅ Produktiv | Links/Rechts-Tastenvertauschung für Razer Naga Left Handed Edition |
| **eGPU Tuning** | ✅ Installiert | RX 9060 XT Performance-Tuning (runpm=0, DPM high) |
| **Mainboard RGB (WS2812B)** | 🔄 In Arbeit | Original-LEDs kommen dann Reverse-Engineering am Mainboard-RGB2-Anschluss |
| **WMI/EC-Kernel-Module** | 🔄 In Arbeit | Erste Module kompilieren, aber noch nicht funktional |
---
@ -29,6 +32,7 @@ Betriebssystem: **Arch Linux** · Compositor: **Hyprland 0.55.4** · Shell: **Da
```
superx-goes-arch/
├── README.md # Diese Datei
├── install.sh # Full-Setup-Script (udev, Services, Applet, Tools)
├── docs/
│ ├── frostbay-ble-protocol.md # BLE GATT Protokoll (vollständig dokumentiert)
│ ├── frostbay-onec1-initial-findings.md
@ -44,7 +48,8 @@ superx-goes-arch/
├── tools/
│ ├── frostbay_ble.py # Frostbay BLE GATT Reader/Controller
│ ├── superx-ctrl.py # Zentrale CLI-Steuerung (v4)
│ ├── tablet-rgb.py # Tablet RGB via HIDRAW
│ ├── tablet-rgb.py # Tablet RGB via HIDRAW (dynamische Device-Erkennung)
│ ├── razer-naga-swap.py # Button-Swap-Daemon (evdev/uinput)
│ ├── ec-read.py # EC Turbo Status Reader
│ ├── turbo-daemon.py # Turbo/FN Key Combo Daemon
│ ├── turbo-monitor.py # evdev Monitor für Turbo-Tasten
@ -62,12 +67,23 @@ superx-goes-arch/
│ ├── steam-egpu* # Steam eGPU Integration
│ └── wmi/ # WMI Kernel Module Source
├── udev/
│ ├── 99-superx-hid.rules # HIDRAW-Zugriff für Super X Vendor HID
│ └── 99-superx-rgb-hidraw.rules # Alternative HIDRAW-Regeln (älter)
│ ├── 99-superx-hid.rules # HIDRAW-Zugriff für Super X Vendor HID (1a86:1305)
│ ├── 99-razer-naga-swap.rules # Startet Button-Swap beim Einstecken der Razer Naga
│ └── 99-egpu-superx.rules # eGPU Performance beim Hotplug
├── configs/
│ ├── hyprland.conf # Hyprland Konfiguration
│ ├── amdgpu-egpu.conf # AMDGPU eGPU Tuning
│ ├── amdgpu-egpu.conf # AMDGPU eGPU Tuning (runpm=0, sched_policy=1)
│ ├── razer-naga-swap.service # systemd-Service für Button-Swap-Daemon
│ └── steam-egpu.desktop # Steam Desktop Entry mit eGPU
├── cosmic-applet-superx/
│ ├── Cargo.toml # Rust-Projekt
│ ├── src/
│ │ ├── main.rs # Einstiegspunkt
│ │ ├── lib.rs # Modul-Deklaration
│ │ ├── app.rs # Applet-Logik (UI, Subprocess-Aufrufe)
│ │ └── config.rs # APP_ID
│ ├── com.system76.CosmicAppletSuperX.desktop
│ └── install.sh # Build + Install für COSMIC Applet
└── dms/
└── plugins/
└── SuperXCtrl/
@ -78,6 +94,81 @@ superx-goes-arch/
---
## Installation
### Komplett-Setup (empfohlen)
```bash
git clone ssh://git@git.nepharius.at:2222/nepharius/superx-goes-arch.git
cd superx-goes-arch
./install.sh
```
Das Script installiert:
- COSMIC Applet (build + systemd-User-Service)
- udev-Regeln (Super X HID, Razer Naga, eGPU)
- Razer Naga Button-Swap-Daemon
- eGPU Performance-Tuning (modprobe.d + perf-script)
- Symlinks für CLI-Tools in `~/.local/bin/`
- DMS Widget (falls DMS installiert)
### Einzel-Komponenten
Siehe Abschnitte unten.
---
## COSMIC Applet
Ein Rust-Applet für den COSMIC Desktop-Panel. Steuert Frostbay Cooling, RGB und Tablet RGB.
### Installation
```bash
cd cosmic-applet-superx
cargo build --release
install -Dm755 target/release/cosmic-applet-superx ~/.local/bin/
install -Dm644 com.system76.CosmicAppletSuperX.desktop ~/.local/share/applications/
```
### Autostart (systemd user service)
```bash
cat > ~/.config/systemd/user/cosmic-applet-superx.service << 'EOF'
[Unit]
Description=Super X Control COSMIC Applet
After=graphical-session.target
PartOf=graphical-session.target
[Service]
Type=simple
ExecStart=%h/.local/bin/cosmic-applet-superx
Restart=on-failure
RestartSec=3
[Install]
WantedBy=graphical-session.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now cosmic-applet-superx.service
```
### Panel-Platzierung
Das Applet erscheint in COSMIC Settings → Desktop → Panel → Applets → Add.
Oder direkt via Config: in `~/.config/cosmic/com.system76.CosmicPanel.Panel/v1/plugins_wings`
den Eintrag `"com.system76.CosmicAppletSuperX"` hinzufügen.
### Features
- **Cooling Modes:** Off, Silent, Gentle, Strong, Extreme, Smart
- **Custom Fan/Pump:** Slider 0-100%
- **Frostbay RGB:** 10 Presets + On/Off
- **Tablet RGB:** On/Off, Rainbow, Aurora
- **Status-Anzeige** im Popup
---
## Frostbay BLE (Kühlung)
Die Frostbay ONEC1 Wasserkühlung kommuniziert via **BLE GATT** (nicht HID!).
@ -118,14 +209,6 @@ Details: `docs/frostbay-ble-protocol.md`
`tools/superx-ctrl.py` ist die zentrale CLI-Schnittstelle, die alle Subsysteme zusammenfasst.
### Installation
```bash
# Kopieren nach ~/.local/bin/ für PATH-Zugriff
cp tools/superx-ctrl.py ~/.local/bin/superx-ctrl.py
chmod +x ~/.local/bin/superx-ctrl.py
```
### Nutzung
```bash
@ -175,39 +258,156 @@ superx-ctrl.py
---
## DMS SuperXCtrl Widget
## Razer Naga Left Handed Button Swap
Das DMS-Widget bietet eine GUI für Cooling- und RGB-Steuerung im DMS-Panel.
`tools/razer-naga-swap.py` ist ein Daemon, der die linke und rechte Maustaste der Razer Naga Left Handed Edition vertauscht.
### Funktionsweise
- Nutzt `evdev` + `uinput` (Kernel-Level)
- Grabbed die originale Maus, erzeugt einen virtuellen Device mit getauschten Tasten
- Funktioniert systemweit: COSMIC, Greeter, XWayland, Spiele
- Nur die Razer Naga (1532:008d) wird beeinflusst Touchpad und andere Mäuse bleiben normal
### Installation
```bash
# Plugin-Verzeichnis anlegen
mkdir -p ~/.config/DankMaterialShell/plugins/SuperXCtrl/
# Dateien kopieren
cp dms/plugins/SuperXCtrl/* ~/.config/DankMaterialShell/plugins/SuperXCtrl/
# Plugin aktivieren (plugin_settings.json)
# → {"superXCtrl": {"enabled": true}}
sudo cp tools/razer-naga-swap.py /usr/local/bin/
sudo chmod +x /usr/local/bin/razer-naga-swap.py
sudo cp configs/razer-naga-swap.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now razer-naga-swap.service
```
### Features
### udev-Hotplug
- **Cooling Tab:** 6 Modes (Off/Silent/Gentle/Strong/Extreme/Smart) + Custom Fan/Pump Slider
- **RGB Tab:** 10 Frostbay RGB Presets + On/Off + Tablet RGB (4 Presets + 6 Farben)
- **Status-Pill** in der DMS-Bar: zeigt an ob Cooling aktiv ist
`udev/99-razer-naga-swap.rules` startet den Daemon automatisch beim Einstecken der Maus.
### QML-Architektur
---
Das Widget (`SuperXWidget.qml`) ruft `superx-ctrl.py` via `Process`-Komponente auf:
## eGPU Performance Tuning
```qml
Process {
id: cmdProcess
command: ["sh", "-c", "python3 /home/nepharius/.local/bin/superx-ctrl.py " + args + " 2>/dev/null"]
running: false
}
Für die RX 9060 XT (Navi 44) am USB4-Controller.
### Kernel-Parameter
`configs/amdgpu-egpu.conf``/etc/modprobe.d/amdgpu-egpu.conf`:
```
options amdgpu ppfeaturemask=0xfff7bfff # OverDrive / PowerPlay
options amdgpu gpu_recovery=1 # GPU Recovery statt Kernel Panic
options amdgpu runpm=0 # Runtime-PM aus (eGPU bleibt wach)
options amdgpu dc=1 # Display Core
options amdgpu sched_policy=1 # Priority-Scheduler (Gaming)
options amdgpu mes=1 # Micro Engine Scheduler
```
**Reboot erforderlich** nach Änderung (amdgpu ist built-in).
### Performance-Script
`tools/superx-egpu-perf.sh` setzt beim eGPU-Connect:
- `power_dpm_force_performance_level``high`
- `power/control``on` (Runtime-PM deaktiviert)
- PCIe ASPM → aus
### udev-Hotplug
`udev/99-egpu-superx.rules` triggert das Performance-Script beim Erscheinen der RX 9060 XT.
### Game Wrapper
`tools/superx-game-wrapper.sh` erkennt live ob die eGPU verbunden ist und setzt `DRI_PRIME=1` + `VK_ICD_FILENAMES` nur dann.
In Steam → Properties → Launch Options:
```
/home/nepharius/SuperX-goes-Arch/tools/superx-game-wrapper.sh %command%
```
---
## Tablet RGB (HIDRAW)
`tools/tablet-rgb.py` steuert die RGB-Beleuchtung des Tablet-Moduls via HIDRAW.
**Wichtig:** Die HIDRAW-Erkennung ist dynamisch sie sucht automatisch nach dem Super X Vendor HID (1a86:1305, Interface 2). Funktioniert auch wenn sich der Device-Node nach Neustart ändert.
### Nutzung
```bash
# An/Aus
python3 tools/tablet-rgb.py on
python3 tools/tablet-rgb.py off
# Presets
python3 tools/tablet-rgb.py rainbow
python3 tools/tablet-rgb.py aurora
python3 tools/tablet-rgb.py preset 0x09
# Static Color
python3 tools/tablet-rgb.py 255 0 0 # Rot
python3 tools/tablet-rgb.py 0 255 0 # Grün
python3 tools/tablet-rgb.py 0 0 255 # Blau
```
---
## udev-Regeln
### 99-superx-hid.rules
```udev
KERNEL=="hidraw*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="1305", MODE="0666", TAG+="uaccess"
```
Gibt Lese-/Schreibzugriff auf die Super X Vendor HID-Schnittstelle (0x1A86:0x1305).
### 99-razer-naga-swap.rules
```udev
ACTION=="add", SUBSYSTEM=="input", ATTRS{idVendor}=="1532", ATTRS{idProduct}=="008d", ENV{ID_INPUT_MOUSE}=="1", RUN+="/usr/local/bin/razer-naga-swap.py"
```
Startet den Button-Swap-Daemon beim Einstecken der Razer Naga.
### 99-egpu-superx.rules
Triggert `superx-egpu-perf.sh` beim (Dis-)Connect der RX 9060 XT.
### Installation
```bash
sudo cp udev/*.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
```
---
## EC Turbo
Der Embedded Controller des Super X speichert den Turbo-Status in EC-RAM.
### Register
| Offset | Grösse | Beschreibung |
|---|---|---|
| 0x30 | 1 Byte | Turbo Status (0x00=off, 0x06=turbo) |
| 0x31 | 1 Byte | Fan1 PWM |
| 0x32 | 1 Byte | Fan2 PWM |
| 0x33 | 1 Byte | Pump PWM |
### Nutzung
```bash
# Status lesen
sudo python3 tools/ec-read.py
# Watch-Mode (alle 500ms)
sudo python3 tools/ec-read.py watch
# Turbo setzen
sudo sh -c 'printf "\x06" | dd of=/sys/kernel/debug/ec/ec0/io bs=1 seek=$((0x30)) count=1 conv=notrunc 2>/dev/null'
```
---
@ -256,86 +456,37 @@ python3 tools/turbo-daemon.py
---
## udev-Regeln
## DMS SuperXCtrl Widget
### 99-superx-hid.rules (aktiv)
```udev
KERNEL=="hidraw*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="1305", MODE="0666", TAG+="uaccess"
```
Gibt Lese-/Schreibzugriff auf die Super X Vendor HID-Schnittstelle (0x1A86:0x1305).
Das DMS-Widget bietet eine GUI für Cooling- und RGB-Steuerung im DMS-Panel (für Hyprland/DankMaterialShell).
### Installation
```bash
sudo cp udev/99-superx-hid.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
mkdir -p ~/.config/DankMaterialShell/plugins/SuperXCtrl/
cp dms/plugins/SuperXCtrl/* ~/.config/DankMaterialShell/plugins/SuperXCtrl/
# Plugin aktivieren (plugin_settings.json)
# → {"superXCtrl": {"enabled": true}}
```
---
### Features
## EC Turbo
Der Embedded Controller des Super X speichert den Turbo-Status in EC-RAM.
### Register
| Offset | Grösse | Beschreibung |
|---|---|---|
| 0x30 | 1 Byte | Turbo Status (0x00=off, 0x06=turbo) |
| 0x31 | 1 Byte | Fan1 PWM |
| 0x32 | 1 Byte | Fan2 PWM |
| 0x33 | 1 Byte | Pump PWM |
### Nutzung
```bash
# Status lesen
sudo python3 tools/ec-read.py
# Watch-Mode (alle 500ms)
sudo python3 tools/ec-read.py watch
# Turbo setzen
sudo sh -c 'printf "\\x06" | dd of=/sys/kernel/debug/ec/ec0/io bs=1 seek=$((0x30)) count=1 conv=notrunc 2>/dev/null'
```
---
## Tablet RGB (HIDRAW)
`tools/tablet-rgb.py` steuert die RGB-Beleuchtung des Tablet-Moduls via `/dev/hidraw2`.
### Nutzung
```bash
# An/Aus
python3 tools/tablet-rgb.py on
python3 tools/tablet-rgb.py off
# Presets
python3 tools/tablet-rgb.py rainbow
python3 tools/tablet-rgb.py aurora
python3 tools/tablet-rgb.py preset 0x09
# Static Color
python3 tools/tablet-rgb.py 255 0 0 # Rot
python3 tools/tablet-rgb.py 0 255 0 # Grün
python3 tools/tablet-rgb.py 0 0 255 # Blau
```
- **Cooling Tab:** 6 Modes (Off/Silent/Gentle/Strong/Extreme/Smart) + Custom Fan/Pump Slider
- **RGB Tab:** 10 Frostbay RGB Presets + On/Off + Tablet RGB (4 Presets + 6 Farben)
- **Status-Pill** in der DMS-Bar: zeigt an ob Cooling aktiv ist
---
## Hardware
- **OneXPlayer Super X** (Ryzen AI Max+ 395, Radeon 8060S, 64GB)
- **OneXPlayer Super X** (Ryzen AI Max+ 395, Radeon 8060S, 128GB RAM, 96GB VRAM)
- **Frostbay ONEC1** Wasserkühlung (BLE GATT)
- **Tablet-Modul** mit RGB via HIDRAW (0x1A86:0x1305)
- **Eingelötete WS2812B-Stripes** am Mainboard-Anschluss RGB2 (aktuell nicht angeschlossen)
- **SYSTEK ZT5571VG-Platine** (GA25-RGB_FPC_VA_5522) als RGB-Controller
- **eGPU:** RX 9060 XT via OCuLink (all-ways-egpu)
- **eGPU:** RX 9060 XT (Navi 44, 16GB) via ADTLINK UT4G an USB4
- **Tablet-Modul** mit RGB via HIDRAW (0x1A86:0x1305) noch nicht verbaut
- **Mainboard RGB** über SYSTEK ZT5571VG-Platine (GA25-RGB_FPC_VA_5522) Original-LEDs kommen
- **Razer Naga Left Handed Edition** (1532:008d) mit Button-Swap-Daemon
---
## Git Remote
@ -343,13 +494,17 @@ python3 tools/tablet-rgb.py 0 0 255 # Blau
git remote add origin ssh://git@git.nepharius.at:2222/nepharius/superx-goes-arch.git
```
---
## Roadmap
1. ✅ ~~Frostbay BLE unter Linux/BlueZ steuern~~
2. ✅ ~~superx-ctrl.py als zentrale CLI~~
3. ✅ ~~DMS Widget für GUI-Steuerung~~
4. ✅ ~~HHD Patch für Turbo-Button~~
5. ✅ ~~Tablet RGB via HIDRAW~~
6. 🔄 Logic Analyzer an Mainboard-RGB2-Pin → OEM-Protokoll decodieren
7. 🔄 Kompatible Ersatz-LEDs oder Software-Übersetzer (MCU→WS2812B)
8. 🔄 WMI/EC-Kernel-Module für vollständige Systemsteuerung
3. ✅ ~~COSMIC Applet für Panel-Steuerung~~
4. ✅ ~~DMS Widget für GUI-Steuerung~~
5. ✅ ~~HHD Patch für Turbo-Button~~
6. ✅ ~~Tablet RGB via HIDRAW~~
7. ✅ ~~Razer Naga Button-Swap~~
8. ✅ ~~eGPU Performance-Tuning~~
9. 🔄 Original-LEDs verbauen → Mainboard-RGB Reverse-Engineering
10. 🔄 WMI/EC-Kernel-Module für vollständige Systemsteuerung

101
install.sh Normal file
View file

@ -0,0 +1,101 @@
#!/usr/bin/env bash
# install.sh — Full setup for OneXPlayer Super X on Arch Linux
# Run from the repo root: ./install.sh
set -euo pipefail
DIR="$(cd "$(dirname "$0")" && pwd)"
echo "=== SuperX-goes-Arch Installer ==="
echo ""
# ── 1. COSMIC Applet ──────────────────────────────────────────────────────
if command -v cosmic-comp &>/dev/null; then
echo "--- COSMIC Applet ---"
cd "$DIR/cosmic-applet-superx"
if [ -f target/release/cosmic-applet-superx ]; then
echo " Binary exists, skipping build"
else
echo " Building..."
cargo build --release
fi
install -Dm755 target/release/cosmic-applet-superx ~/.local/bin/cosmic-applet-superx
install -Dm644 com.system76.CosmicAppletSuperX.desktop ~/.local/share/applications/com.system76.CosmicAppletSuperX.desktop
# systemd user service
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/cosmic-applet-superx.service << 'SERVICEEOF'
[Unit]
Description=Super X Control COSMIC Applet
After=graphical-session.target
PartOf=graphical-session.target
[Service]
Type=simple
ExecStart=%h/.local/bin/cosmic-applet-superx
Restart=on-failure
RestartSec=3
[Install]
WantedBy=graphical-session.target
SERVICEEOF
systemctl --user daemon-reload
systemctl --user enable --now cosmic-applet-superx.service 2>/dev/null || true
echo " ✅ COSMIC Applet installed & enabled"
else
echo " ⏭️ COSMIC not detected, skipping applet"
fi
# ── 2. udev-Regeln ────────────────────────────────────────────────────────
echo ""
echo "--- udev Rules ---"
sudo cp "$DIR/udev/99-superx-hid.rules" /etc/udev/rules.d/ 2>/dev/null || true
sudo cp "$DIR/udev/99-razer-naga-swap.rules" /etc/udev/rules.d/ 2>/dev/null || true
sudo udevadm control --reload-rules
sudo udevadm trigger
echo " ✅ udev rules installed"
# ── 3. Razer Naga Swap Daemon ─────────────────────────────────────────────
echo ""
echo "--- Razer Naga Left Handed Button Swap ---"
sudo cp "$DIR/tools/razer-naga-swap.py" /usr/local/bin/
sudo chmod +x /usr/local/bin/razer-naga-swap.py
sudo cp "$DIR/configs/razer-naga-swap.service" /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable razer-naga-swap.service 2>/dev/null || true
sudo systemctl restart razer-naga-swap.service 2>/dev/null || true
echo " ✅ Razer Naga swap daemon installed"
# ── 4. eGPU Performance Tuning ────────────────────────────────────────────
echo ""
echo "--- eGPU Performance ---"
if lspci -nn 2>/dev/null | grep -q "7590"; then
sudo cp "$DIR/configs/amdgpu-egpu.conf" /etc/modprobe.d/ 2>/dev/null || true
sudo cp "$DIR/tools/superx-egpu-perf.sh" /usr/local/bin/ 2>/dev/null || true
sudo chmod +x /usr/local/bin/superx-egpu-perf.sh 2>/dev/null || true
echo " ✅ eGPU config installed (reboot required for modprobe.d)"
else
echo " ⏭️ No eGPU detected, skipping"
fi
# ── 5. Tools nach ~/.local/bin ────────────────────────────────────────────
echo ""
echo "--- CLI Tools ---"
mkdir -p ~/.local/bin
ln -sf "$DIR/tools/superx-ctrl.py" ~/.local/bin/superx-ctrl.py 2>/dev/null || true
ln -sf "$DIR/tools/tablet-rgb.py" ~/.local/bin/tablet-rgb.py 2>/dev/null || true
echo " ✅ symlinks created in ~/.local/bin/"
# ── 6. DMS Widget (optional) ─────────────────────────────────────────────
echo ""
echo "--- DMS Widget ---"
if [ -d ~/.config/DankMaterialShell ]; then
mkdir -p ~/.config/DankMaterialShell/plugins/SuperXCtrl
cp "$DIR/dms/plugins/SuperXCtrl/"* ~/.config/DankMaterialShell/plugins/SuperXCtrl/ 2>/dev/null || true
echo " ✅ DMS widget installed"
else
echo " ⏭️ DMS not detected, skipping"
fi
echo ""
echo "=== Done! ==="
echo "Reboot recommended for eGPU modprobe settings to take effect."
echo "After reboot: check COSMIC Panel Settings → Applets → add 'Super X Control'"