Ubuntu, dwa monitory – disper, starcie drugie!

Wcześniej napisałem post o tym jak w prosty sposób zmieniać monitory w Ubuntu (i właściwie dowolnym Linuxie). Dzisiaj chciałbym rozwinąć nieco temat ponieważ samo łatwe zmienianie ekranu przestało mi wystarczać 😉

Sprawa wygląda następująco: Posiadam dwa monitory o różnej wielkości. System po uruchomieniu wykorzystuje tylko jeden monitor ze względu na to, że przez większość czasu i tak nie jest mi potrzebny drugi. No i nie zapominajmy o mniejszych rachunkach za prąd!

Problem

Gdyby oba monitory były takiej samej wielkości to na tym można by skończyć. Jest jednak inaczej. Dzisiaj po zainstalowaniu Cairo Dock postanowiłem sprawdzić jak poradzi sobie z dynamiczną zamianą monitorów. Okazało się, że nie najlepiej. Moje monitory wirtualnie skonfigurowane są następująco:

Generalnie utworzony jest jeden duży pulpit (2704 x 1050) i monitory są jedynie „oknami” do patrzenia na jego części. Z takim rozwiązaniem stowarzyszone są dwa podstawowe problemy:

  • kiedy myszką wyjedziemy w obszar szary znika ona z pola widzenia,
  • pasek zadań wyrównany do dołu i do lewej chowa się w szarej strefie i nie da się go obsługiwać.

Pierwszy problem może być uciążliwy jeśli na dole lewego monitora mamy pasek zadań. Trafienie w niego staje się nie lada wyzwaniem, ponieważ nie wystarczy tylko beztrosko przeciągnąć myszy w dół ekranu. Jeśli chodzi o ten drugi to sprawa wygląda jeszcze gorzej jeśli (tak jak w moim przypadku) pasek częściowo wychodzi jeszcze na większy monitor (po zmianie z jednego na dwa).

Jednak jeśli na dwóch monitorach wyłączyłem i uruchomiłem jeszcze raz Cairo Dock to ładnie rozkładał się on na lewym monitorze (można też skonfigurować go do uruchamiania na prawym). Jedyne co pozostało to po przełączeniu monitorów po prostu uruchomić ten program jeszcze raz. Ale zawsze robić to ręcznie? Nieeeee, przecież mamy Linuxa 😉

Rozwiązanie

Jak się okazuje, disper pozwala w katalogu ~/.disper/hooks  (gdzie ‚~’ to katalog domowy użytkownika) przechowywać haki, czyli skrypty lub programy, które wykona po zmianie rozdzielczości. Możemy utworzyć zatem prosty skrypt, który po prostu zabije proces Cairo Dock i później uruchomi go ponownie. Będzie on wyglądać pewnie tak:

#!/bin/bash
killall cairo-dock
cairo-dock &> /dev/null &

Oczywiście musi być umieszczony w katalogu ~/.disper/hooks i może się nazywać dowolnie. To jednak niestety nie wszystko. Trzeba jeszcze powiedzieć disperowi żeby uruchamiał ten plik po swoim działaniu. Robi się to dodając przy jego uruchamianiu parametr –plugins=user. Czyli program wywołamy na przykład tak:

disper -e --prefix=user

To rozwiąże nam problem paska. No ale oczywiście nie chcemy podawać tego parametru za każdym razem. Disper i tutaj wyszedł nam na przeciw. Możemy bowiem w jego pliku konfiguracyjnym znajdującym się w ~/.disper/config wpisać w każdej linii jeden parametr, który chcemy by był dodawany do każdego wywołania programu. Wystarczy zatem w konsoli wywołać polecenie:

echo "--prefix=user" >> ~/.disper/config

To tyle jeśli chodzi o sam pasek. Pozostaje jednak jeszcze problem myszy. Tutaj z pomocą przyjdzie nam inny program, o wiele mówiącej nazwie XCreateMouseVoid. Jego głównym (i jedynym) zastosowaniem jest tworzenie pojedynczego prostokątnego obszaru, do którego nie będzie można wjechać kursorem myszy. Pomysł jest zatem taki, żeby wypełnić całą szarą strefę takim właśnie obszarem. Wtedy miejsce dostępne do hasania kursorowi będzie odpowiadało temu co widzimy na monitorach i o to chodzi.

Aby program uruchomić należy go ściągnąć i skompilować. Sprawa jest jednak nadzwyczaj prosta i jak zwykle konsola sprawi, że życie jest przyjemniejsze:

sudo -i
(podajemy swoje hasło użytkownika)
apt-get install build-essential git
cd /opt
git clone https://github.com/cas--/XCreateMouseVoid.git
cd XCreateMouseVoid
make

I tyle. Teraz, żeby utworzyć przestrzeń wolną od ruchu kursora wystarczy wywołać program z odpowiednimi parametrami:

/opt/XCreateMouseVoid/XCreateMouseVoid 0 768 1024 1050

I teraz nie ma już problemów z uciekającym kursorem. Jedyne co pozostało to dodać powyższą linię do naszego skryptu w ~/.disper/hooks i wszystko załatwione. W razie gdyby przyszło mi do głowy później wykonywanie jakichś akcji przy przełączaniu monitorów rozwinąłem trochę skrypt do czegoś takiego:

