Hlavní navigace

Konfigurace Dwm – aplikace vybraných patchů

10. 11. 2016
Doba čtení: 10 minut

Sdílet

Minulý díl byl věnován vzhledu prostředí, systémovému panelu a úvodu do aplikace patchů. V dnešním dílu se zaměřím na postupnou aplikaci několika vybraných patchů a ukončím kapitolu o Dwm.

V minulém dílu jsem se celkem podrobně věnoval možnostem a taky záludnostem aplikace patchů pro uživatelské rozšíření Dwm. Dnes bych chtěl v této činnosti pokračovat s tím, že vyberu celkem 4 patche, které mají podle mého názoru takovou funkčnost, která standardnímu provedení Dwm chybí. Prvním z nich je SysTray. Jak už jeho název napovídá, jedná se o implementaci systémové lišty do panelu Dwm. Jako první jsem tento patch vybral nejen kvůli jeho funkčnosti, ale také kvůli tomu, že je ze všech vybraných zdaleka nejrozsáhlejší. K porovnání s původním souborem se vrátím až po jeho aplikaci. Jak je možné si všimnout na odkazu, je na stránce k dispozici několik verzí ke stažení. Obecně se dá říct, že jsou zde novější verze z GITu a pak verze odpovídající verzím Dwm. Nevyzkoušel jsem patchů zase až tak moc, ale téměř vždycky se mi vyplatilo použít verze shodné s Dwm. Proto jsem pro aplikaci použil soubor dwm-6.1-systray.diff.

Soubor je nutné přesunout do příslušného adresáře včetně zjednodušení názvu:

cp $HOME/dwm-6.1-systray.diff $HOME/Dokumenty/dwm-6.1/systray.diff

Pak už nic nebrání spuštění „slepé“ aplikace patche. Výsledek na dalším obrázku napovídá, že úspěšnost je celkem dobrá a z celkových 33 hunků jich 32 projde bez problémů.

Zkouška patche SysTray

Po příjemném zjištění je tedy možné přistoupit k samotné „ostré“ aplikaci patche. Než k tomu ale přistoupím, je nutné otevřít rozdílový soubor a jako v minulém dílu opravit názvy originálních konfiguračních souborů (původně config-def.h, nově config.h). Pro jistotu ještě ověřím funkčnost této změny nasucho a přikročím k ostré aplikaci. Tam ukážu další možnosti nastavení parametru, který zajistí automatické vytvoření záložní kopie původní verze souboru, pokud by aplikace neproběhla úplně dokonale:

patch -p1 --backup-if-mismatch < systray.diff

Výsledek aplikace je očekávaný a viditelný na obrázku

Aplikace patche SysTray

Díky parametru pro zálohu vzniknou v adresáři dva nové soubory s původní verzí obou dotčených souborů: config.h.orig, dwm.c.orig. Kromě toho je k dispozici samozřejmě i soubor dwm.c.rej, který obsahuje jediný neprovedený hunk. Při pohledu do souboru je ale možné zjistit dvě skutečnosti:

  • hunk nemohl proběhnout dobře. Hlavička hunku je sice v pořádku, stejně tak odpovídají i čísla řádků; problém je v tom, že tři řádky předcházející změně mají v rozdílovém a originálním souboru úplně jiný kód
  • samotná změna je velmi jednoduchá a spočívá v odstranění jednoho řádku a jeho náhradu druhým

Nemá proto smysl nic moc vymýšlet a v nové verzi souboru dwm.c se najde řádek č. 664, který se pro jistotu pouze zakomentuje a za něj se přidá řádek nový:

/*XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);*/
resizebarwin(m);

Pak už stačí jenom změnu uložit a provést nový překlad patchované verze Dwm. U mne proběhl bez problémů, takže jsem mohl do souboru $HOME/.xinitrc přidat do sekce spouštění Dwm start aplikace CopyQ a provést ukončení a restart WM. Jak je patrné z obrázku, byla aplikace patche úspěšná a v panelu si to hezky lebedí ikona příslušné aplikace! Sice to dalo trochu práci, ale výsledek je odpovídající.

SysTray v panelu

