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:

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:
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. :)