Dawno temu, pracując nad kolejnym sporym gabarytowo projektem (taka sobie przebudowa sieci biogazu na największej oczyszczalni ścieków w Polsce ;) ), stwierdziłem, że na jednym monitorze się już nie da pracować. Ciągłe przełączanie się z planu sytuacyjnego na profile, z profili na plan zajmowało więcej czasu niż samo projektowanie. Postanowiłem nabyć stację dokującą do mojego lapcia i podłączyć 2 monitory.

Problem

Wszystko jest OK dopóki laptop leży sobie zamknięty w stacji, a obraz wyświetlany jest na 2 monitorach zewnętrznych. Jednak jeśli zechcemy popracować na samym laptopie to X-y nie domyślą się tego, a nasz ekran pozostanie czarny (moja karta graficzna obsługuje max. 2 wyświetlacze).

Jest w sieci trochę rozwiązań, gdzie przy logowaniu można poinformować X-y, że pracuje się na monitorach zewnętrznych lub bez. Uważam, że to rozwiązanie z definicji irracjonalne, bo a) mamy dodatkową czynność do wykonania, b) laptop wie i bez nas czy jest w stacji czy też nie.

Rozwiązanie

Opisana metoda dotyczy OpenSUSE 11.1, powinna działać na wersjach wcześniejszych i wysoce prawdopodobne, że na późniejszych, o ile nic ciekawszego w 11.2 nie wrzucą.

By rozpocząć, należy:

  1. Uruchomić system bez stacji dokującej, obraz powinien być wyświetlany na matrycy laptopa,
  2. skopiować plik /etc/X11/xorg.conf do /etc/X11/xorg.conf.single,
  3. uruchomić laptopa w stacji dokującej z podpiętymi monitorami
  4. ustawić wyświetlanie obrazu na zewnętrznych monitorach (w przypadku kart nVidii: Alt+F2 -> gnomesu nvidia-settings i wybrać tryb TwenView) zapisać nowy plik xorg.conf,
  5. ponownie uruchomić laptopa na stacji dokującej, jeśli obraz pojawi się na obu monitorach tak jak został poprzednio ustawiony tzn., że możemy skopiować nowy /etc/X11/xorg.conf do /etc/X11/xorg.conf.double

Mamy tym samym w katalogu /etc/X11/ pliki konfiguracyjne X-ów: xorg.conf.single dla wyświetlania na matrycy laptopa i xorg.conf.double dla wyświetlania na dwóch zewnętrznych monitorach. Celem jest odpowiednie ich podmienianie na xorg.conf.

Pozostaje zastanowić się JAK?

Stacja dokująca to urządzenie które w rozszerza m. in. liczbę portów USB czyli w jakiś sposób powinno być widoczne w wyniku polecenia lsusb. I jest.

Wobec powyższego, mamy już wszystkie dane. Potrzeba jedynie skryptu który przed wystartowaniem X-ów sprawdzi obecność stacji i odpowiednio przygotuje xorg.conf. U siebie nazwałem go xorg_switch.sh i umieściłem w /etc/init.d nadając mu flagę wykonywalności (chmod a+x), a wygląda tak:

#!/bin/bash
 
###################################################
# skrypt podmieniający xorg.conf                  # 
# do zastosowania przy pracy z innymi ustawieniami# 
# dla stacji dokującej (np. 2 zewnętrzne monitory)# 
# Licencja: GPLv2                                 #
# Autor: Maurycy Szolc                            #
###################################################
 
 
# wyłączenie skryptu podczas zamykania systemu
if [ "$1" == "stop" ] 
then
exit 0
fi
 
# ścieżka do xorg.conf (w większości dystrybucji /etc/X11 )
PATH_TO_X="/etc/X11"
 
# charakterstyczne "coś" co jest tylko w stacji dokującej i wykrywa to lsusb
# np.: ID 413c:0058 Dell Computer Corp. Port Replicator
DOCK_ID="413c:0058"
 
# kasuje istniejący /etc/X11/xorg.conf
rm -f $PATH_TO_X/xorg.conf
 
# sprawdza czy komputer jest w stacji dokującej
IS_DOCKED=`lsusb | grep -o $DOCK_ID`
 
# jeśli tak to kopiuje xorg.conf.double do /etc/X11/xorg.conf i kończy skrypt
if [ "$IS_DOCKED" == "$DOCK_ID" ]
then
  cp $PATH_TO_X/xorg.conf.double $PATH_TO_X/xorg.conf
  exit 0
else
# jeśli nie to kopiuje xorg.conf.single do /etc/X11/xorg.conf i kończy skrypt
  cp $PATH_TO_X/xorg.conf.single $PATH_TO_X/xorg.conf
  exit 0
fi

więc wystarczy przekleić i zmienić PATH_TO_X i DOCK_ID na wartości występujące lokalnie.

By startowało toto w ogóle i przed X-ami, otwieramy YaST-a > Usługi systemowe (poziomy pracy) > Tryb zaawansowany. Jeśli skrypt znajduje się w /etc/init.d to powinniśmy go zobaczyć:

Usługi systemowe (poziomy pracy): szczegóły - YaST

Usługi systemowe (poziomy pracy): szczegóły - YaST

Zaznaczamy poziom pracy (5), ustawiamy na „Włącz” i dajemy „OK”. Następnie w katalogu /etc/init.d/rc5.d powinniśmy znaleźć 2 skróty symboliczne (symlinki) do naszego skryptu. Nas interesuje SXXyyyyyyyy (u mnie S09xorg_switch.sh) gdzie XX niekoniecznie będzie miało wartość 09. Należy zmienić nazwę tego skrótu tak, by wartość XX była o jeden mniejsza niż przy skrócie do xdm (u mnie S10xdm). Chodzi o to, by skrypt xorg_switch.sh uruchamiał się przed X-ami – xdm.

Et Voila!
Teraz wystarczy zrestartować laptopa, a system podczas startu sam zdecyduje gdzie powinien wyświetlać obraz.

Tagged with →  
Share →