Mniej klikania — zarządzanie oknami klawiaturą

Jeśli pomyślę o wąskich gardłach w pracy z komputerem, jednym z większych jest klikanie. Ekran dotykowy odrobinę ułatwia sprawę, bo zajmuje mniej czasu, jest bardziej bezpośrednie. Z drugiej strony, czy to klikanie czy dotykanie ma jedną poważną wadę: żeby coś wybrać, musi być to jakoś reprezentowane na ekranie, na przykład przyciskiem, suwakiem, itp. To sprawia, że graficzne interfejsy są dla niektórych (na przykład dla mnie) zbyt rozpraszające uwagę i irytujące. Poza tym, skoro umiemy mówić i używać języka do wyrażania swoich potrzeb, czemu nie mielibyśmy używać tego do sterowania komputerem? Tym bardziej, że tekst znacznie bardziej sprzyja automatyzowaniu. Wystarczy spojrzeć na programowanie — graficzne języki programowania nigdy się nie przyjęły. Jedynie w wąskiej dziedzinie zadań klikanie/dotykanie działa znacznie lepiej, jak choćby malowanie czy rysowanie, tworzenie diagramów. Również tworzenie graficznych interfejsów użytkownika czy układów stron internetowych jest domyślnie realizowane w ten sposób, choć mnie to nie przekonuje. W większości przypadków wolę robić to w kodzie.

Szczególnie uciążliwym zadaniem może być zarządzanie oknami. Zwykle mamy co najmniej kilka okienek, często chcemy widzieć kilka na raz. Nic dziwnego, że programiści zazwyczaj mają kilka ekranów w środowisku pracy. Nie będę tutaj przekonywał, że zarządzanie oknami myszką jest irytujące (gdyby nie ALT+TAB…), tego trzeba doświadczyć poprzez spróbowanie lepszego rozwiązania.

Co to jest zarządca okien?

Takie rozwiązanie istnieje, choć nie jest zbyt popularne (biorąc pod uwagę jego wygodę). Mianowicie chodzi o kafelkowe zarządzanie oknami (Tiling Window Managers). Mniej obeznanym ze światem *nix wyjaśnię pokrótce kluczowe pojęcie: zarządca okien (Window Manager). Windows jest monolitem (nawet Internet Explorer był długi czas integralną częścią systemu). W świecie *nix, system jest zbudowany z mniejszych części — jądro osobno, silnik graficzny (X Windows) osobno, każda aplikacja osobno. Jednak X Windows pozwala tylko wyświetlić okno, obsłużyć wyjątki. Tym, żeby rozmieścić okienka na ekranie, dorobić im ramki czy paski tytułowe, zajmuje się właśnie zarządca okien. Kto bardziej interesował się Linuksem, pewnie wypróbował ich co najmniej kilka.

Zarządcę okien, który dorabia paski tytułowe i pozwala przy ich pomocy przemieszczać okna nazywamy stosowym zarządcą okien (stacking window manager). Jest to dominujące rozwiązanie, jest na Windowsach, w popularnych środowiskach: KDE, GNOME, XFCE. Do takich zarządców okien należą też FVWM (chyba najbardziej rozbudowany WM), TWM (domyślny, bardzo ograniczony), Window Maker (próba odtworzenia środowiska NeXTSTEP — owocu wylania Steve'a Jobsa z Apple, na tym systemie powstał DooM) czy fluxbox.

Kafelkowy zarządca okien

Inne odejście polega na tym, że domyślnie myszka nie jest używana do rozmieszczania okien na ekranie (zwykle można odstąpić od tej reguły, na wypadek takich programów jak Gimp, które nie za dobrze to znoszą).

Wybór jest tu stosunkowo niewielki — możemy rozciągnąć okno na cały ekran albo podzielić na dwie części. Potem każdą część można podzielić na mniejsze, i tak dalej.

Za pomocą skrótów klawiszowych, możemy dowolnie zmieniać układ. Na przykład, możemy przez większość czasu mieć jedno okno rozciągnięte na cały ekran i tylko w razie potrzeby podzielić ekran na pół (na przykład żeby zerknąć w dokumentację) albo przełączyć okno. Dla ułatwienia, przeważnie okna są grupowane, zwykle zadaniami. Jeśli dzielimy ekran lub przełączamy okno, to zwykle brane są pod uwagę tylko okna z danej grupy.

Powyższe zasady są standardem, który można znaleźć w praktycznie każdej implementacji. To już wystarczy, żeby znacznie sobie ułatwić pracę, nie mieć więcej problemów ze zbyt dużą ilością okienek. Jeśli jednak chcemy, nic nie stoi na przeszkodzie, żeby zaimplementować bardziej złożone reguły, tym bardziej, że zwykle mamy kod źródłowy, a istnieją implementacje w bardzo różnych językach, a zaimplementowanie szczególnych reguł dla poszczególnych okien (czy grup okien) nie jest bardzo skomplikowane, jeśli wiemy co chcemy osiągnąć.

Różne implementacje

Jeszcze do niedawna, takie rozwiązania były głównie na X Window System (Linux, *BSD, Mac), trudno było znaleźć implementację na Windows. Jak widzę, sytuacja się zmieniła i na Windowsie też są jakieś rozwiązania. Jednak trudno mi powiedzieć, nie używam. Co się tyczy Xów, mamy pierdyliard różnych implementacji z otwartym kodem źródłowym. Różnią się one podejściem do problemu, poziomem rozbudowania i co chyba najważniejsze, sposobem konfiguracji.

Na pewno warte uwagi są takie rozwiązania jak xmonad czy stumpwm, które są konfigurowane w języku w którym zostały napisane — odpowiednio Haskell i Common Lisp. Również ciekawy jest awesome, jego podstawy są napisane w C, lecz większość logiki i konfiguracja zrealizowane są w Lua. Najlepszą nazwę ma zdecydowanie ratposion. :) Nic mi nie wiadomo, żeby były implementacje w Javie, C# czy Pythonie. Cóż to znaczy? Myślę, że to związane z tym, że podejście proceduralne nie za bardzo pasuje do problemu; a może po prostu (póki co), takie rozwiązania stosują tylko hakerzy wagi ciężkiej. :-)

