Compare commits
9
Commits
bafa2f3dd1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab847cc46f | ||
|
|
a3a6d7216b | ||
|
|
1caaeedef1 | ||
|
|
f3ef48fd10 | ||
|
|
c2b602dcb4 | ||
|
|
d4a6b59f81 | ||
|
|
3643cbd5cb | ||
|
|
ec76b785b3 | ||
|
|
985f48177d |
@@ -79,6 +79,32 @@ Dadurch liegt dort eine echte Arbeitskopie — spätere Änderungen brauchen kei
|
|||||||
cd ~/hpos && git pull
|
cd ~/hpos && git pull
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Wenn `git pull` scheitert:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -rf ~/hpos && bash /sdcard/hpos-init.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Startskript versucht zuerst wieder einen Klon und weicht, falls der Server keine
|
||||||
|
Pakete ausliefert, auf den Archiv-Endpunkt aus (`/archive/main.tar.gz`). Der geht
|
||||||
|
nicht über `git upload-pack` und funktioniert deshalb auch dann noch.
|
||||||
|
|
||||||
|
Das Ergebnis ist dann allerdings **ein Abzug, keine Arbeitskopie** — `git pull` geht
|
||||||
|
damit nicht mehr, jede Aktualisierung braucht denselben Befehl erneut. Sobald der
|
||||||
|
Server wieder Pakete liefert, stellt genau dieser Befehl auch die Arbeitskopie
|
||||||
|
wieder her.
|
||||||
|
|
||||||
|
Typische Meldung, wenn es so weit ist:
|
||||||
|
|
||||||
|
```
|
||||||
|
fatal: early EOF
|
||||||
|
fatal: fetch-pack: invalid index-pack output
|
||||||
|
```
|
||||||
|
|
||||||
|
Das ist ein serverseitiges Problem — `upload-pack` stirbt beim Schnüren des Pakets,
|
||||||
|
während die Objekte selbst heil sind. Erkennbar daran, dass sich ein Archiv weiterhin
|
||||||
|
erzeugen lässt.
|
||||||
|
|
||||||
Details, Stellschrauben und was bei Fehlschlägen zu tun ist:
|
Details, Stellschrauben und was bei Fehlschlägen zu tun ist:
|
||||||
[`spike/README.md`](spike/README.md).
|
[`spike/README.md`](spike/README.md).
|
||||||
|
|
||||||
|
|||||||
@@ -34,10 +34,47 @@ voraussetzungen_pruefen "$DISTRO" || {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ── Alte Reste einsammeln ────────────────────────────────────────────────────
|
# ── Alte Reste einsammeln ────────────────────────────────────────────────────
|
||||||
|
# Läufe hinterlassen Prozesse, die den nächsten stören: ein zweiter KWin findet
|
||||||
|
# den Wayland-Socket belegt, ein alter virgl-Server hält seinen Socket, und
|
||||||
|
# plasmashell hängt sich an die falsche Sitzung. Die proot-Prozesse liegen im
|
||||||
|
# selben PID-Raum wie Termux und sind von hier aus erreichbar.
|
||||||
|
#
|
||||||
|
# Bewusst NICHT mit 'pkill -f': das durchsucht die gesamte Kommandozeile und
|
||||||
|
# trifft dabei auch den eigenen Aufruf, wenn das Muster darin vorkommt. Beim
|
||||||
|
# Entwickeln dieses Blocks hat sich der Test genau so selbst abgeschossen.
|
||||||
|
# Deshalb über pgrep, mit eigener PID und Elternprozess ausgenommen.
|
||||||
section "Aufräumen"
|
section "Aufräumen"
|
||||||
pkill -f termux-x11 2>/dev/null && ok "alten X-Server beendet" || hint "kein alter X-Server"
|
|
||||||
pkill -f virgl_test_server 2>/dev/null && ok "alten virgl-Server beendet" || true
|
# Die eigene Ahnenkette. Nicht nur $$ und $PPID: wird das Skript aus einer Shell
|
||||||
sleep 1
|
# gestartet, deren Kommandozeile eines der Muster enthält, trifft pgrep diese
|
||||||
|
# Shell — und das Skript beendet seinen eigenen Großelternprozess. Genau das ist
|
||||||
|
# beim Entwickeln dieses Blocks passiert.
|
||||||
|
AHNEN=" "
|
||||||
|
_p=$$
|
||||||
|
while [ -n "$_p" ] && [ "$_p" != "0" ] && [ "$_p" != "1" ]; do
|
||||||
|
AHNEN="$AHNEN$_p "
|
||||||
|
_p=$(awk '{print $4}' "/proc/$_p/stat" 2>/dev/null)
|
||||||
|
done
|
||||||
|
|
||||||
|
beenden() {
|
||||||
|
local muster="$1" pid anzahl=0
|
||||||
|
for pid in $(pgrep -f "$muster" 2>/dev/null); do
|
||||||
|
case "$AHNEN" in *" $pid "*) continue ;; esac
|
||||||
|
kill "$pid" 2>/dev/null && anzahl=$((anzahl + 1))
|
||||||
|
done
|
||||||
|
if [ "$anzahl" -gt 0 ]; then ok "beendet: $muster ($anzahl)"
|
||||||
|
else hint "nichts zu beenden: $muster"; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
for muster in kwin_wayland plasmashell xdg-desktop-portal \
|
||||||
|
termux-x11 virgl_test_server; do
|
||||||
|
beenden "$muster"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Verwaiste Wayland-Sockets aus abgebrochenen Läufen. Bleiben sie liegen, startet
|
||||||
|
# KWin auf wayland-1 statt wayland-0 — und plasmashell sucht auf wayland-0.
|
||||||
|
rm -f /tmp/hpos-runtime/wayland-* 2>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
|
||||||
# ── X-Server ─────────────────────────────────────────────────────────────────
|
# ── X-Server ─────────────────────────────────────────────────────────────────
|
||||||
section "Termux-X11 starten"
|
section "Termux-X11 starten"
|
||||||
@@ -92,16 +129,35 @@ hint "Steht es weiterhin dort, hat der X-Server keine Verbindung bekommen."
|
|||||||
|
|
||||||
# ── GPU-Server ───────────────────────────────────────────────────────────────
|
# ── GPU-Server ───────────────────────────────────────────────────────────────
|
||||||
section "GPU-Pfad vorbereiten ($GPU_PROFIL)"
|
section "GPU-Pfad vorbereiten ($GPU_PROFIL)"
|
||||||
if [ "$GPU_PROFIL" = "virgl" ] && have virgl_test_server_android; then
|
# Wichtige Korrektur gegenüber der ersten Fassung: Turnip lebt in Termux'
|
||||||
virgl_test_server_android >>"$LOG" 2>&1 &
|
# Verzeichnis, nicht im Debian-Rootfs. Im Container GALLIUM_DRIVER=zink zu setzen
|
||||||
sleep 1
|
# geht deshalb ins Leere — Zink bräuchte dort einen Vulkan-Treiber, und da ist
|
||||||
ok "virgl-Server gestartet"
|
# keiner. Ergebnis war gar kein OpenGL, und ohne das kann QtQuick nichts zeichnen.
|
||||||
elif [ "$GPU_PROFIL" = "turnip" ]; then
|
#
|
||||||
ok "Turnip greift direkt auf KGSL zu — kein Proxy nötig"
|
# Der tragfähige Weg führt über virgl: der Server läuft in TERMUX und nutzt dort
|
||||||
else
|
# den schnellen Pfad (Zink auf Turnip), der Container spricht nur virpipe mit ihm.
|
||||||
warn "Kein GPU-Server aktiv, Software-Rendering wahrscheinlich"
|
# Turnip bleibt also im Spiel — nur eine Ebene tiefer als gedacht.
|
||||||
|
if ! have virgl_test_server_android; then
|
||||||
|
fail "virgl_test_server_android fehlt — ohne ihn gibt es im Container kein OpenGL."
|
||||||
|
hint "Nachinstallieren: pkg install -y virglrenderer-android"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
pkill -f virgl_test_server 2>/dev/null; sleep 1
|
||||||
|
if [ "$GPU_PROFIL" = "turnip" ]; then
|
||||||
|
# Der Server selbst rendert über Zink auf Turnip — dort ist der Treiber ja.
|
||||||
|
GALLIUM_DRIVER=zink MESA_LOADER_DRIVER_OVERRIDE=zink \
|
||||||
|
virgl_test_server_android >>"$LOG" 2>&1 &
|
||||||
|
ok "virgl-Server gestartet, rendert über Zink auf Turnip"
|
||||||
|
else
|
||||||
|
virgl_test_server_android >>"$LOG" 2>&1 &
|
||||||
|
ok "virgl-Server gestartet"
|
||||||
|
fi
|
||||||
|
VIRGL_PID=$!
|
||||||
|
sleep 2
|
||||||
|
kill -0 "$VIRGL_PID" 2>/dev/null && ok "läuft (PID $VIRGL_PID)" \
|
||||||
|
|| warn "virgl-Server sofort beendet — siehe Protokoll"
|
||||||
|
|
||||||
# ── Audio, damit der Desktop nicht schon daran scheitert ─────────────────────
|
# ── Audio, damit der Desktop nicht schon daran scheitert ─────────────────────
|
||||||
section "PulseAudio"
|
section "PulseAudio"
|
||||||
pulseaudio --kill 2>/dev/null || true
|
pulseaudio --kill 2>/dev/null || true
|
||||||
@@ -119,7 +175,17 @@ HPOS_GPU_PROFIL="$GPU_PROFIL" HPOS_BREITE="$BREITE" HPOS_HOEHE="$HOEHE" \
|
|||||||
proot-distro login "$DISTRO" --shared-tmp --bind "$REPO_ROOT:/hpos" -- \
|
proot-distro login "$DISTRO" --shared-tmp --bind "$REPO_ROOT:/hpos" -- \
|
||||||
bash /hpos/spike/inner/s1-plasma.sh 2>&1 | tee -a "$LOG"
|
bash /hpos/spike/inner/s1-plasma.sh 2>&1 | tee -a "$LOG"
|
||||||
|
|
||||||
verdict "S1" "Zeigt die Termux:X11-App eine bedienbare Plasma-Mobile-Oberfläche?
|
verdict "S1" "Was zeigt die Termux:X11-App?
|
||||||
Prüfe: reagiert Touch, erscheint die Maliit-Tastatur beim Tippen in ein Feld?"
|
|
||||||
|
|
||||||
log "Aufräumen: pkill -f termux-x11 ; pkill -f virgl_test_server"
|
[n] Nichts, oder nur 'not connected' — der X-Server kam nicht durch.
|
||||||
|
[t] Schwarze Fläche mit kleinem X-Cursor oben links.
|
||||||
|
Das heißt: X11 ist verbunden und der Server läuft, aber es zeichnet
|
||||||
|
nichts darauf. KWin oder die Plasma-Shell fehlen — halber Erfolg.
|
||||||
|
[j] Eine Plasma-Mobile-Oberfläche mit Hintergrund und Bedienelementen.
|
||||||
|
|
||||||
|
Nur bei [j] weiter prüfen: reagiert Touch auf Wischen und Tippen?
|
||||||
|
Die Bildschirmtastatur erst dort testen, wo es ein Eingabefeld gibt —
|
||||||
|
etwa in den Plasma-Einstellungen. Vorher gibt es nichts zu tippen."
|
||||||
|
|
||||||
|
log "Alles beenden: pkill -f 'kwin_wayland|plasmashell|termux-x11|virgl_test_server'"
|
||||||
|
log "(Das Skript macht das beim nächsten Start ohnehin von selbst.)"
|
||||||
|
|||||||
@@ -94,11 +94,19 @@ bash spike/04-s4-intent-handoff.sh
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/hpos && git pull
|
cd ~/hpos && git pull
|
||||||
|
|
||||||
|
# Falls das scheitert (Server liefert keine Pakete aus):
|
||||||
|
rm -rf ~/hpos && bash /sdcard/hpos-init.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Per adb kommt bewusst nur das Startskript aufs Telefon, nicht das Repo selbst.
|
Per adb kommt bewusst nur das Startskript aufs Telefon, nicht das Repo selbst.
|
||||||
Dadurch liegt dort eine echte Arbeitskopie statt einer Kopie.
|
Dadurch liegt dort eine echte Arbeitskopie statt einer Kopie.
|
||||||
|
|
||||||
|
Der zweite Befehl weicht auf den Archiv-Endpunkt aus, wenn `git clone` am Server
|
||||||
|
scheitert. Das Ergebnis ist dann ein Abzug ohne `.git` — `git pull` geht damit nicht
|
||||||
|
mehr, und jede Aktualisierung braucht denselben Befehl erneut. Sobald der Server
|
||||||
|
wieder Pakete liefert, stellt er auch die Arbeitskopie wieder her.
|
||||||
|
|
||||||
Jedes Skript fragt am Ende nach deiner Beurteilung und schreibt sie nach
|
Jedes Skript fragt am Ende nach deiner Beurteilung und schreibt sie nach
|
||||||
`spike/out/ergebnisse.tsv`. Rohprotokolle liegen daneben in `spike/out/*.log`.
|
`spike/out/ergebnisse.tsv`. Rohprotokolle liegen daneben in `spike/out/*.log`.
|
||||||
|
|
||||||
|
|||||||
+209
-33
@@ -22,21 +22,19 @@ export QT_QPA_PLATFORM=wayland
|
|||||||
export QT_QUICK_CONTROLS_MOBILE=1
|
export QT_QUICK_CONTROLS_MOBILE=1
|
||||||
export PLASMA_PLATFORM=phone
|
export PLASMA_PLATFORM=phone
|
||||||
export KDE_FULL_SESSION=true
|
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
|
||||||
|
|
||||||
case "$GPU_PROFIL" in
|
# Im Container immer virpipe, unabhängig vom Profil. Der Vulkan-Treiber liegt in
|
||||||
turnip)
|
# Termux' Verzeichnis und ist hier drinnen nicht erreichbar — Zink hätte also
|
||||||
# Zink übersetzt OpenGL auf Vulkan, Turnip liefert Vulkan direkt aus dem
|
# nichts, worauf es aufsetzen könnte. Der schnelle Pfad (Zink auf Turnip) wird
|
||||||
# Adreno-Treiber — zusammen der schnellste Weg ohne Root.
|
# eine Ebene tiefer genutzt, vom virgl-Server auf der Termux-Seite.
|
||||||
export MESA_LOADER_DRIVER_OVERRIDE=zink
|
export GALLIUM_DRIVER=virpipe
|
||||||
export GALLIUM_DRIVER=zink
|
export MESA_GL_VERSION_OVERRIDE=4.3
|
||||||
export TU_DEBUG=noconform
|
export MESA_GLES_VERSION_OVERRIDE=3.2
|
||||||
;;
|
echo " GPU-Profil: $GPU_PROFIL (im Container über virpipe)"
|
||||||
virgl)
|
|
||||||
export GALLIUM_DRIVER=virpipe
|
|
||||||
export MESA_GL_VERSION_OVERRIDE=4.3
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
echo " GPU-Profil: $GPU_PROFIL"
|
|
||||||
|
|
||||||
# ── Pakete ───────────────────────────────────────────────────────────────────
|
# ── Pakete ───────────────────────────────────────────────────────────────────
|
||||||
# Bewusst ohne empfohlene Pakete: sonst zieht Plasma Mobile eine komplette
|
# Bewusst ohne empfohlene Pakete: sonst zieht Plasma Mobile eine komplette
|
||||||
@@ -44,8 +42,14 @@ echo " GPU-Profil: $GPU_PROFIL"
|
|||||||
if ! command -v kwin_wayland >/dev/null 2>&1; then
|
if ! command -v kwin_wayland >/dev/null 2>&1; then
|
||||||
echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──"
|
echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──"
|
||||||
apt-get update -qq
|
apt-get update -qq
|
||||||
apt-get install -y --no-install-recommends \
|
# Bewusst OHNE --no-install-recommends: bei KDE stecken die QML-Module
|
||||||
plasma-mobile kwin-wayland plasma-workspace maliit-keyboard \
|
# 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 \
|
xdg-desktop-portal-kde qtwayland5 libqt5waylandclient5 \
|
||||||
|| echo " ! Paketinstallation unvollständig — Details oben"
|
|| echo " ! Paketinstallation unvollständig — Details oben"
|
||||||
fi
|
fi
|
||||||
@@ -55,12 +59,124 @@ for b in kwin_wayland plasmashell; do
|
|||||||
else echo " ✗ $b fehlt"; fi
|
else echo " ✗ $b fehlt"; fi
|
||||||
done
|
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 ──────────────────────────────────
|
# ── GPU-Nachweis, bevor der Desktop startet ──────────────────────────────────
|
||||||
# Wenn hier schon nichts kommt, ist ein Fehlschlag von Plasma keine Aussage über
|
# Wenn hier schon nichts kommt, ist ein Fehlschlag von Plasma keine Aussage über
|
||||||
# Plasma, sondern über den GPU-Pfad. Deshalb vorher messen.
|
# Plasma, sondern über den GPU-Pfad. Deshalb vorher messen.
|
||||||
echo "── GPU-Nachweis ──"
|
echo "── Anzeige und GPU prüfen ──"
|
||||||
timeout 20 glxinfo -B 2>&1 | grep -Ei 'OpenGL (renderer|version)|Device' || echo " ! glxinfo lieferte nichts"
|
|
||||||
timeout 20 vulkaninfo --summary 2>&1 | grep -Ei 'driverName|deviceName' || echo " ! vulkaninfo lieferte nichts"
|
# Erst der X-Server. Wenn schon der nicht erreichbar ist, sagt jeder GL-Test
|
||||||
|
# darunter nichts aus.
|
||||||
|
if timeout 15 xdpyinfo >/tmp/hpos-xdpy.txt 2>&1; then
|
||||||
|
grep -E '^(name of display|version number|dimensions)' /tmp/hpos-xdpy.txt \
|
||||||
|
| head -3 | sed 's/^/ /'
|
||||||
|
echo " ✓ X-Server erreichbar"
|
||||||
|
else
|
||||||
|
echo " ✗ X-Server NICHT erreichbar — das wäre die Wurzel allen Übels:"
|
||||||
|
head -3 /tmp/hpos-xdpy.txt | sed 's/^/ /'
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Jeden GL-Weg einzeln und mit Rückgabewert prüfen. Stürzt glxinfo ab, kommt die
|
||||||
|
# Meldung von der Shell und nicht vom Programm — sie ginge in einer
|
||||||
|
# Kommandoersetzung verloren, und die Ausgabe wäre einfach leer. Genau das ist
|
||||||
|
# vorher passiert und sah aus wie 'kein Treiber gefunden'.
|
||||||
|
gl_test() {
|
||||||
|
local name="$1"; shift
|
||||||
|
local aus rc
|
||||||
|
aus=$(env "$@" timeout 25 glxinfo -B 2>&1); rc=$?
|
||||||
|
if printf '%s' "$aus" | grep -qi 'OpenGL renderer'; then
|
||||||
|
printf '%s\n' "$aus" | grep -Ei 'OpenGL (renderer|version)' | sed 's/^/ /'
|
||||||
|
echo " ✓ $name"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo " ✗ $name — Rückgabewert $rc$([ "$rc" -gt 128 ] && echo ' (abgestürzt oder abgebrochen)')"
|
||||||
|
if [ -n "$aus" ]; then
|
||||||
|
printf '%s\n' "$aus" | head -4 | sed 's/^/ /'
|
||||||
|
else
|
||||||
|
echo " (keine Ausgabe)"
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ist der virgl-Socket überhaupt da? Fehlt er, hängt der Client bis zum Zeitlimit
|
||||||
|
# (Rückgabewert 124) statt eine Fehlermeldung zu liefern.
|
||||||
|
if ls /tmp/.virgl_test* >/dev/null 2>&1; then
|
||||||
|
echo " ✓ virgl-Socket sichtbar: $(ls /tmp/.virgl_test* 2>/dev/null | tr '\n' ' ')"
|
||||||
|
else
|
||||||
|
echo " ! Kein virgl-Socket unter /tmp — der Container sieht den Server nicht."
|
||||||
|
echo " (Termux legt ihn in sein tmp; proot-distro bindet das über --shared-tmp.)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if gl_test "OpenGL über virgl" GALLIUM_DRIVER=virpipe; then
|
||||||
|
GL_WEG=virgl
|
||||||
|
export GALLIUM_DRIVER=virpipe
|
||||||
|
else
|
||||||
|
# Hier war ein Denkfehler: schlugen beide Prüfungen fehl, wurde der
|
||||||
|
# Software-Pfad NICHT gesetzt — ausgerechnet dann nicht, wenn er am nötigsten
|
||||||
|
# ist. Und glxinfo taugt ohnehin nicht als Richter: unter Termux-X11
|
||||||
|
# scheitert es an X_GetImage mit BadMatch, weil es Pixel zurücklesen will.
|
||||||
|
# Das sagt etwas über glxinfo, nichts über OpenGL.
|
||||||
|
#
|
||||||
|
# Deshalb: Prüfungen nur zur Information, und im Zweifel immer den
|
||||||
|
# Software-Pfad. KWin und QtQuick haben je einen, der die GL-Ebene ganz umgeht.
|
||||||
|
gl_test "OpenGL in Software (llvmpipe)" LIBGL_ALWAYS_SOFTWARE=1 || true
|
||||||
|
GL_WEG=software
|
||||||
|
unset GALLIUM_DRIVER
|
||||||
|
export LIBGL_ALWAYS_SOFTWARE=1
|
||||||
|
export KWIN_COMPOSE=Q # KWin: QPainter statt OpenGL
|
||||||
|
export QT_QUICK_BACKEND=software
|
||||||
|
export QMLSCENE_DEVICE=softwarecontext
|
||||||
|
echo " → Weiter mit Software-Rendering (KWin QPainter, QtQuick software)."
|
||||||
|
echo " Träge, aber für S1 ausreichend: die Frage ist, OB es läuft."
|
||||||
|
echo " Ein scheiterndes glxinfo schließt das nicht aus — es prüft anders."
|
||||||
|
fi
|
||||||
|
echo " Verwendeter Weg: $GL_WEG"
|
||||||
|
|
||||||
# ── D-Bus ────────────────────────────────────────────────────────────────────
|
# ── D-Bus ────────────────────────────────────────────────────────────────────
|
||||||
if [ ! -e /run/dbus/system_bus_socket ]; then
|
if [ ! -e /run/dbus/system_bus_socket ]; then
|
||||||
@@ -73,23 +189,83 @@ fi
|
|||||||
# Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat.
|
# Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat.
|
||||||
echo ""
|
echo ""
|
||||||
echo "── Versuch A: kwin_wayland --x11-display ──"
|
echo "── Versuch A: kwin_wayland --x11-display ──"
|
||||||
|
echo " Umgebung: GL_WEG=$GL_WEG KWIN_COMPOSE=${KWIN_COMPOSE:-(nicht gesetzt)}"
|
||||||
|
echo " QT_QUICK_BACKEND=${QT_QUICK_BACKEND:-(nicht gesetzt)}"
|
||||||
LOGA=/tmp/hpos-s1-versuchA.log
|
LOGA=/tmp/hpos-s1-versuchA.log
|
||||||
dbus-run-session -- kwin_wayland \
|
|
||||||
--x11-display "$DISPLAY" \
|
|
||||||
--width "$BREITE" --height "$HOEHE" \
|
|
||||||
--xwayland \
|
|
||||||
-- plasmashell -p org.kde.plasma.phoneshell \
|
|
||||||
>"$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
|
# Die lange Optionsform statt '-p': kurze Formen ändern sich zwischen den
|
||||||
echo " ✓ Versuch A läuft noch — jetzt in die Termux:X11-App wechseln und schauen."
|
# Plasma-Fassungen leichter als lange, und eine unbekannte Kurzoption wird still
|
||||||
|
# ignoriert statt bemängelt. Genau das ist der Verdacht.
|
||||||
|
#
|
||||||
|
# Und statt einen Namen zu raten, werden die vorhandenen Shells der Reihe nach
|
||||||
|
# ausprobiert. 'invalid corona' im Protokoll ist das Abbruchkriterium — es sagt,
|
||||||
|
# dass plasmashell nichts zeichnen wird, ohne dass man hinschauen muss.
|
||||||
|
beenden_versuch() {
|
||||||
|
[ -n "${PID_A:-}" ] && kill "$PID_A" 2>/dev/null
|
||||||
|
pkill -x kwin_wayland 2>/dev/null
|
||||||
|
pkill -x plasmashell 2>/dev/null
|
||||||
|
sleep 3
|
||||||
|
}
|
||||||
|
|
||||||
|
starte_mit_shell() {
|
||||||
|
local shell="$1"
|
||||||
|
: >"$LOGA"
|
||||||
|
dbus-run-session -- kwin_wayland \
|
||||||
|
--x11-display "$DISPLAY" \
|
||||||
|
--width "$BREITE" --height "$HOEHE" \
|
||||||
|
--xwayland \
|
||||||
|
-- plasmashell ${shell:+--shell-plugin "$shell"} \
|
||||||
|
>"$LOGA" 2>&1 &
|
||||||
|
PID_A=$!
|
||||||
|
sleep 25
|
||||||
|
kill -0 "$PID_A" 2>/dev/null || return 1
|
||||||
|
grep -q 'invalid corona' "$LOGA" && return 2
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
KANDIDATEN="$SHELL_PAKET"
|
||||||
|
for w in org.kde.plasma.mobileshell org.kde.plasma.nano; do
|
||||||
|
case " $KANDIDATEN " in *" $w "*) ;; *) KANDIDATEN="$KANDIDATEN $w" ;; esac
|
||||||
|
done
|
||||||
|
|
||||||
|
ERFOLG=0
|
||||||
|
for shell in $KANDIDATEN; do
|
||||||
|
[ -d "/usr/share/plasma/shells/$shell" ] || continue
|
||||||
echo ""
|
echo ""
|
||||||
echo " Beenden mit: pkill -f kwin_wayland"
|
echo " → Versuche Shell: $shell"
|
||||||
echo " Protokoll: $LOGA"
|
starte_mit_shell "$shell"
|
||||||
tail -n 25 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
case $? in
|
||||||
|
0) echo " ✓ läuft, und plasmashell meldet keine ungültige Shell."
|
||||||
|
ERFOLG=1; break ;;
|
||||||
|
2) echo " ✗ 'invalid corona' — diese Shell trägt nicht."
|
||||||
|
grep 'invalid corona' "$LOGA" | tail -1 | sed 's/^/ /'
|
||||||
|
beenden_versuch ;;
|
||||||
|
*) echo " ✗ Prozess sofort beendet."
|
||||||
|
tail -n 15 "$LOGA" | sed 's/^/ /' ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$ERFOLG" = 1 ] && kill -0 "$PID_A" 2>/dev/null; then
|
||||||
|
echo ""
|
||||||
|
echo " ✓ Versuch A läuft — jetzt in die Termux:X11-App wechseln und schauen."
|
||||||
|
echo " Verwendete Shell: $shell"
|
||||||
|
echo " Beenden mit: pkill -x kwin_wayland"
|
||||||
|
echo " Protokoll: $LOGA"
|
||||||
|
tail -n 20 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if kill -0 "${PID_A:-0}" 2>/dev/null; then
|
||||||
|
# Läuft noch, aber keine Shell hat getragen: KWin steht, plasmashell zeichnet
|
||||||
|
# nichts. Das ist ein Teilerfolg und soll auch so benannt werden — der
|
||||||
|
# Compositor ist der schwierige Teil, die Shell der austauschbare.
|
||||||
|
echo ""
|
||||||
|
echo " ! KWin läuft, aber keine der vorhandenen Shells ließ sich laden."
|
||||||
|
echo " Der Compositor ist damit bewiesen, die Shell nicht."
|
||||||
|
echo " Nächster Schritt von Hand, zeigt die eigentliche Ursache:"
|
||||||
|
echo " plasmashell --shell-plugin org.kde.plasma.mobileshell"
|
||||||
|
echo " Protokoll: $LOGA"
|
||||||
|
tail -n 20 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user