Desktop bez gryzonia? To możliwe!

23 komentarze

Zapewne większość miłośników edytorów tekstów takich jak Vim, czy emacs, a także wyznawcy wyższości CLI nad GUI, przyzna, że klawiatura jest znacznie szybsza, a jeśli się człowiek przyzwyczai, wygodniejsza od myszki. Ciężko jednak wyeliminować z środowiska graficznego użycie myszy. Nic bardziej mylnego, mając odpowiednie narzędzia można bez problemu używać Xów bez myszki, ani jej emulacji. Pomijając kilka dziedzin, w których raczej myszkę ciężko zastąpić(u mnie chyba tylko edytor grafiki, GIMP). W tym artykule przedstawię zarządcę okien sterowanego klawiaturą - awesome.

Już bardzo dawno mysz zadomowiła się w systemach biurkowych. Nic dziwnego, przesuwanie okien "chwytając" je kursorem myszy i wciskanie nim przycisków jest bardzo intuicyjne. Być może gdyby nie wymyślono myszy, komputery nie byłby tak powszechne. Istnieje jednak pewna grupa ludzi myśli w trochę innych kategoriach. Owocem takiego myślenia jest pomysł na zarządzanie oknami bez użycia myszy.

Pierwszą, rzeczą jaka przychodzi na myśl(przynajmniej mi przyszła;)), słysząc o zarządcy okien sterowanym klawiaturą, to "Jak to, do cholery, możliwe?". Rozwiązanie jest bardzo proste. Wystarczy, że rozmieszczeniem i zmianą rozmiarów okien zajmie się program, pozostałe rzeczy można zrobić klawiaturą, nawet w "klasycznych" środowiskach. W praktykce wygląda to mniej więcej tak:
Free Image Hosting at www.ImageShack.us

Wbrew pozorom istnieje dość sporo takich programów: ratpoison, Ion, wmii, dwm, awesome. W tym tekście skupię się na tym ostatnim. Myślę, że każdy sobie poradzi z instalacją tego programu(jeśli nie ma go w repo twojej dystrybucji :poszukaj na freshmeat), więc przejdę od razu do rzeczy.

Podobnie jak w przypadku większości programów open source, kluczem do sukcesu jest dobra konfiguracja, którą przeprowadzamy poprzez edycję pliku ~/.awesomerc . Jego struktura jest dość prosta i można bardzo łatwo ją zrozumieć, próbując przy niej majstrować i posiłkować się manem. Jednakże, aby ułatwić Ci sprawę, przedstawię mój plik konfiguracyjny awesome i pokrótce wyjaśnię, o co chodzi. Nie będę się wdawał w zbędne szczegóły, bo o co chodzi, każdy widzi. Chyba jedyny szczegół, jaki wypada nadmienić to występujący klawisz Mod4. Jego definicja jest kwestią konfiguracji X11, w najpopularniejszych u nas klawiaturach Microsoft będzie to logo Windows. Swoją drogą, bardzo fajnie, że znajduje on wreszcie jakieś logiczne zastosowanie. :)

Mój plik konfiguracyjny składa się z trzech sekcji(jest ich więcej, jednakże nie odczułem potrzeby zgłębiania ich zastosowania :)). Pierwszą z nich jest sekcja screen:

