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ł 😉

Reklamy