Hlavní navigace

Suckless: dynamický správce oken dwm

30. 12. 2013
Doba čtení: 5 minut

Sdílet

Součástí projektu Suckless, který vyvíjí méně smradlavý software, je i Dwm. Jde o minimalistický dlaždicový správce oken (tiling window manager), který se konfiguruje změnou zdrojového kódu a jeho počet řádků kódu je shora omezen na 2000. Jde o vlajkovou loď Suckless komunity a považuje se za dokončený.

Předchůdci dwm: wmi a wmii

Správce oken dwm pochází ze Suckless dílny a předcházeli mu dva projekty. Prvním byl správce oken wmi. Hlavním autorem wmi, stejně jako wmii i dwm je Anselm R. Garbe. Poslední vydání wmi bylo v roce 2004 a od té doby bylo plně nahrazeno projektem wmii a později pak projektem dwm. Wmii bylo vyvíjeno mezi lety 2005 a 2012 a nyní se považuje za mrtvý projekt. Wmii se vyznačovalo použitím myšlenek ze systému Plan 9, například použitím souborového systému pro interakci s uživatelem. Nakonec se ale ukázalo, že vyvíjet software s myšlenkami Plan 9 na GNU/Linux systémech není vhodné a kód se příliš zkomplikoval. Garbe se tedy rozhodl to zkusit ještě jednou, tentokrát ještě jednodušeji než předtím.

Správce oken dwm

Správce oken dwm je velmi minimalistický. O tom svědčí například to, že nepoužívá žádný konfigurační soubor s nějakou syntaxí, ale konfiguruje se úpravou hlavičkového souboru. Dalším rysem ukazující na minimalismus je rozhodnutí vývojářů nikdy nepřekročit 2000 logických řádků kódu. Také seznam schopností (features) dwm je omezený a není zájem jej rozšiřovat. Veškeré další úpravy dwm se umisťují na Suckless wiki, kde jsou dostupné ve formě záplat (patchů).

Dwm je dlaždicový správce oken (tiling window manager), což znamená, že okna vždy vyplňují celou obrazovku a uživatel nerozhoduje, jak velká okna budou a kde budou umístěna. Dwm má ale celkem tři módy, ve kterých může operovat. Prvním z nich je právě zmíněný dlaždicový. Další je pak takzvaný monocle, kde je zobrazeno jen jedno okno, které zabírá celou obrazovku (podobné Gnome 3). Poslední mód je plovoucí, ve kterém se dwm nechává rozmístění a velikost oken na uživateli.

Uživateli jsou také k dispozici tagy, které trochu připomínají virtuální plochy, ale fungují jinak. Každé okno náleží k nějakému tagu a uživatel má možnost říct pomocí klávesových zkratek nebo myší, které tagy mají být vidět (a tedy nepřímo která okna mají být vidět). Běžně se zobrazuje jen jeden tag a uživatel přepíná na jiné, což trochu připomíná ony virtuální plochy, ale jde skutečně pouze o jakousi mapu viditelnosti oken. Rozložení oken nebo mód zobrazení se mezi jednotlivými tagy z těchto důvodů neuchovává.

Dwm má podporu více monitorů. Pokud si nakonfigurujete svůj okenní systém pomocí xrandr, vytvoří dwm automaticky na každém monitoru svou novou instanci. Mezi těmito instancemi lze pak přecházet (myší a klávesovými zkratkami) a přehazovat mezi nimi okna.

Dwm je vhodné použít ve spojení s dynamickým menu dmenu a případně s emulátorem terminálu st (oboje opět Suckless software). Další drobné schopnosti dwm se lze dočíst v manuálové stránce dwm a pozorným čtení konfiguračního souboru  config.h.

Stažení, kompilace a instalace

Zdrojové kódy dwm lze stáhnout na webových stránkách dwm. Poslední a finální verzí dwm je verze 6.0. Dwm je také možné stáhnout přímo z git repositáře (doporučovaná možnost).

$ git clone http://git.suckless.org/dwm 

Některé distribuce nabízejí dwm i jako balíček, ale kvůli konfiguraci kompilací je takováto distribuce vhodná spíše pouze jako ukázka správce ve výchozím nastavení. Některé distribuce ale umožňují takovýto balíček ještě rekompilovat s vlastními nastavením.