screen 0
{
    styles
    {
        normal
        {
            font = "sans 8"
            fg = "#dddddd"
            bg = "#444444"
            border = "#555555"
        }
        focus
        {
            fg = "#000000"
            bg = "#535d6c"
            border = "#535d6c"
        }
        urgent
        {
            fg = "#111111"
            bg = "#ff4500"
        }
    }
    tags
    {
        tag one { }
        tag two { }
        tag three { }
        tag four { }
        tag five { }
        tag six { }
        tag seven { }
        tag eight { }
        tag nine { }
    }
    layouts
    {
#        layout tile { image = "/usr/share/awesome/icons/layouts/tilew.png" }
#        layout tileleft { image = "/usr/share/awesome/icons/layouts/tileleftw.png" }
        layout tilebottom { image = "/usr/share/awesome/icons/layouts/tilebottomw.png" }
#        layout tiletop { image = "/usr/share/awesome/icons/layouts/tiletopw.png" }
#        layout max { image = "/usr/share/awesome/icons/layouts/maxw.png" }
#        layout spiral { image = "/usr/share/awesome/icons/layouts/spiralw.png" }
#        layout dwindle { image = "/usr/share/awesome/icons/layouts/dwindlew.png" }
#        layout floating { image = "/usr/share/awesome/icons/layouts/floatingw.png" }
    }
    statusbar mystatusbar
    {
        position = "top"

        taglist mytaglist
        {
            mouse
            {
                button = "1"
                command = "tag_view"
            }
            mouse
            {
                button = "1"
                modkey = {"Mod4"}
                command = "client_tag"
            }
            mouse
            {
                button = "3"
                command = "tag_toggleview"
            }
            mouse
            {
                button = "3"
                modkey = {"Mod4"}
                command = "client_toggletag"
            }
            mouse
            {
                button = "4"
                command = "tag_viewnext"
            }
            mouse
            {
                button = "5"
                command = "tag_viewprev"
            }
        }
        layoutinfo mylayoutinfo
        {
            mouse
            {
                button = "1"
                command = "tag_setlayout"
                arg = "+1"
            }
            mouse
            {
                button = "4"
                command = "tag_setlayout"
                arg = "+1"
            }
            mouse
            {
                button = "3"
                command = "tag_setlayout"
                arg = "-1"
            }
            mouse
            {
                button = "5"
                command = "tag_setlayout"
                arg = "-1"
            }
        }
        tasklist mytasklist{}
        iconbox logo
        {
            image = "/usr/share/awesome/icons/awesome16.png"
            mouse
            {
                button = "1"
                command = "spawn"
                arg = "exec xterm -e man awesome"
            }
        }
    }

Na samym początku mamy podsekcję styles, zostawiłem wartości domyślne. Dalej mamy podsekcję "tags". Zawiera ona listę tagów, czyli po prostu pulpitów.

Dalej, w kolejności jest podsekcja layouts. Opisuje ona sposoby rozmieszczania okien. Jak można zauważyć, owe sposoby definiuje się poprzez utworzenie odpowiedniego obrazka. Można również je przełączać(standardowo Mod4 + spacja), jednakże zakomentowałem wszystkie oprócz jednego, moim zdaniem najwygodniejszego układu, w którym główne okno(względnie okna) znajduje się u góry, a pozostałe, mniejsze są rozmieszczane poniżej. Szczerze powiedziawszy jest to nawet lepsze od tacki systemowej, bo nie zajmuje wiele miejsca, a za to przekazuje więcej informacji.

Dalej mamy sekcję "statusbar", dotyczącą cosia, w innych środowiskach zwanego panelem. Pozostawiłem wartości domyślne, bo w zasadzie nic poza listą tagów, listą layoutów i listą okien, nie jest mi na tyle potrzebne, żeby chciało mi się wystarczająco zagłębić w dokumentacji. :) Nie mam więc zegarka, jest to trochę problematyczne, ale rozwiązałem to uruchamiając na starcie xclocka, tak żeby pokazywał godzinę i datę w prawym-dolnym rogu. Dla mniej zaznajomionych w użyciu tego programu podaję wiersz polecenia dla cyfrowego zegara w formacie "dzień tygodnia, dzień.miesiąc.rok(2 cyfry) godzina:minuty", dla rozdzielczości 1280x1024:

xclock -geometry 170x30+1110+994 -d -twentyfour -strftime "%a,%d.%m.%y %H:%M"

Dalej mamy sekcję rules. Dotyczy ona wyjątkowych właściwości dla niektórych programów. W moim przypadku ogranicza się do wskazania, które okna mają "pływać", czyli nie podlegać layoutowi:

rules
{
    rule { name = "Gimp" float = true }
    rule { name = "MPlayer" float = true }
    rule { name = "Acroread" float = true }
    rule { name = "pinentry" float = true }
    rule { name = "xclock" float = true }
}

Ostatnią i chyba najważniejszą sekcją, jest sekcja keys, definiująca skróty klawiszowe:

