AppImage-Autostart unter Wayland reparieren
Der Wechsel auf X11 (noetig, weil Wayland weder Selbstpositionierung noch Always-on-Top erlaubt) startete die App unter Wayland gar nicht neu: Electrons app.relaunch() legt den Nachfolger ueber einen Hilfsprozess an, der im /tmp-Mount des AppImage liegt. Beim Beenden der alten Instanz wird der Mount abgehaengt und reisst den Hilfsprozess mit, bevor er den Nachfolger starten kann -- die App war nach dem Doppelklick einfach weg. Fuer das AppImage den Nachfolger jetzt selbst als abgekoppelten Prozess (child_process.spawn mit detached/unref) auf das echte Abbild starten; das ueberlebt das Abhaengen des Mounts. Quelle und .deb behalten app.relaunch(), da dort der Hilfsprozess auf einem bleibenden Pfad liegt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+14
-4
@@ -61,10 +61,20 @@ function forceX11IfWayland() {
|
|||||||
const args = process.argv.slice(1).concat('--ozone-platform=x11');
|
const args = process.argv.slice(1).concat('--ozone-platform=x11');
|
||||||
|
|
||||||
// Ein AppImage hängt sich beim Start unter /tmp ein und wirft die Einhängung
|
// Ein AppImage hängt sich beim Start unter /tmp ein und wirft die Einhängung
|
||||||
// beim Beenden wieder weg. `process.execPath` zeigt dorthin und wäre für den
|
// beim Beenden wieder weg. Electrons `app.relaunch()` startet den Nachfolger
|
||||||
// Nachfolger schon verschwunden — neu gestartet werden muss das Abbild.
|
// über einen Hilfsprozess, der im selben /tmp-Mount liegt — dieser
|
||||||
if (process.env.APPIMAGE) app.relaunch({ execPath: process.env.APPIMAGE, args });
|
// verschwindet mit dem Abhängen der Einhängung, bevor er den Nachfolger
|
||||||
else app.relaunch({ args });
|
// starten kann, sodass gar nichts neu startet. Für das AppImage deshalb
|
||||||
|
// selbst einen abgekoppelten Prozess auf das echte Abbild starten (`setsid`
|
||||||
|
// gleich, überlebt das Beenden der Elterninstanz). Für Quelle und .deb liegt
|
||||||
|
// der Hilfsprozess auf einem bleibenden Pfad — dort bleibt app.relaunch().
|
||||||
|
if (process.env.APPIMAGE) {
|
||||||
|
require('node:child_process')
|
||||||
|
.spawn(process.env.APPIMAGE, args, { detached: true, stdio: 'ignore' })
|
||||||
|
.unref();
|
||||||
|
} else {
|
||||||
|
app.relaunch({ args });
|
||||||
|
}
|
||||||
|
|
||||||
app.exit(0);
|
app.exit(0);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user