Hlavní navigace

Dlaždice trochu jinak: konfigurace správce oken XMonad

4. 9. 2014
Doba čtení: 6 minut

Sdílet

Pracovní prostředí nemusí být navzdory zažitému standardu tvořeno jen plovoucími okny. Docela dobře je možné pracovat i s rozložením dlaždic, které je mnohem starší než okýnka. Dnes se budeme věnovat pokročilejší konfiguraci správce XMonad hlavně s důrazem na instalaci stavového panelu a jeho konfiguraci.

Budeme tedy pokračovat ve změnách v našem minule vytvořeném konfiguračním souboru, který si před dalšími akcemi trochu zjednodušíme:

import XMonad

main = do
xmonad $ defaultConfig
  { borderWidth         = 2
  , terminal            = "sakura"
  , normalBorderColor   = "#cccccc"
  , focusedBorderColor  = "#cd8b00"
  , modMask             = mod4Mask
}

Změn bylo málo, ale přesto je zde uvedu (je dobré po každém kroku provést jedním ze známých příkazů kontrolu správnosti konfiguračního souboru):

  • byl vynechán import pro uživatelské klávesové zkratky
  • začátek konfigurace byl rozložen do dvou příkazů
  • terminál byl nastaven na aplikaci Sakura
  • modifikátor byl nastaven na klávesu Win
  • byly vynechány uživatelské klávesové zkratky
  • bylo vynecháno spuštění terminálu při startu WM

Tímto máme konfigurační soubor připravený pro další akce a úpravy. První z nich bude doplnění importů o tyto řádky:

import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import System.IO

Pak přidáme dva příkazy, které mění výchozí nastavení tak, aby bylo možné využívat stavový panel a dock:

manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts  $  layoutHook defaultConfig

Konfigurační soubor připravený pro zobrazení panelu XMobar pak vypadá následovně:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import System.IO

main = do
xmonad $ defaultConfig
{ manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts  $  layoutHook defaultConfig
, borderWidth         = 2
, terminal            = "sakura"
, normalBorderColor   = "#cccccc"
, focusedBorderColor  = "#cd8b00"
, modMask             = mod4Mask
}

Tím jsou přípravy u konce a můžeme se pustit do instalace a nastavení panelu XMobar. Jak již bylo uvedeno, jedná se o minimalistický, převážně textový stavový panel. Původně byl vyvinut pro využití v XMonad, ale je celkem dobře využitelný i v jiných WM. Jeho vzorem byl I3 Status Bar. Dnes je nedílnou součástí platformy Haskell. Více je možné najít na webu projects.haskell.org/xmobar/.

Pro instalaci se nabízí více možností (viz popis na webu), ale my zvolíme tu nejjednodušší a budeme instalovat balíček přímo z Debianu, kde je aktuální verze 0.21:

# ~$ aptitude search xmobar
p   xmobar - lightweight status bar for X11 window managers

Instalují se dva soubory a celková velikost je po instalaci cca 10 MB. Aby bylo možné XMobar používat, je nutné jej konfigurovat. Ukázková základní konfigurace je po instalaci umístěna v /usr/share/doc/xmobar/exam­ples/xmobar.config. Pro umístění uživatelského konfiguračního souboru jsou použitelné dvě varianty: $HOME/.config/xmobar/xmobarrc nebo $HOME/.xmobarrc.

Použijeme tedy dva příkazy pro vytvoření základní konfigurace:

# ~$ mkdir .config/xmobar
cp /usr/share/doc/xmobar/examples/xmobar.config $HOME/.config/xmobar/xmobarrc

S konfigurací zatím nebudeme nic dělat a zkusíme XMobar spustit. Zavřeme všechna okna a pomocí dmenu spustíme příkaz xmobar. Výsledek je vidět na obrázku:

Nyní se podíváme blíže na konfiguraci XMobar. Jak je ze souboru patrné, není zde nijak moc údajů a celý soubor má pouze 24 řádků. Provedeme tedy pár změn:

  • ř. 1: změna velikosti fontu na 12
  • ř. 6: přesun panelu ke spodnímu okraji
  • ř.11: vynecháme zobrazení počasí
  • ř.12: vynecháme LAN kartu eth1
  • ř.20: vynecháme položky eth1 a EGPF

Změny uložíme, znovu spustíme XMobar a výsledek vidíme na obrázku:

Dalo by se samozřejmě dál pokračovat ve změnách, ale není to nutné a pro prvotní přiblížení nám konfigurace bude stačit. Pokud by se někdo chtěl na konfiguraci dále realizovat, dostatečné množství informací a příkladů najde na výše uvedené stránce 1projektu. My se nyní ale pustíme do následujícího kroku, kdy se XMobar spustí při startu WM. Za tímto účelem se opět musíme vrátit ke konfiguraci XMonad a přidat několik příkazů. Nebudu je zde zbytečně popisovat a uvedu rovnou celý obsah konfiguračního souboru:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import System.IO

main = do
xmproc <- spawnPipe "xmobar"
xmonad $ defaultConfig
{ manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts  $  layoutHook defaultConfig
, logHook = dynamicLogWithPP xmobarPP
      { ppOutput = hPutStrLn xmproc
          , ppTitle = xmobarColor "green" "" . shorten 50
          }
, borderWidth         = 2
, terminal            = "sakura"
, normalBorderColor   = "#cccccc"
, focusedBorderColor  = "#cd8b00"
, modMask             = mod4Mask
}

Klasicky vyzkoušíme správnost konfigurace, zavřeme WM a znovu ho spustíme a výsledek vidíme na obrázku:

Z předchozích obrázků jsou na první pohled patrné tři věci:

  • otevření XMobar při startu se podařilo v nastavené konfiguraci
  • velikost fontu se nezměnila, i když jsme v konfiguraci provedli změnu.
  • neobjevilo se zobrazení virtuálních ploch

Co se týká velikosti fontu, bude tedy asi jistější zvolit některý z XFT fontů, které jsou v Debianu obvykle nainstalované a na první řádek vložit příkaz:

font = "xft:Bitstream Vera Sans Mono:size=9:bold:antialias=true"

Pak už obrázek vypadá přeci jenom trochu jinak:

Zobrazení virtuálních ploch se také zdá jednoduché. Je možné upravit konfiguraci XMonad (ve výchozím stavu je definováno devět ploch) a přidat jeden řádek, např. takto:

workspaces         = ["1", "2", "3", "4"]

Po načtení nové konfigurace se ale nic nestane a plochy v panelu viditelné nejsou. Pro jejich zobrazení je třeba upravit konfiguraci jak XMonad, tak XMobar. Při úpravách jsem také zjistil, že nefunguje přepínání ploch kombinací kláves Win+1..9. Po několika pokusech si myslím, že je to nějaký problém s numerickými klávesami ve virtuálním stroji. Proto se pokusíme vyřešit oba tyto problémy najednou a ještě přinést další funkčnost do WM. V konfiguraci XMonad provedeme tyto změny:

  • do importů přidáme tři položky – jednu pro uživatelské klávesové zkratky a dvě pro manipulace s virtuálními plochami a obrazovkami
  • přidáme funkci pro správné zobrazení aplikace Gimp
  • přidáme tuto funkci do konfigurace
  • přidáme nastavení vzhledu panelu, resp. ploch
  • přidáme uživatelské zkratky pro přesun mezi plochami a přenos vybraného okna aplikace na další/předchozí plochu
  • přidáme uživatelské zkratky pro přesun na vybranou plochu a přenos vybraného okna aplikace na vybranou plochu

Končená konfigurace XMonad vypadá následovně:

CS24 tip temata

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeys)
import XMonad.Actions.CycleWS
import qualified XMonad.StackSet as W
import System.IO

myManageHook = composeAll
    [ className =? "Gimp"       -->doFloat ]

main = do
xmproc <- spawnPipe "xmobar"
xmonad $ defaultConfig
  { manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig
  , layoutHook = avoidStruts $ layoutHook defaultConfig
  , logHook = dynamicLogWithPP xmobarPP
        { ppOutput = hPutStrLn xmproc
        , ppCurrent = xmobarColor "yellow" "" . wrap "[" "]"
        , ppHiddenNoWindows = xmobarColor "grey" ""
        , ppTitle = xmobarColor "green" "" . shorten 40
        , ppVisible = wrap "(" ")"
        , ppUrgent = xmobarColor "red" "yellow"
        }
  , borderWidth         = 2
  , terminal            = "sakura"
  , normalBorderColor   = "#cccccc"
  , focusedBorderColor  = "#cd8b00"
  , modMask             = mod4Mask
  , workspaces          = ["1","2","3","4"]
  } `additionalKeys`
  [ ((mod4Mask, xK_Right), nextWS)
  , ((mod4Mask, xK_Left), prevWS)
  , ((mod4Mask .|. shiftMask, xK_Right), shiftToNext >> nextWS)
  , ((mod4Mask .|. shiftMask, xK_Left), shiftToPrev >> prevWS)
  , ((mod4Mask, xK_F1), windows $ W.greedyView "1")
  , ((mod4Mask, xK_F2), windows $ W.greedyView "2")
  , ((mod4Mask, xK_F3), windows $ W.greedyView "3")
  , ((mod4Mask, xK_F4), windows $ W.greedyView "4")
  , ((mod4Mask .|. shiftMask, xK_F1), windows $ W.shift "1")
  , ((mod4Mask .|. shiftMask, xK_F2), windows $ W.shift "2")
  , ((mod4Mask .|. shiftMask, xK_F3), windows $ W.shift "3")
  , ((mod4Mask .|. shiftMask, xK_F4), windows $ W.shift "4")
  ]

To ale ještě není všechno, musíme totiž také trochu pozměnit i konfiguraci XMobar a přidat do ní dvě položky: start a template pluginu pro zobrazení textu do standardního vstupu. Konfigurační soubor pak vypadá následovně:

Config { font = "xft:Bitstream Vera Sans Mono:size=10:bold:antialias=true"
       , borderColor = "black"
       , border = TopB
       , bgColor = "black"
       , fgColor = "grey"
       , position = Bottom
       , lowerOnStart = True
       , pickBroadest = False
       , persistent = False
       , hideOnStart = False
       , commands = [ Run Network "eth0" ["-L","0","-H","32","--normal","green","--high","red"] 10
                    , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
                    , Run Memory ["-t","Mem: %"] 10
                    , Run Swap [] 10
                    , Run Com "uname" ["-s","-r"] "" 36000
                    , Run Date "%a %b %_d %Y %H:%M" "date" 10
                    , Run UnsafeStdinReader
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%UnsafeStdinReader% }{%cpu% | %memory% * %swap% | %eth0%  %date%"
       }

Tímto krokem považuji dnešní díl za dostatečně rozsáhlý a proto budeme v konfiguraci XMonad WM pokračovat příště. Zaměříme se hlavně na možnosti instalace a nastavení stavového panelu Dzen2 a systémového panelu Trayer, popř. Stalonetray.

Autor článku