keys
{
    key
    {
        modkey = {"Mod4"}
        key = "F1"
        command = "spawn"
        arg = "exec xfrun4"
   } 
    key
    {
        modkey = {"Mod4"}
        key = "F2"
        command = "spawn"
        arg = "ls .menu-items | awesome-menu -e \"exec ~/.menu-items/\""
    }
    key
    {
        modkey = {"Mod4"}
        key = "F3"
        command = "spawn"
        arg = "mpc toggle"
    }
    key
    {
       modkey = {"Mod4"}
       key = "F4"
       command = "spawn"
       arg = "exec xterm -e \"mpc&&sleep 2\""
    }
    key
    {
        modkey = {"Mod4"}
        key = "F5"
        command = "spawn"
        arg = "exec ario"
    }
    key
    {
        modkey = {"Mod4"}
        key = "Return"
        command = "spawn"
        arg = "exec ~/.menu-items/Terminal"
    }
    key
    {
        modkey = {"Mod4"}
        key = "space"
        command = "tag_setlayout"
        arg = "+1"
    }
    key
    {
        modkey = {"Mod4", "Shift"}
        key = "space"
        command = "tag_setlayout"
        arg = "-1"
    }
    key
    {
        modkey = {"Mod4"}
        key = "b"
        command = "statusbar_toggle"
    }
    key
    {
        modkey = {"Mod4"}
        key = "Right"
        command = "client_focusnext"
    }
    key
    {
        modkey = {"Mod4"}
        key = "Left"
        command = "client_focusprev"
    }
    key
    {
        modkey = {"Mod4", "Shift"}
        key = "Right"
        command = "client_swapnext"
    }
    key
    {
        modkey = {"Mod4", "Shift"}
        key = "Left"
        command = "client_swapprev"
    }
    key
    {
        modkey = {"Mod4"}
        key = "p"
        command = "tag_setmwfact"
        arg = "-0.05"
    }
    key
    {
        modkey = {"Mod4"}
        key = "o"
        command = "tag_setmwfact"
        arg = "+0.05"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "p"
        command = "tag_setncol"
        arg = "+1"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "o"
        command = "tag_setncol"
        arg = "-1"
    }
    key
    {
        modkey = {"Mod4"}
        key = "z"
        command = "tag_viewprev"
    }
    key
    {
        modkey = {"Mod4"}
        key = "x"
        command = "tag_viewnext"
    }
    key
    {
        modkey = {"Mod4"}
        key = "m"
        command = "client_togglemax"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "Return"
        command = "client_zoom"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "space"
        command = "client_togglefloating"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "c"
        command = "client_kill"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "q"
        command = "quit"
    }
    key
    {
        modkey = {"Mod4", "Control"}
        key = "r"
        command = "restart"
    }
    key
    {
       modkey = {"Mod4"}
       key = "0"
       command = "tag_view"
    }
    keylist
    {
        modkey = {"Mod4"}
        command = "tag_view"
        keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
        arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
    }
    keylist
    {
        modkey = {"Mod4", "Shift"}
        command = "client_tag"
        keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
        arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
    }
    keylist
    {
        modkey = {"Mod4", "Control"}
        command = "client_toggletag"
        keylist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
        arglist = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
    }
}

Myślę, że nie trudno zrozumieć zapis. Jedynie komendy mogą być nieco nie jasne, dlatego wyjaśnię kolejne skróty:

  1. Mod4+F1 - uruchamia xfrun4, czyli pochodzące z xfce4 "uruchom...". (byłbym wdzięczy jeśli ktoś by wskazał narzędzie tego typu spoza konkretnego środowiska).
  2. Mod4+F2 - uruchamia menu awesome'a. Jak widać listę komend ustala się w wierszu polecenia. W tym przypadku owa lista składa się z dowiązań/skryptów utworzonych w katalogu ~/.menu-items .
  3. Mod4+F3 - włącza/wyłącza muzykę(dla użytkowników MPD).
  4. Mod4+F4 - wyświetla obecnie odtwarzany utwór(również dla MPD)
  5. Mod4+F5 - uruchamia ario - mojego ulubionego klienta MPD.
  6. Mod4+Enter - uruchamia terminal. Tu xterm z czarnym tłem i białą czcionką kurierową
  7. Mod4+Space - następny layout. Zostawiłem tak na wszelki wypadek.
  8. Mod4+Shift+Space - poprzedni layout
  9. Mod4+b - włacza/wyłącza panel.
  10. Mod4+Strzałka_w_lewo/Strzałka_w_prawo - skupia się na poprzednim/następnym oknie
  11. Mod4+Shift+Strzałka_w_lewo/Strzałka_w_prawo - przenosi obecne okno o pozycję w lewo/prawo na liście otwartych okien, co skutkuje zmianą głównego okna.
  12. Mod4+o/p - zwiększa/zmniejsza przestrzeń zajmowaną przez główne okno
  13. Mod4+Control+o/p - zwiększa/zmniejsza liczbę kolumn w których układane są okna.
  14. Mod4+z/x - przełącza na poprzedniego/następnego taga
  15. Mod4+m - maksymizuje okno(i odwraca ten proces).
  16. Mod4+Control+Enter - sprawia, że aktywne okno staje się głównym oknem
  17. Mod4+Control+Space - włącza/wyłącza "pływanie" aktywnego okna.
  18. Mod4+Control+c - zamyka okno.
  19. Mod4+Control+q - zamyka awesome.
  20. Mod4+Control+r - uruchamia ponownie awesome.
  21. Mod4+0 - sprawia, że pokazywane są okna ze wszystkich tagów
  22. Mod4+cyferki_1_-_9 - przełączają na kolejne tagi
  23. powyższe z shiftem - przenosi okno na konkretnego taga
  24. poprzednie z controlem - sprawia, że aktywne okno pojawi się również w konkretnym tagu(i odwraca ten proces).

To wszystko, taki stan rzeczy mnie w pełni satysfakcjonuje i sprawia, że niechętnie sięgam po gryzonia, w związku z czym programy też obsługuję klawiaturą, co z kolei sprawia, że pracuje się szybciej. W przyszłości być może będę drążył ten temat. :)