#!/bin/bash
function common()
{
 killall XCreateMouseVoid
 killall cairo-dock 
 cairo-dock &> /dev/null &
}
function one()
{
 common
}
function two()
{
 common
 /opt/XCreateMouseVoid/XCreateMouseVoid 0 768 1024 1050 &> /dev/null &
}
function more()
{
 common
}
set $DISPER_DISPLAYS
if [ $DISPER_STAGE != "switch" ]; then
 exit 0;
fi
case "$#" in
 "1") one ;;
 "2") two ;;
 *) more ;;
esac

Ogólnie jego działanie jest dosyć proste. Za każdym razem gdy przełączamy monitory zabijane są XCreateMouseVoid i cairo-dock oraz uruchamiany jeszcze raz cairo-dock. Dodatkowo w przypadku gdy przełączamy w tryb dwóch monitorów tworzymy przestrzeń wyłączoną z ruchu kursora.

Myślę, że takie informacje będą pomocne wielu ludziom, którzy przychodzą tu z pytaniem o dwa monitory dla Ubuntu czy dowolnego innego Linuxa. Mi się na pewno przyda w razie gdybym kiedyś jeszcze tego potrzebował 😉

Ubuntu – dwa monitory na nowo

Po obejrzeniu statystyk oglądania mojego bloga zauważyłem, że znaczna większość odwiedzających przychodzi tu z zapytania „ubuntu dwa monitory”. Kiedyś pisałem już o tym ale tamto rozwiązanie jest już co najmniej nieaktualne. Dzisiaj istnieje o wiele lepsze rozwiązanie – stworzone z myślą o laptopach, ale ja sam używam go na komputerze stacjonarnym z dwoma monitorami.

Wspomniane rozwiązanie nazywa się disper i jego strona domowa znajduje się tutaj: http://willem.engen.nl/projects/disper/. Aktualnie najnowsza wersja opatrzona jest numerem 0.3.0, ale działa już bardzo poprawnie. Cały projekt napisany jest w pythonie więc nie ma problemów z kompilacją i miliardem zależności do rozwiązania. Cała instalacja składa się z upewnienia się, że mamy Pythona i narzędzie make. Możemy to zrobić na przykład tak:

$ sudo apt-get install build-essential python2.7

Następnie ściągamy, makeujemy i instalujemy najnowszą wersję dispera (w moim przypadku 0.3.0):

$ wget http://ppa.launchpad.net/disper-dev/ppa/ubuntu/pool/main/d/disper/disper_0.3.0.tar.gz
$ tar zxvf disper_0.3.0.tar.gz
$ cd dispercur
$ make
$ sudo make install

To tyle jeśli chodzi o instalację. Teraz jak tego używać? Zacznijmy może od wyświetlenia pomocy programu, która już sama mówi wszystko co trzeba wiedzieć:

$ disper -h

Jeśli bardziej lubisz czytać strony man lub info to też są dostępne.

Poniżej przedstawię podstawowe komendy dispera wraz z krótkim opisem:

  • disper -l  – powoduje wyświetlenie wszystkich dostępnych monitorów oraz ich rozdzielczości
  • disper -s – wykorzystywany jest jedynie pierwszy monitor
  • disper -S – wykorzystywany jest jedynie drugi monitor
  • disper -e – wykorzystane oba monitory, jeden z nich jest rozszerzeniem ekranu (xinerama)
  • disper -c – klonowanie obrazu – na obu monitorach jest to samo
  • disper -C – przełącza cyklicznie pomiędzy powyższymi trybami (coś jak Fn+Fx w laptopach [x to liczba od 1 do 12 😉 ] )

Dodatkowo możemy też wyeksportować nasze ustawienia do pliku:

$ disper -p > ekran.conf

Lub zaimportować te ustawienia:

$ cat ekran.conf | disper -e

Jedną poważną zaletą używania dispera jest to, że zmieniamy tryby graficzne i nie musimy restartować serwera Xów. To znaczy po prostu tyle, że uruchomione programy nie zostają ubite w tym procesie i po zmianie ekranu możemy po prostu pracować dalej.

Mam nadzieję, że ten wpis pomoże ludziom trafiającym tu codziennie z problemami dotyczącymi obsługi dwóch monitorów. Oczywiście disper będzie działał w dowolnym innym Linuxie. Wystarczy mieć pythona oraz make’a, a to jest wszędzie.

Z tym postem muszę stwierdzić z zadowoleniem (ale też z lekkim smutkiem), że czasy kiedy siedziało się tygodniami przed Linuxem, żeby coś w nim uruchomić powoli się kończą. Powoli 😉

PS. Jeśli kogoś interesuje dlaczego „z lekkim smutkiem” to spieszę z odpowiedzią. Otóż może i siedzenie i grzebanie było czasami nużące i frustrujące, ale ostateczny sukces dawał ogromny zastrzyk samozadowolenia 😉

[Aktualizacja]

W moim opisie przy instalacji były błędy. Z niewiadomych przyczyn po ściągnięciu paczki zupełnie pominąłem krok rozpakowywania i przejścia do katalogu źródeł. Dlatego niektórym prezentowane  rozwiązanie mogło nie działać! 😉

[Aktualizacja 2]

Dodałem nowy wpis o bardziej zaawansowanym wykorzystaniu narzędzia disper: https://moriturius.wordpress.com/2012/03/09/ubuntu-dwa-monitory-disper-starcie-drugie/