#!/bin/bash # Läuft INNERHALB des Debian-Rootfs, aufgerufen von 01-s1-plasma-mobile.sh. # Direkt aufrufen ergibt keinen Sinn — die Umgebung kommt vom äußeren Skript. set -uo pipefail GPU_PROFIL="${HPOS_GPU_PROFIL:-virgl}" BREITE="${HPOS_BREITE:-1080}" HOEHE="${HPOS_HOEHE:-2340}" echo "── Debian-Seite: Plasma Mobile ──" export DEBIAN_FRONTEND=noninteractive export DISPLAY=:0 export XDG_RUNTIME_DIR=/tmp/hpos-runtime export PULSE_SERVER=127.0.0.1 export LANG=de_DE.UTF-8 mkdir -p "$XDG_RUNTIME_DIR" && chmod 700 "$XDG_RUNTIME_DIR" # Plasma Mobile ist Touch-first: ohne diese Variablen kommt eine Desktop-Skalierung # heraus, die auf einem Telefon unbedienbar ist. export QT_QPA_PLATFORM=wayland export QT_QUICK_CONTROLS_MOBILE=1 export PLASMA_PLATFORM=phone export KDE_FULL_SESSION=true # Ohne gesetztes Cursor-Thema meldet KWin 'Failed to load cursor theme "default"' # und zeichnet gar keinen Mauszeiger. export XCURSOR_THEME=breeze_cursors export XCURSOR_SIZE=24 # Im Container immer virpipe, unabhängig vom Profil. Der Vulkan-Treiber liegt in # Termux' Verzeichnis und ist hier drinnen nicht erreichbar — Zink hätte also # nichts, worauf es aufsetzen könnte. Der schnelle Pfad (Zink auf Turnip) wird # eine Ebene tiefer genutzt, vom virgl-Server auf der Termux-Seite. export GALLIUM_DRIVER=virpipe export MESA_GL_VERSION_OVERRIDE=4.3 export MESA_GLES_VERSION_OVERRIDE=3.2 echo " GPU-Profil: $GPU_PROFIL (im Container über virpipe)" # ── Pakete ─────────────────────────────────────────────────────────────────── # Bewusst ohne empfohlene Pakete: sonst zieht Plasma Mobile eine komplette # Desktop-Umgebung samt Drucksystem mit, was auf einem Telefon nur Platz kostet. if ! command -v kwin_wayland >/dev/null 2>&1; then echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──" apt-get update -qq # Bewusst OHNE --no-install-recommends: bei KDE stecken die QML-Module # traditionell in den Empfehlungen, nicht in den harten Abhängigkeiten. # Ohne sie ist die Shell formal installiert, aber innen hohl — plasmashell # lädt sie dann nicht und fällt wortlos auf die Voreinstellung zurück. # Für einen Machbarkeitsbeweis ist ein paar hundert MB zu viel das kleinere # Übel gegenüber einem Fehlschlag aus dem falschen Grund. apt-get install -y \ plasma-mobile plasma-nano kwin-wayland plasma-workspace maliit-keyboard \ xdg-desktop-portal-kde qtwayland5 libqt5waylandclient5 \ || echo " ! Paketinstallation unvollständig — Details oben" fi for b in kwin_wayland plasmashell; do if command -v "$b" >/dev/null 2>&1; then echo " ✓ $b vorhanden" else echo " ✗ $b fehlt"; fi done # ── Welche Shell? ──────────────────────────────────────────────────────────── # Ohne gültiges Shell-Paket startet plasmashell klaglos, meldet nur beiläufig # "starting invalid corona" und zeichnet dann nichts. Von außen sieht das aus wie # ein Fehlschlag des Compositors und ist keiner. # # In Debian liefert ausgerechnet 'plasma-mobile' KEINE Shell mit, sondern nur # QML-Module und KWin-Skripte. Die Shell steckt in 'plasma-nano' und heißt # org.kde.plasma.nano. Der Name org.kde.plasma.mobileshell aus den KDE-Quellen # existiert in Debian nicht. Deshalb wird nachgesehen statt geraten. shell_suchen() { local kandidat for kandidat in org.kde.plasma.mobileshell org.kde.plasma.phoneshell \ org.kde.plasma.nano org.kde.plasma.desktop; do if [ -d "/usr/share/plasma/shells/$kandidat" ]; then printf '%s' "$kandidat" return 0 fi done return 1 } echo "── Verfügbare Plasma-Shells ──" if [ -d /usr/share/plasma/shells ]; then ls -1 /usr/share/plasma/shells/ 2>/dev/null | sed 's/^/ /' [ -z "$(ls -A /usr/share/plasma/shells/ 2>/dev/null)" ] && echo " (leer)" else echo " (Verzeichnis /usr/share/plasma/shells fehlt)" fi SHELL_PAKET="$(shell_suchen || true)" if [ -z "$SHELL_PAKET" ]; then echo " ! Keine Shell gefunden — versuche plasma-nano nachzuinstallieren." apt-get install -y --no-install-recommends plasma-nano plasma-mobile 2>&1 \ | tail -5 | sed 's/^/ /' SHELL_PAKET="$(shell_suchen || true)" fi if [ -n "$SHELL_PAKET" ]; then echo " ✓ Shell: $SHELL_PAKET" else echo " ✗ Weiterhin keine Plasma-Shell — plasmashell hat nichts zu zeichnen." echo " Prüfen: dpkg -L plasma-nano | grep shells" echo " Ohne Shell ist Versuch A zum Scheitern verurteilt; XFCE zeigt dann," echo " ob wenigstens X-Server und GPU tragen." fi # ── GPU-Nachweis, bevor der Desktop startet ────────────────────────────────── # Wenn hier schon nichts kommt, ist ein Fehlschlag von Plasma keine Aussage über # Plasma, sondern über den GPU-Pfad. Deshalb vorher messen. echo "── GPU-Nachweis ──" # Das ist kein Nebenschauplatz: ohne funktionierendes OpenGL kann QtQuick keine # Szene aufbauen, plasmashell lädt seine Shell nicht und fällt wortlos auf die # Voreinstellung zurück. Ein schwarzer Bildschirm sieht dann nach einem # Compositor-Problem aus, ist aber eines der Grafikanbindung. GLXAUS=$(timeout 25 glxinfo -B 2>&1) if printf '%s' "$GLXAUS" | grep -qi 'OpenGL renderer'; then printf '%s\n' "$GLXAUS" | grep -Ei 'OpenGL (renderer|version)' | sed 's/^/ /' echo " ✓ OpenGL steht" else echo " ✗ Kein OpenGL im Container:" printf '%s\n' "$GLXAUS" | head -6 | sed 's/^/ /' echo " Läuft virgl_test_server_android auf der Termux-Seite?" echo " Ohne OpenGL wird plasmashell die Shell nicht laden können." fi # ── D-Bus ──────────────────────────────────────────────────────────────────── if [ ! -e /run/dbus/system_bus_socket ]; then mkdir -p /run/dbus dbus-daemon --system --fork 2>/dev/null && echo " ✓ System-D-Bus gestartet" \ || echo " ! System-D-Bus nicht gestartet (ohne logind oft verschmerzbar)" fi # ── Versuch A: KWin genestet im X11-Backend ────────────────────────────────── # Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat. echo "" echo "── Versuch A: kwin_wayland --x11-display ──" LOGA=/tmp/hpos-s1-versuchA.log dbus-run-session -- kwin_wayland \ --x11-display "$DISPLAY" \ --width "$BREITE" --height "$HOEHE" \ --xwayland \ -- plasmashell ${SHELL_PAKET:+-p "$SHELL_PAKET"} \ >"$LOGA" 2>&1 & PID_A=$! echo " gestartet (PID $PID_A), warte 25 s auf die Oberfläche …" sleep 25 if kill -0 "$PID_A" 2>/dev/null; then echo " ✓ Versuch A läuft noch — jetzt in die Termux:X11-App wechseln und schauen." # 'invalid corona' heißt: plasmashell hat kein brauchbares Shell-Paket geladen # und zeichnet folglich nichts. Steht dort die Voreinstellung # org.kde.plasma.desktop, obwohl wir etwas anderes übergeben haben, ist das # kein Tippfehler, sondern ein Rückfall — die gewünschte Shell ließ sich nicht # laden. Der Unterschied entscheidet, wo man weitersucht. if grep -q 'invalid corona' "$LOGA" 2>/dev/null; then echo "" echo " ✗ ACHTUNG: plasmashell meldet 'invalid corona' — es zeichnet nichts." grep 'invalid corona' "$LOGA" | tail -2 | sed 's/^/ /' if [ -n "$SHELL_PAKET" ]; then echo " Übergeben wurde: -p $SHELL_PAKET" case "$(grep -o 'invalid corona \"[^\"]*\"' "$LOGA" | tail -1)" in *"$SHELL_PAKET"*) echo " → Diese Shell selbst lässt sich nicht laden." echo " Meist fehlen QML-Module. Nachsehen mit:" echo " plasmashell -p $SHELL_PAKET (Fehler stehen auf stderr)" ;; *) echo " → plasmashell ist auf die Voreinstellung zurückgefallen," echo " die übergebene Shell kam also nicht an oder wurde verworfen." ;; esac else echo " Es wurde gar keine Shell übergeben (keine gefunden)." fi echo " Ein schwarzes Bild ist damit erklärt — KWin läuft trotzdem." fi echo "" echo " Beenden mit: pkill -f kwin_wayland" echo " Protokoll: $LOGA" tail -n 25 "$LOGA" 2>/dev/null | sed 's/^/ /' exit 0 fi echo " ✗ Versuch A beendet. Letzte Zeilen:" tail -n 40 "$LOGA" 2>/dev/null | sed 's/^/ /' # ── Versuch B: die von Debian mitgelieferte Sitzung ────────────────────────── # Startet KWin selbst und wählt sein Backend eigenständig. Weniger Kontrolle, # aber manchmal weiß das Distributionsskript etwas, das wir nicht wissen. echo "" echo "── Versuch B: startplasmamobile ──" if command -v startplasmamobile >/dev/null 2>&1; then LOGB=/tmp/hpos-s1-versuchB.log KWIN_COMPOSE=O2 dbus-run-session -- startplasmamobile >"$LOGB" 2>&1 & PID_B=$! sleep 25 if kill -0 "$PID_B" 2>/dev/null; then echo " ✓ Versuch B läuft — in die Termux:X11-App wechseln." tail -n 25 "$LOGB" 2>/dev/null | sed 's/^/ /' exit 0 fi echo " ✗ Versuch B beendet. Letzte Zeilen:" tail -n 40 "$LOGB" 2>/dev/null | sed 's/^/ /' else echo " ! startplasmamobile nicht vorhanden" fi # ── Rückfallebene: XFCE, damit der Abend nicht umsonst war ─────────────────── # Beweist zumindest, dass X-Server und GPU-Pfad tragen. Damit ist ein Fehlschlag # von S1 eindeutig Plasma zuzuordnen und nicht der Umgebung. echo "" echo "── Rückfallebene: XFCE zur Gegenprobe ──" if ! command -v startxfce4 >/dev/null 2>&1; then apt-get install -y --no-install-recommends xfce4 xfce4-terminal >/dev/null 2>&1 \ || echo " ! XFCE-Installation fehlgeschlagen" fi if command -v startxfce4 >/dev/null 2>&1; then dbus-run-session -- startxfce4 >/tmp/hpos-s1-xfce.log 2>&1 & sleep 12 if pgrep -f xfwm4 >/dev/null 2>&1; then echo " ✓ XFCE läuft. S1 ist gescheitert, aber X-Server und GPU-Pfad tragen." echo " → Im Protokoll als 'S1 gescheitert, XFCE-Profil wird Hauptweg' vermerken." else echo " ✗ Auch XFCE startet nicht — dann liegt es an X-Server oder GPU, nicht an Plasma." fi fi exit 1