V minulém dílu jsem dokončil ukázku uživatelské konfigurace WM Qtile a od dnešního dílu se přesunu na dalšího zástupce dlaždicových WM v pořadí – Dwm. Ten jsem již krátce představil a předvedl. Bylo to ale ve standardní konfiguraci, pouze na základě instalace z balíčků distribuce. V tomto případě je vlastní spustitelný soubor uložen v adresáři /usr/bin. Aby bylo možné Dwm uživatelsky konfigurovat, je potřeba někde vzít konfigurační soubor. Jak už jsem dříve uvedl, od ostatních zmíněných WM se Dwm liší hlavně v tom, že se u něj konfigurace provádí přímo ve zdrojovém, resp. hlavičkovém souboru. Změny se pak do aplikace promítají prostřednictvím běžného překladu programu v jazyce C. To má samozřejmě svoje výhody i nevýhody, ale je to prostě holý fakt. V základní instalované verzi žádné zdrojové soubory nejsou k dispozici, takže je nutné stáhnout celý balíček z webu Suckless DWM
Aktuální je balíček s označením dwm-6.1.tar.gz z roku 2015 o velikosti necelých 26 kB. Tento archiv se někam rozbalí a na obrázku je vidět obsah celého adresáře
Jak je z obrázku zřejmé, je zde k dispozici celkem patnáct souborů, z nichž čtyři jsou spíše informativní (BUGS, LICENSE, README, TODO). Ostatní jsou pak soubory, které mají nějaký smysl pro překlad dané aplikace. Při bližším zkoumání souboru README se zájemcům dostane velmi stručných informací o další možné činnosti:
- pro úspěšný překlad je v systému nutné mít k dispozici hlavičkové soubory knihovny Xlib
- při překladu se spustitelná aplikace ukládá do adresáře /usr/local
- samotný překlad se provádí příkazem
make clean install
- nově přeložený WM se pak spustí příkazem pro odlišení od stávající verze z distribučních balíčků
exec /usr/local/bin/dwm
- stavové informace je možné zobrazit v panelu pomocí aplikace xsetroot
- konfigurace se provádí vytvořením a úpravou souboru config.h a následným překladem aplikace
Jak je z předchozího obrázku a popisu jasně patrné, žádný takový soubor pro konfiguraci ale v balíčku není. Tedy alespoň na první letmý pohled. Na druhý pohled už je to lepší a tento soubor ve standardním tvaru je možné vytvořit velmi jednoduše:
cp $HOME/Dokumenty/dwm-6.1/config.def.h $HOME/Dokumenty/dwm-6.1/config.h
Jeho standardní verzi dávám do přílohy
Při pohledu do útrob nového konfiguračního souboru je možné zjistit několik věcí:
- jedná se o běžný hlavičkový soubor jazyka C
- konfigurace se nastavuje pomocí deklarací statických proměnných
- soubor má celkem 112 řádků včetně těch prázdných a nápovědy
- určitá základní konfigurace je již nastavená
Konfiguraci nebudu zatím podrobněji rozebírat a nechám to na později. Teď by asi bylo dobré si vyzkoušet prvotní překlad ve standardní konfiguraci a nově vytvořený WM zkušebně spustit. K překladu je nutné v příslušném adresáři otevřít terminál a spustit příslušný příkaz pro překlad. Ten bude ale vypadat trochu jinak, než je v nápovědě. Vzhledem k tomu, že se soubor instaluje do systémových adresářů, je nutné přidat administrátorské oprávnění:
sudo make clean install
Jak je ale patrné z dalšího obrázku, první krok se velmi nepodařil a skončil chybou:
To je sice při standardní konfiguraci a aktuálních souborech z webu projektu divné, ale bohužel reálné. Náprava je naštěstí rychlá a jednoduchá:
- je nutné otevřít soubor config.mk
- najít v něm řádek č. 21
- zakomentovat příslušný příkaz FREETYPEING=${X11ING}/freetype2, který se vztahuje pro překlady na systému OpenBSD
- změny uložit
- výsledek je vidět na dalším obrázku
Následný pokus o překlad bude již přes několik varování úspěšný – viz obrázek. Další obrázek dokazuje, že spustitelný soubor je na svém místě (jak to ostatně hlásí i komentáře k překladu):
Pak už nezbývá, než do příslušné sekce iniciačního souboru $HOME/.xinitrc provést přesměrování na nový spustitelný soubor a zkusit novou verzi WM spustit:
dwm) exec /usr/local/bin/dwm ;;
Na dalším obrázku je jasně vidět, že spuštění bylo úspěšné
Aby byl důkaz ještě přesvědčivější, tak provedu v konfiguraci dvě velmi jednoduché změny. Jak je z obrázku patrné, je zde k dispozici celkem devět tzv. tagů. Je to něco jako pracovní plochy v jiných WM, ale ne zase tak úplně. Pro účely článku ale toto srovnání úplně postačí. Tagy jsou v Dwm definovány jako proměnná tags. Změny je samozřejmě možné provádět i na „živém“ Dwm, takže uvedu jenom několik standardních klávesových zkratek pro důležité akce:
- otevření spouštěče aplikací dmenu – Alt+P
- otevření terminálu st – Alt+Shift+Enter
- zavření aktuálního okna – Alt+Shift+C
- ukončení dwm – Alt+Shift+Q
Změny v konfiguraci budou pouze dvě (stačila by jenom jedna, ale bude lepší z konfigurace odstranit, co je tam zbytečné). První bude spočívat v úpravě příslušné sekce definice proměnné tagů:
/* tagging */ static const char *tags[] = { "1", "2", "3" };
Druhá pak bude spočívat ve smazání zbytečných definic pro přechod do již neexistujících tagů (čísla 3–8). V konfiguraci pak zůstanou jenom tři definice:
TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2)
Změny se uloží, provede se nový překlad, ukončení a nový start Dwm. Pozitivní výsledek ukazuje další obrázek
Jak je možné si všimnout, pro přechody mezi tagy jsou (podobně jako třeba u Spectrwm) použity klávesy číslic, konkrétně těch, které se nacházejí v horní řadě klávesnice s diakritickými znaky. Jejich použití není úplně ideální, takže opět použiju již dříve uvedenou náhradu – funkční tlačítka F1-F3. Aby bylo možné tato tlačítka použít, je nutné udělat dvě změny. První z nich bude v souboru dwm.c. Tam je nutné přidat jeden řádek pro zahrnutí jednoho konkrétního hlavičkového souboru do kódu mezi ostatní podobné příkazy:
#include <X11/XF86keysym.h>
Druhá změna pak bude provedena samozřejmě v konfiguračním souboru config.h:
TAGKEYS( XK_F1, 0) TAGKEYS( XK_F2, 1) TAGKEYS( XK_F3, 2)
Provede se nový překlad, ukončení a opětný start Dwm a je možné si vyzkoušet hned čtyři různé varianty manipulace s tagy a okny v nich. Tedy přesněji řečeno: bylo by to možné, kdyby nebylo nastavení takové, jako aktuálně je. Možná to někoho nemusí na první pohled napadnout (a já se mezi takové „hrdě“ hlásím), ale kombinace kláves Ctrl+Alt+F2 nedělá spuštěnému grafickému prostředí libovolného typu zrovna moc dobře! Bude proto nutné před samotnou zkouškou udělat pár dílčích změn, které souvisejí s nastavením modifikátorů. Jak už asi vyplynulo z minulých příkladů, hlavním modifikátorem je klávesa Alt. Celou operaci je možné provést ve dvou krocích:
- deklarace všech potřebných modifikátorů, resp. čtyř základních:
#define MOD Mod4Mask #define ALT Mod1Mask #define CTRL ControlMask #define SHIFT ShiftMask
- náhrada všech stávajících názvů modifikátorů jejich novými verzemi, nejlépe s pomocí textového editoru
Klávesa Alt sice není v aktuální konfiguraci využita, ale pro další použití se bude hodit. Nyní ale jenom uložím změny a zkusím nový překlad. Pokud se případným experimentátorům nevloudila nějaká nečekaná, nezvaná chybička, překlad by měl proběhnout bez problémů. Pokud by tomu bylo jinak, překladač samozřejmě vyhodí nějakou chybovou hlášku, ze které lze většinou velmi dobře odhadnout problém. Ještě než se vrátím zpět k tagům, tak ještě změním několik příkazů a jim přiřazených klávesových zkratek:
místo původního použitého terminálu st nastavím lilyterm
static const char *termcmd[] = { "lilyterm", NULL };
spuštění Dmenu nastavím na Win+Alt+P
{ MOD|ALT, XK_p, spawn, {.v = dmenucmd } },
spuštění terminálu nastavím na Win+Alt+Enter
{ MOD|ALT, XK_Return, spawn, {.v = termcmd } },
zavření aktivního okna nastavím na Win+Ctrl+X
{ MOD|CTRL, XK_x, killclient, {0} },
ukončení Dwm nastavím na Win+Ctrl+Q
{ MOD|CTRL, XK_q, quit, {0} },
Nyní už je možné se vrátit k práci s tagy. Definici kláves (F1 – F3) jsem uvedl výše v textu, takže zbývá pouze nová verze definice akcí, které jsou k tagům přímo vázané:
#define TAGKEYS(KEY,TAG) \ { MOD, KEY, view, {.ui = 1 << TAG} }, \ /*1*/ { MOD|CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ /*2*/ { MOD|SHIFT, KEY, tag, {.ui = 1 << TAG} }, \ /*3*/ { MOD|CTRL|SHIFT, KEY, toggletag, {.ui = 1 << TAG} }, /*4*/
Ke každému řádku/příkazu bude vhodné uvést jeho funkci:
- Win+F1/F2/F3 – přesun na vybraný tag (1/2/3)
- Win+Ctrl+F1/F2/F3 – pokud se použije jako poslední tlačítko vybraného tagu, který obsahuje alespoň jedno otevřené okno, všechna tato okna se zobrazí (nejedná se o jejich přesun!) v aktuálním tagu. Pokud se okno zavře na libovolném tagu, automaticky se zavře na všech, kde je otevřené
- Win+Shift+F1/F2/F3 – přesune aktivní okno na vybraný tag. Kurzor zůstává na původním tagu
- WinCtrl+Shift+F1/F2/F3 – otevře aktivní okno (opět se nejedná o přesun, ale jakousi „kopii“) na vybraném tagu. Pokud se okno zavře na libovolném tagu, automaticky se zavře na všech, kde je otevřené
Zde je asi trochu vidět potvrzení, uvedené výše v textu: tagy nejsou přesně to samé, co pracovní plochy a proto je možné s nimi dělat různé roztodivnosti… Než pokročím dále v manipulaci s okny, bylo by asi vhodné se zmínit o systému, který Dwm pro správu oken používá (tzv. Window model). Na obrazovce/monitoru jsou vlastně tři oblasti: panel (tím se zatím nebudu zabývat), hlavní a stohovací oblast (master+stack). Už to bylo zmíněno v předchozích dílech, takže je toto uspořádání celkem běžné. Hlavní oblast je standardně vlevo, stohovací napravo. Nové okno aplikace se vždy otevře v hlavní oblasti a to, které zde bylo předtím se přesune to stohovací oblasti. To by asi na vysvětlenou stačilo a mohu se vrátit ke změněné konfiguraci:
{ MOD, XK_Right, focusstack, {.i = +1 } }, { MOD, XK_Left, focusstack, {.i = -1 } }, { MOD, XK_Up, incnmaster, {.i = +1 } }, { MOD, XK_Down, incnmaster, {.i = -1 } }, { MOD, XK_Prior, setmfact, {.f = -0.05} }, { MOD, XK_Next, setmfact, {.f = +0.05} }, { MOD, XK_Return, zoom, {0} }, { MOD, XK_Tab, view, {0} },
Klávesové zkraty mají následující funkce:
- WIN+šipka vpravo – přesune kurzor na následující otevřené okno
- Win+šipka vlevo – přesune kurzor na předchozí otevřené okno
- Win+šipka nahoru – změní rozložení oken z vertikálního na horizontální
- Win+šipka dolů – vrátí zpět rozložení oken na vertikální
- Win+PageDown – zvětší hlavní oblast na úkor té stohovací
- Win+PageUp – zvětší stohovací oblast na úkor té hlavní
- Win+Enter – přesune aktivní okno ve stohovací oblasti do oblasti hlavní
- Win+Tab – přesune kurzor na předchozí aktivní tag, prohazuje tak vlastně dva poslední aktivní tagy
To už by pro dnešní díl stačilo a více si toho o možnostech manipulace s tagy a okny aplikací nechám na díl příští.
Dnešní díl jsem věnoval popisu získání a překladu zdrojových souborů Dwm. Kromě toho jsem ukázal principy změn v konfiguračním souboru včetně nastavení tagů a klávesových zkratek. Na základě toho bylo možné provést ukázku způsobu spouštění aplikací pomocí klávesových zkratek, ovládání tagů a manipulace s otevřenými okny aplikací. V příštím dílu se zaměřím na dokončení konfigurace správy tagů a oken. Dále proberu konfiguraci stylů rozložení oken a jejich ovládání. Na závěr pak dokončím konfiguraci spouštění základní sady uživatelských aplikací a nastavení parametrů spouštěných aplikací. Zmíněny budou i možnosti ovládání prostředí pomocí myších tlačítek.