dwm

Ktoś mógłby pomyśleć, że w związku z moją sympatią dla Common Lispu używam stumpwm. Jednak Common Lisp znam od niedawna. Kiedy wchodziłem w temat, moim ulubionym językiem był C, a najważniejszą dla mnie zasadą było KISS (keep it simple, stupid). dwm jest właśnie napisany w C, a KISS jest jego filozofią.

dwm ma tylko  2800 linijek kodu całkiem niezłej jakości, bardzo szybko się w nim zorientowałem i nauczyłem dostosowywać. Taka z resztą jest idea projektu, cała konfiguracja jest w kodzie. Żeby nie być gołosłownym, podam przykład. Zmiana układu klawiatury jest dla mnie rzeczą podstawową, bo na co dzień piszę po rosyjsku. Oczywiście dwm tego nie wspiera. To jednak, żaden problem, tu jest cała implementacja. 28 linijek dodanych na 4 usunięte. Myślę, że to niezły wynik.

Inny przykład, domyślnie, na pasku widnieje wersja dwm-a (jak na zrzucie powyżej). Ta zmiana umieszcza tam datę i godzinę. 12/3 linijek. Też nieźle.

Zdecydowanie polecam dwm komuś kto chce się nauczyć języka C, to bardzo dobry program. Choć może funkcje są czasem zaimplementowane dość nieczytelnie, ale uporządkowanie całości nadrabia i pomaga zrozumieć te niejasne kawałki.

Poza tym, dwm jest bardzo lekki. Obecnie pracuję na bardzo starym sprzęcie: Celeron M 1.6GHz, jednordzeniowy, 512MB RAMu (wiecie jak trudno znaleźć jakiś dobry, 32-bitowy system operacyjny? Został mi praktycznie tylko stary dobry Slackware, inne albo sprawiają problemy albo już nie ma binarek). Nawet XFCE się na tym tnie. Dzięki dwm, komputer działa bardzo dobrze (lepiej niż niejedna nówka na Windowsie czy GNOME/KDE), przynajmniej dopóki się nie otworzy nieodpowiedniej strony w przeglądarce (co się stało z tą siecią?).

Podstawowa wersja nie pozwala na wiele, jednak mi to wystarcza (choć ostatnio interesuję się Prologiem, myślałem, żeby dorobić w nim kilka bajerów :)). Mamy konfigurowalną ilość obszarów roboczych, w każdej chwili możemy przenieść dowolne okno do innego obszaru. Gdy dzielimy ekran, najpierw jest dzielony na pół (pionową linią), potem te są dzielone poziomymi liniami. Możemy zmieniać liczbę okien po lewej i prawej, dzięki czemu możemy również uzyskać podział poziomą linią. Dodatkowo możemy danemu programowi przypisać domyślny obszar roboczy. I tyle, wystarczy, To z resztą jeszcze jeden powód, żeby używać dwm. W innych implementacjach musiałbym rozkminiać jakie to API mi przygotowali dla konfiguracji. Tu mam parę skrótów na krzyż i tyle. Co będę chciał sobie dopiszę.

Podsumowując

Używam kafelkowego zarządzania oknami od dawna (z przerwami) i jest to bardzo wygodne rozwiązanie. Zwłaszcza po powrocie po jakimś czasie bardzo sobie cenię tę zmianę. Żadnego chaosu z oknami, każde okno mogę szybko przywołać, jeśli chcę mogę mieć kilka widocznych na raz. To duże ułatwienie. Poza tym, dwm stanowi dla mnie świetną podstawę do tworzenia środowiska pracy. Pozwala mi szybko ustawić skróty klawiszowe (znacznie szybciej niż w, pożal się Boże, graficznych konfiguratorach takich rozwiązań jak XFCE) i sposób zarządzania oknami, bez zbędnych funkcji, wkurzających ikonek, itp.