Podesłane przez Verin.
Menedżer okien jest po prostu jeszcze jedną aplikacją X11, taką jak netscape, gimp czy xterm. Nowicjusze w X11 uważają, że X11 uruchamia menedżera okien, a ten uruchamia programy. Ale to nie jest prawdą. Jeśli tylko zechcesz, możesz uruchomić wszystkie swoje programy pod X11, zabić menedżera okien i uruchomić innego.
Prawdziwym program, który X11 uruchamia, który z kolei uruchamia inne programy, jest skrypt .xinitrc lub .xsession. Gdy X11 startuje, twój skrypt .xinitrc lub .xsession jest uruchamiany, a gdy ten skrypt kończy swoje działanie, X11 również to robi. Powtórzę to, bo to jest ważne: gdy .xinitrc kończy działanie, wtedy X również kończy działanie., a nie wtedy gdy twój menedżer okien się wyłącza.
Najpierw musi do ciebie dotrzeć to, że już to wiesz. Gdy wpisujesz polecenie w powłoce, nie możesz robić niczego innego, dopóki to polecenie się wykonuje. Twój skrypt .xinitrc lub .xsession działa tak samo. Po uruchomieniu, startuje po kolei wszystkie wpisane tam programy, a gdy napotka program, który działa bardzo długo (jak większość programów X11) zatrzymuje się dopóki ten program nie zakończy swojego działania.
Powienieś mieć tylko jedno miejsce, w którym skrypt się 'zawiesza'. I zazwyczaj jest to pod koniec skryptu. Więc jeśli masz jakieś programy, które chciałbyś uruchomić pod X11 zanim dojdziesz do miejsca 'zawieszenia', powinieneś uruchomić je w tle. Po prostu dodaj na końcu lini znak &. Więc jeśli chcesz uruchomić xclock, wstaw poniższą linię przed miejscem 'zawieszenia':
xclock &
Następną rzeczą do wytłumaczenia jest ten exec, który jest polecany do wstawienia do tego skryptu. Szczere mówiąc nie jest to konieczne. Jeśli umieścisz wywołanie menedżera okien w ostatniej lini skryptu, ten zawiesi swoje wykonanie bez użycia exec.
Ale czemu polecają exec? Może chcież umieścić wiele lini startujących różne menedżery okien w twoim skrypcie, ale chcesz by tylko jeden się uruchamiał. Jeśli umieścić wywołanie wybranego menedżera poprzedzone exec przed wywołaniami innych menedżerów. A oto jak działa exec:
"Zastąp mnie tym programem, np. uruchomo go i zabij mnie natychmiast po jego zakończeniu."
Więc jeśli umieścisz exec wmaker przed exec enlightenment, gdy wmaker przerwie działanie, skrypt również to zrobi i nie dojdzie do kolejnej lini.
Widzisz więc czemu jest to niepotrzebne? Możesz po prostu zakomentować linie, które mają nie być wykonywane i będzie to działało tak samo.
Jako alternatywa, możesz uruchomić menedżer okien na początku, zachować jego identyfikator procesu w zmiennej środowiskowej:
wmaker & wmpid=$!
To uruchomi menedżera w tle (&) i umieści identyfikator procesu ($!) w zmiennej (wmpid). Następnie, by 'zawiesić' skrypt użyj polecenia wait:
wait $wmpid
lub zawieszaj na programie, którego zawsze używasz, jak np. gkrellm, przez nie uruchamianie go w tle. Ale pamiętaj, że jak tylko zamkniesz ten program, również twoja sesja X11 się zakończy.
Ja używam metody z wait, ponieważ lubię mieć uruchomiony menedżer okien przed uruchomieniem dockappów i innych programów. Również, zanim cokolwiek innego zrobię, lubię zmieniać ustawienia serwera X11, takie jak dpms, wygaszacz ekranu, jak również dodać kilka ścieżek do czcionek (których nie chcę instalować globalnie). A wtedy, jak już wszystko jest zrobione, czyszczę ścieżkę do czcionek, ponieważ gdy uruchomię menedżer logowania, to nie jest dla niego zbyt dobre ciągłe resetowanie ścieżki do czcionek.
Example A-1. .xinitrc
# deaktywuj wyłączanie ekranu i włącz funkcje energy star
xset s off
xset dpms 600 60 60
# dodaj moje dodatkowe czcionki do ścieżki
xset +fp "$X_FONTPATH"
xset fp rehash
# wyeksportuj środowisko, w razie potrzeby odpluskwiania
env > ~/.xenv
# menedżer okien
fluxbox & wmpid=$!
bbrun &
wmCalClock &
wmxmms &
# PUNKT ZAWIESZENIA - zaczekaj na wyjście menedżera okien
wait $wmpid
# przywróć ścieżkę do czcionek
xset fp default