Teď je čas se vrátit k tomu, co jsme zmínil před aplikací prvního patche – že je zdaleka nejrozsáhlejší z těch vybraných. To je snadné doložit počtem řádků v originálním a novém souboru dwm.c: 2142 vs 2481, což představuje nárůst o cca 16%. Je samozřejmě jasné a pro mnohé možná i překvapující, že se poměrně slušně vybavený WM vejde do 2500 řádků kódu a v originální verzi je přitom z toho necelých 70 řádků komentářů a nápověd! Nyní by asi bylo logické se pustit do aplikace dalšího vybraného patche. Já to ale neudělám a pustím se do drobné odbočky. Zatím jsem na dvou příkladech demonstroval možnosti a problémy aplikace patchů. Oba příklady byl stejné v tom, že se patch aplikoval na originální soubory. Teď je ale situace úplně jiná: mám záplatovanou verzi jak konfiguračního, tak zdrojového souboru! Patche jsou ale tvořené tak, že se mají aplikovat pouze na originální soubory. Je tedy otázka, jak další konání dopadne.

Zatím trochu předběhnu a na obrázku ukážu zkoušku dalších třech patchů na originální soubory:

Zkouška dalších patchů

Jako další jsem do ukázky vybral patch FancyBar. Ten umožní zobrazit v panelu názvy nejen jednoho, ale všech viditelných oken. Případné zájemce jenom krátce upozorním, že jsou k dispozici i další dva patche podobného ražení: FancyBarClickable a FancyColoredBarClickable. Názvy jistě napoví i o jejich funkčnosti. Oba jsem zkoušel asi 3×, ale ani jednou se mi nepodařilo nově vytvořenou verzi úspěšně přeložit. Navíc klikací a barevný panel nepovažuji u Dwm za nezbytnost, takže jsem to moc do hloubky nezkoumal. Pro aplikaci opět použiju verzi Dwm a stáhnu balíček dwm-fancybar-6.1.diff. Ten si přidám do příslušného adresáře, ale nejen to: pro jistotu si vytvořím zálohu pro oba soubory, patchované prvním patchem (vše z adresáře $HOME/Dokumenty/dwm-6.1/:

cp $HOME/dwm-fancybar-6.1.diff fancybar.diff
cp config.h config-ST.h
cp dwm.c dwm-ST.c

Po slepé zkoušce už se asi celkem očekávaně projevila změna v originálním souboru v porovnání s tím původním a neprošel pouze jeden hunk. Naštěstí je to ten jednodušší a snadno ručně doplnitelný. Výsledek ukazuje obrázek

Zkouška patche FancyBar

Tento patch nemění konfigurační soubor a tak není nutné upravovat jeho kód. Je tak možné rovnou spustit jeho aplikaci. Dopadne očekávaně a tak se pustím rovnou do popisu ručního doplnění prvního hunku (obě změny se týkají souboru dwm.c:

  • na řádcích 797, 798 se změní dva příkazy pro deklaraci proměnných:   
int x, xx, w, dx, tw, mw;
unsigned int i, occ = 0, urg = 0, n = 0, extra = 0;
  • na řádky 805, 806 se přidá podmínka
if (ISVISIBLE(c))
    n++;

Změny se uloží, ukončí a nastartuje se Dwm a další obrázek ukazuje zobrazení tří názvů tří otevřených oken v dlaždicovém stylu rozložení. Při změně fokusu se provede nejen přesun fokusu na další okno, ale i přesun na jeho název v panelu

FancyBar na Tiling

Funkci lze bez problémů použít i na zbývajících dvou stylech rozložení oken a hlavně u stylu Monocle je obrazovka mnohem přehlednější. Více ukazuje obrázek

FancyBar na Monocle

Patch je samozřejmě funkční i při nastavení plovoucích oken a také zde i na Monocle funguje bez problémů přesun fokusu mezi okny. Následujícím patchem je SwapFocus. Ten umožní přesunovat fokus mezi posledními dvěma aktivními okny okny pořád dokola jedinou klávesovou zkratkou. Uživatel pak nemusí (ale samozřejmě může, jejich funkce není nikterak omezená!) používat dvě zkratky pro stejnou činnost – Win+šipky doleva/doprava. Na stránce patche je opět více možností pro stažení a já tradičně stahuji stejnou verzi, tedy soubor dwm-6.1-swapfocus.diff. Jako minule si ho přehodím do správného adresáře a udělám zálohu dvojitě patchovaných souborů:

cp $HOME/dwm-6.1-swapfocus.diff swapfocus.diff
cp config.h config-ST-FB.h
cp dwm.c dwm-ST-FB.c

Slepá zkouška ovšem nedopadne nijak povzbudivě. Jak je vidět na obrázku, žádný z hunků nedopadl dobře

Zkouška patche SwapFocus

Nemá proto smysl zkoušet ostrou aplikaci a vše bude nutné provést ručně. Patch mění pouze soubor dwm.c:

  • na řádek 239 se přidá deklarace procedury
static void swapfocus();
  • na řádek 276 se přidá deklarace proměnné
static Client *prevclient = NULL;
  • do řádků 1875 – 1883 se přidá kód nové procedury
void
swapfocus(){
    Client *c;
    for(c = selmon->clients; c && c != prevclient; c = c->next) ;
    if(c == prevclient) {
        focus(prevclient);
        restack(prevclient->mon);
    }
}
  • na řádek 1995 se přidá příkaz
prevclient = c;
  • na řádek 2494 se přidá příkaz
prevclient = nexttiled(selmon->clients);
  • na řádku 2500 se vymaže stávající příkaz a vloží se do něj nový
if(!c || !(c = prevclient = nexttiled(c->next)))

Změny v souboru si uložím a zkusím provést nový překlad. V mém případě dopadl dobře. I když byl překlad úspěšný, není ještě možné novou funkčnost WM vyzkoušet. Je sice otázka proč, ale každopádně v konfiguračním souboru není příkaz pro aktivaci nové funkce a samotný patch tuto změnu neobsahuje! Aby se zachoval formát ostatních deklarovaných procedur, tak ještě provedu malou změnu ve zdrojovém souboru:

  • na řádku 239 změním deklaraci procedury
static void swapfocus(const Arg *arg);
  • na řádku 1876 změním hlavičku procedury
swapfocus(const Arg *arg)

Pro jistotu opět zkusím překlad, který doběhne bez problémů. Nově pouze hlásí varování, že je deklarovaná procedura a není zatím využitá. To se ale dá velmi snadno změnit a tak provedu závěrečnou úpravu konfiguračního souboru. Tam na řádek 96 přidám volání nové procedury třeba takto (klávesová zkratka Win+Home):

{ MOD, XK_Home, swapfocus, {0} },

Pak už i nový překlad skončí bez varování a po restartu Dwm je možné novou funkci vyzkoušet. A když už je řeč o restartu, tak jako poslední patch jsem vybral SelfRestart. Ten umožní restartovat Dwm bez zbytečné závislosti na externích skriptech. Na webu je ke stažení jediný soubor – dwm-r1615-selfrestart.diff. Jako obvykle ho přesunu do příslušného adresáře a udělám zálohy aktuálních souborů:

cp $HOME/dwm-r1615-selfrestart.diff selfrestart.diff
cp config.h config-ST-FB-SF.h
cp dwm.c dwm-ST-FB-SF.c

Při slepé zkoušce je možné si všimnout, že jsou sice všechny hunky provedené úspěšně, ale patch se opět odkazuje na špatnou verzi konfiguračního souboru:

Zkouška patche SelfRestart

To mne tedy nutí příslušný soubor otevřít a udělat změny. Pokud by někdo tuhle akci následoval, je vhodné se podívat na celý patch. Ten se totiž liší od všech ostatních, které jsem zde dříve zmiňoval. Obsahuje totiž jenom změny v konfiguračním souboru a vše ostatní se týká souboru, který zatím ve zdrojových souborech neexistuje. Přesto patch zkusím spustit běžným způsobem a uvidím, jaký bude výsledek. Prvně ale změny v kódu patche:

  • v hlavičce patche všude nastavit konfigurační soubor config.h
  • na řádku 24 změnit klávesovou zkratku volání nové funkce   
{ MOD|CTRL, XK_r, self_restart, {0} },

Po uložení souboru a nové slepé zkoušce sice patch hlásí jeden neprovedený hunk (právě se změnou klávesové zkratky), ale stejně zkusím i ostrou aplikaci. Důležitým výsledkem je to, že se v adresáři objevil nový soubor selfrestart.c. Pak už stačí provést změny v konfiguračním souboru:

  • na řádku 78 se objevilo přiřazení nového zdrojového souboru
#include "selfrestart.c"
  • nakonec sekce s definicí klávesových zkratek (řádky 117, 118) se musí přidat řádek z volání nové funkce, takže bude vypadat následovně:
{ MOD|CTRL,              XK_r,      self_restart,   {0} },
{ MOD|CTRL,              XK_q,      quit,           {0} },

Pak už stačí jenom změny uložit, provést nový překlad a znovu spustit Dwm. Pomocí nastavené klávesové zkratky je pak možné Dwm restartovat  a to přímo bleskurychle. Celkově je možné konstatovat, že po skončení všech úprav včetně aplikace vybraných patchů se původní velikost konfiguračního souboru zvětšila o 24 řádků (ze 112 na 136) a zdrojového souboru o 381 řádků (ze 2142 na 2523). Zajímavá by mohla být také velikost nejnovější verze spustitelného souboru dwm, která činní celých 48.6 kB… Poměrně dlouhou kapitolu o aplikaci patchů na Dwm bych ukončil upozorněním na několik dalších zajímavých možností:

  • PerTag – umožní nastavit styl rozložení oken pro každý definovaný tag
  • Deck – styl rozložení oken, kde se v hlavní i stohovací části tagu objevuje pouze jedno viditelné okno (jako u stylu Monocle)
  • DualStatus – umožní umístit druhý stavový panel buď nezávisle nebo do stávajícího panelu
  • StatuColors – umožní barevně odlišit názvy oken otevřených aplikací v panelu
  • TagAll – umožní přesun všech plovoucích oken z jednoho tagu na druhý

Na úplný závěr kapitoly o Dwm bych si dovolil uvést dva zajímavé příkazy. Ve dvou dílech jsem zde ukazoval, jak vypadají a jak se dají aplikovat patche na Dwm. Zmíněné příkazy dělají úplně opačnou věc: vezmou dva originální soubory (spíše by se asi dalo říct dvě různé verze jednoho originálního souboru) a vytvoří jeden soubor rozdílový. Tato možnost platí samozřejmě obecně pro všechny soubory, nejenom o konfigurační a zdrojové soubory Dwm:

diff -u config.def.h config-ST-FB-SF-SR.h > config-user-h.diff
diff -u dwm.orig.c dwm-ST-FB-SF-SR.c > dwm-user-c.diff

Pro případné zájemce dávám do přílohy všechny potřebné soubory:

skoleni

  1. Původní konfigurační soubor
  2. Konfigurační soubor se SysTray
  3. Konfigurační soubor se SysTray a FancyBar
  4. Konfigurační soubor se SysTray, FancyBar a SwapFocus
  5. Konfigurační soubor se SysTray, FancyBar, SwapFocus a SelfRestart
  6. Rozdílový soubor pro konfigurační soubor
  7. Původní zdrojový soubor
  8. Zdrojový soubor se SysTray
  9. Zdrojový soubor se SysTray a FancyBar
  10. Zdrojový soubor se SysTray, FancyBar a SwapFocus
  11. Zdrojový soubor se SysTray, FancyBar, SwapFocus a SelfRestart
  12. Rozdílový soubor pro zdrojový soubor
  13. Rozdílový soubor FancyBar
  14. Zdrojový soubor SelfRestart
  15. Rozdílový soubor SelfRestart
  16. Rozdílový soubor SwapFocus
  17. Rozdílový soubor SysTray

Tímto je kapitola o Dwm zcela u konce a od příštího dílu se zaměřím na posledního zástupce podrobněji popisovaných dlaždicových WM – notion.

Dnešní díl jsem věnoval popisu aplikace vybraných patchů pro uživatelskou modifikaci Dwm. Tímto dílem také končí kapitola o Dwm a od příštího dílu se začnu věnovat Notion WM. Konkrétně představím systém konfiguračních souborů, uspořádání objektů na ploše a blíže začnu rozebírat hlavní konfigurační soubor.