Konfigurace dwm se provádí editací souboru config.h. Ten pokud neexistuje, je vytvořen kopií souboru config.def.h. Konfigurace změnou hlavičkového souboru je překvapivě jednoduchá a každý, kdo umí alespoň trochu s jazykem C, nebude mít žádné problémy. Konfigurační soubor je okomentovaný a má přibližně 100 řádek. Uživatel si může nastavit font hlavní lišty, barevné schéma, velikosti okrajů oken, zobrazení hlavní lišty, štítky (tagy), permanentní pravidla pro umisťování programů, parametry rozložení a klávesové zkratky (klávesnice i myši). Pro začátek stačí určitě použít výchozí konfiguraci a znát pouze zkratku pro otevření terminálu: alt + shift + enter. Kompilace se spouští klasicky pomocí make (žádné ./configure).

$ time make
dwm build options:
CFLAGS   = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os -I/usr/X11R6/include -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION="6.1" -DXINERAMA
LDFLAGS  = -s -L/usr/X11R6/lib -lX11 -lXinerama
CC       = cc
CC drw.c
CC dwm.c
CC util.c
CC -o dwm
real    0m0.983s
user    0m0.917s
sys     0m0.037s
$ du dwm
40      dwm
$ ldd dwm
        linux-vdso.so.1 (0x00007fff37f9f000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fd9a41da000)
        libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0x00007fd9a3fd7000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007fd9a3c2d000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fd9a3a0e000)
        libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fd9a380a000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fd9a35f8000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd9a4515000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fd9a33f4000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fd9a31ee000)
$ 

Po kompilaci lze dwm nainstalovat pomocí make install (doporučuji se podívat na obsah souboru Makefile), případně jej prostě spouštět z jeho aktuálního umístění (například $HOME/dwm/dwm). Pro spuštění pak stačí dodat do souboru $HOME/.xinitrc řádek exec $HOME/dwm/dwm (nebo exec dwm) a spustit okenní systém pomocí příkazu  xinit.

Příklad $HOME/.xinitrc:

#!/bin/sh
xsetroot -solid black
xsetroot -name $(hostname)
xterm &
exec dwm 

Několik tipů

Po každé změně konfigurace je nutno dwm rekompilovat a restartovat. To je poněkud nudné především ze začátku, když si člověk dwm konfiguruje poprvé. Je ale možno použít trik se smyčkou v  .xinitrc.

while true; do
      dwm
      [ -e /tmp/dwm-exit ] && exit 0
done 

Dwm se pak vypíná klávesovou zkratkou alt + shift + q.

Dwm status se dá využít pro tisk zajímavých informací jako například data či baterie notebooku. Jednoduchý příklad použití (z  .xinitrc):

while true
do
        datetime=$(date +%Y-%m-%d\ %H:%M)
        battery=$(acpi -b | awk -F, '/Discharging/{print $2}')
        layout=$(setxkbmap -query | awk '/layout/{print $2}')
        mail=$(find .mail/*/Inbox/new -type f | wc -l)
        name="${layout} | ${datetime}"
        [ -n "${battery}" ] && name="${battery} | ${name}"
        [ "${mail}" != 0 ] && name="New mail: ${mail} | ${name}"
        xsetroot -name "${name}"
        sleep 2
done & 

Výchozí klávesu pro zkratky alt lze v config.h  jednoduše přemapovat na windows klávesu.

UX DAy - tip 2

#define MODKEY Mod4Mask 

Budoucnost dwm

Dwm se považuje za hotový, dokončený projekt. Jeho budoucnost je tedy velmi nezajímavá. Nicméně, s příchodem náhrad za stávající okenní systém X.org je tendence dwm přeportovat. Již nyní existuje experimentální fork dwm pro Wayland zvaný adwm.

Příště

V dalším pokračování seriálu o Suckless software se podíváme na velmi kontroverzní neexistující operační systém Stali a myšlenky s ním spojené.

Byl pro vás článek přínosný?

Autor článku

Martin Kopta je absolventem ČVUT FEL, kde studoval systémové programování a od roku 2010 se věnuje profesionální programátorské praxi. Zajímá se o unixové systémy, programátorské techniky a technologie.