2011-01-17 10 views
1

Ich möchte eine minimale X-Sitzung mit nur einem Window-Manager und einem einzigen Vollbild-Programm ausführen. Der offensichtliche Weg, dies zu tun, ist durch so etwas wie dies in .xinitrc setzen:Gibt es eine zuverlässige Möglichkeit, programmgesteuert festzustellen, dass ein Fenstermanager vollständig initialisiert worden ist?

metacity & # this could be any window manager 
exec my-fullscreen-app 

Aber da diese parallel gestartet werden, gibt es ein bisschen eine Race-Bedingung. Ich möchte nicht, dass meine App angezeigt wird, bevor der Fenstermanager bereit ist, da dann die Größe des Fensters im Vollbildmodus geändert wird. Ich möchte sicherstellen, dass der Fenstermanager die Initialisierung beendet hat.

Das Beste, was ich habe kommen mit etwas wie folgt aus:

metacity & 
while ! xprop -root | grep -q _NET_SUPPORTING_WM_CHECK 
do 
    sleep 0.1 
done 
sleep 0.3 
exec my-fullscreen-app 

Aber nur weil _NET_SUPPORTING_WM_CHECK hat auf dem Root-Fenster gesetzt wurde, bedeutet nicht notwendigerweise, dass die WM wirklich bereit ist, und die 0,3 zweiter Schlaf, nachdem es ein Kludon ist, der auf einigen Systemen ein schwerer Overkill sein könnte und bei anderen völlig unzureichend sein könnte.

Gibt es also eine bessere Möglichkeit, zuverlässig zu erkennen, dass der Fenstermanager vollständig initialisiert ist?

+0

Ich könnte hier etwas fehlen, aber ist das nicht ein Fall, wo Sie überhaupt keinen Fenstermanager brauchen? –

+0

Karl, du brauchst einen Fenstermanager, um dein Fenster richtig zu öffnen. Außerdem kann die App andere Anwendungen starten, während sie ausgeführt wird, die ebenfalls einen laufenden Fenstermanager benötigen, um ordnungsgemäß zu funktionieren. (Ich denke, ich vernachlässige diesen Teil zu erwähnen) – mackstann

Antwort

1

Kurze Antwort ist nein, es gibt keine Möglichkeit.

metacity insbesondere noch Sachen nach dem Einstellen der _NET_SUPPORTING_WM_CHECK Eigenschaft zu tun.

Ich denke, Ihr Ansatz ist über das Beste, was Sie tun können.

Auf der positiven Seite, es sei denn, es Fehler ist, hat das Rennen sollte keine anderen Effekte als kosmetisch diejenigen. (Das heißt die Dinge gezeigt, die nicht in ihrem Endzustand sind)

mildern, könnten Sie Ihre Fenster auf Vollbild-Größe, bevor Sie die Abbildung manuell einstellen möchten. Dann lassen Sie das WM die Größe danach festlegen.

+0

Das ist ein guter Punkt, um es auf die Bildschirmgröße manuell einzustellen sowie die Fullscreen-Eigenschaft zu verwenden - ich denke, dass würde die meisten meiner Bedenken über einen flüchtigen Blick auf die zu beseitigen Fenster in einer kleineren Größe. – mackstann

+0

Hier ist eine andere Idee: Ich könnte die App mit dem Fenster iconicified starten lassen und dann das Fenster entchenicen (über EWMH, so dass es nur funktioniert, sobald das WM reagiert), in einer Schleife, bis ich es tatsächlich feststelle hat funktioniert. Ich denke, das könnte technisch in einen Race-Zustand geraten, wenn ein Benutzer (oder ein anderes Programm) das Fenster sehr schnell neu iconicized das Fenster sehr schnell, aber unter der Annahme, dass Ecke Fall sehr unwahrscheinlich ist, würde ich das – mackstann

+0

funktionieren würde wahrscheinlich funktionieren , müssen Sie WM_STATE und andere Eigenschaften vor der ersten Zuordnung richtig festlegen. –