Hlavní navigace

Konfigurace Qtile – styl rozložení oken, systémový panel, start aplikací

29. 9. 2016
Doba čtení: 11 minut

Sdílet

Minulý díl byl věnován úvodu do konfigurace Qtile – klávesovým zkratkám a pracovním plochám. V dnešním dílu se zaměřím na konfiguraci stylu rozložení oken a panelu. Také to bude poslední díl o Qtile.

Ještě než se pustím do další konfigurace rozložení oken, tak se velmi krátce vrátím k poslední části minulého dílu. Tam jsem představil několik funkcí pro manipulaci s okny a postupně jsem všechny přetvořil na nový způsob volání. V konfiguraci to pak vypadá následovně:

# Switch between windows in current stack pane
EzKey("W-k", lazy.layout.down() ),
EzKey("W-j", lazy.layout.up() ),

# Move windows up or down in current stack
EzKey("W-C-k", lazy.layout.shuffle_down() ),
EzKey("W-C-j", lazy.layout.shuffle_up() ),


# Switch window focus to other pane(s) of stack
EzKey("W-<space>", lazy.layout.next() ),

# Swap panes of split stack
EzKey("W-S-<space>", lazy.layout.rotate() ),

# Toggle between split and unsplit sides of stack.
# Split = all windows displayed
# Unsplit = 1 window displayed, like Max layout, but still with
# multiple stack panes
EzKey("W-S-<Return>", lazy.layout.toggle_split() ),

# Toggle between different layouts as defined below
EzKey("W-<Tab>", lazy.next_layout() ),
EzKey("W-C-x", lazy.window.kill() ),

V minulém dílu byly uvedeny dva základní typy rozložení oken na obrazovce. Zde se opět projeví určitá výhoda Qtile, kde je standardně k dispozici typů rozložení oken mnohem více (celkem třináct). Bylo by asi vhodné si je všechny krátce představit:

  • Floating – plovoucí rozložení, které nijak neřadí okna, pouze nastavuje fokus
  • Columns – rozšířený typ Stack. Obrazovka je rozdělená do sloupců, ty je možné dynamicky přidávat či odstraňovat. Každý sloupec může zobrazovat jedno okno nebo všechny najednou ze stohu. Sloupce i okna je možné přesouvat i měnit jejich velikost. Podle nastavení parametrů je možné tímto typem napodobit Wmii, VerticalTile nebo Max
  • Matrix – obrazovka je rozdělená do matrice stejně velikých buněk, do kterých se umístí vždy jedno okno. Počet sloupců je nastavitelný a může se měnit interaktivně
  • Max – jednoduché rozložení, kdy je viditelné pouze jedno aktivní okno přes celou obrazovku
  • MonadTall – napodobuje základní rozložení z WM XMonad. Obrazovka je rozdělená na dvě části: hlavní pole, ve které je vždy pouze jedno otevřené okno a sekundární pole, které je minimálně jedno. Pokud jich je víc, tak jsou rozložena vertikálně. Oba typy polí lze zvětšovat či zmenšovat nebo měnit jejich pozici na obrazovce. Sekundární pole je možné v rámci dané oblasti přesunovat
  • RatioTile – rozloží všechna okna podle parametrem nastaveného poměru
  • Slice – zde se „odřízne“ část obrazovky a umístí se do něj jedno okno. Ostatním oknům přidělí místo v jiném rozložení
  • Stack – obrazovka je rozdělená do dvou stohovacích oblastí horizontálně. Je možné přecházet mezi stohovacími oblastmi, v nich umístěnými okny, zobrazovat jedno nebo všechna okna ve stohu. Je uváděno jako nejvyspělejší a flexibilní rozložení
  • Tile – dělí obrazovku do jednotlivých sloupců. Je vhodný pro široké monitory
  • TreeTab – funguje podobně jako Max s tím rozdílem, že na levém okraji obrazovky je viditelný přehledný strom otevřených oken
  • VerticalTile – dělí obrazovku do jednotlivých řádků. Je vhodné pro vertikálně umístěné monitory
  • Wmii – toto rozložení emuluje rozložení stejnojmenného WM. Obrazovka je dělená do sloupců, které mohou být dále dělené
  • Zoomy – zde je otevřené jedno hlavní aktivní okno a na pravém okraji obrazovky jsou viditelné náhledy ostatních otevřených oken. Mezi okny (změna z náhledu na hlavní okno) lze přecházet pohybem myši nad příslušný náhled

Bylo by samozřejmě možné vyzkoušet a ukázat všechna uvedená rozložení, ale toto nechám na čtenářích, kteří by chtěli experimentovat. Pro ně jenom krátké upozornění: rozložení TreeTab, Slice a Floating mohou obsahovat v některých verzích WM chyby a při jejich použití mohou být problémy buď se startem WM nebo zobrazením samotných rozložení či v nich obsažených oken. Já jsem pro ukázku vybral pět rozložení (ne náhodou to odpovídá počtu pracovních ploch), které se mi jeví jako zajímavé. I když to neodpovídá abecednímu pořadí, tak na první místo dávám MonadTall, protože mi nejvíce připomíná rozložení, které standardně používám na WM Awesome. Další vybraná rozložení jsou patrná z konfigurace:

layouts = [
layout.MonadTall(name='MTall'),
layout.Columns(name='Colns'),
layout.Max(name='MaxWs'),
layout.Tile(name='HTile'),
layout.Zoomy(name='Zoomy')
]

Pro ukázku jsem jako obvykle otevřel tři okna s aplikacemi. Na obrázcích je možné si všimnout, že se nově před zobrazením data a času objevuje název aktuálního rozložení. Zatím nebudu uvádět, jak se to mohlo stát, a vrátím se k tomu později.

Rozložení MonadTall

Rozložení Columns

Rozložení Max

Rozložení Tile

Rozložení Zoomy

V textu konfigurace rozložení oken je možné si povšimnout nějakých parametrů, v konkrétním případě názvu rozložení, který se pak někde prezentuje (např. v panelu, na obrázcích jsou ale ještě původní standardní názvy jednotlivých rozložení). Možností nastavení parametrů jednotlivých rozdělení je samozřejmě mnohem víc, takže případné zájemce odkážu na příslušnou nápovědu Nápověda Layouts

Teď se vrátím k tomu, co jsem zmínil v textu výše. Jedná se o možnost propojení konkrétní pracovní plochy s konkrétním rozložením, které na ní bude standardní při startu WM. Tímto opatřením samozřejmě zůstane výše uvedená možnost postupně střídat jednotlivá rozložení na libovolné pracovní ploše. Uživatel má tak možnost použít třeba jenom jednu plochu a na ní podle potřeby měnit rozložení. Nebo použít více ploch, na kterých předem definuje standardní rozložení. Také může samozřejmě použít kombinaci obojího. V tomto ohledu nabízí Qtile docela zajímavé možnosti. Aby se daly nastavit typy rozložení, je třeba se vrátit do konfigurační sekce Groups. Jak je patrné z webu Nápověda Groups, konfigurovat je možné více parametrů pracovních ploch, Kromě již zmíněných rozložení (parametr layout) stojí určitě za zmínku možnost přiřadit spouštěné aplikace k vybrané pracovní ploše (parametr matches + ukázka jeho možné konfigurace v nápovědě) nebo spuštění jedné či více aplikací při vytvoření pracovní plochy (parametr spawn). Já se omezím na jednoduchou úpravu konfigurace, kde nahradím jeden řádek v dané sekci následujícím textem:

groups = [
Group("a", layout='MTall'),
Group("b", layout='Zoomy'),
Group("c", layout='MaxWs'),
Group("d", layout='HTile'),
Group("e", layout='Colns'),
]

Dalších pět obrázků ukazuje stejné aplikace na jednotlivých pracovních plochách, kde jsou již viditelné nově nastavené názvy typů rozložení.

Rozložení MTall na ploše A

Rozložení Zoomy na ploše B

Rozložení MaxWs na ploše C

Rozložení HTile na ploše D

Rozložení Colns na ploše E

To by mohlo ohledně rozložení oken a pracovních ploch stačit. Nyní by bylo vhodné si popsat, jaká je vlastně hierarchie při zobrazování čehokoliv na fyzické obrazovce u Qtile. Nejvyšším „patrem“ je v tomto ohledu fyzická obrazovka, které se zde říká Screen. Ta obsahuje dva základní zobrazovací prvky: pracovní plochy (Groups/Group), na kterých jsou pak okna aplikací s různým rozložením a panely, zde zvané Bars. V konfiguraci je možné použít jednu nebo více obrazovek. Na každou z nich je pak možné umístit jeden nebo více panelů. Umístění panelu nahoru nebo dolů je bez problémů. Je sice také možné použít umístění i vlevo a vpravo nebo na libovolnou pozici na obrazovce. V tomto případě to má ale háček, ke kterému se za chvíli dostanu. Každý panel se potom skládá z libovolného počtu widgetů. Právě při snaze o umístění panelů jinam než nahoru či dolů je nutné velmi pečlivě dbát na to, které widgety se použijí. Některé jsou totiž určené pouze pro horizontální zobrazení a jejich umístění do vertikální polohy vede k chybě v panelu a potažmo v celé konfiguraci. Více je možné se dozvědět v nápovědě Nápověda Screens.

Je už dobrým zvykem, že většina WM do svých standardních panelů dodává nějakou sadu widgetů. Qtile není výjimka, což je možné ověřit na stránkách projektu: Nápověda Widgets. Je jich k dispozici něco přes padesát, což je docela slušné číslo a každý si mezi nimi určitě nějaké vybere: Built-in Widgets. Než se pustím do nějakých úprav a změny konfigurace, bylo by asi vhodné uvést původní nastavení obrazovky (kvůli článku jsem provedl pouze změnu formátování zápisu):

screens = [ Screen(
    bottom=bar.Bar([ widget.GroupBox(),
        widget.Prompt(),
        widget.WindowName(),
        widget.TextBox("default config", name="default"),
        widget.Systray(),
        widget.Clock(format='%Y-%m-%d %a %I:%M %p'),
     ], 30, ), ), ]

Jak je z kódu vidět, je definovaná jedna obrazovka a na ní jeden spodní panel s nastavenou šířkou a v něm celkem šest widgetů. Já už jsem z ukázkových důvodů udělal výše v textu dvě změny: vynechal widget TextBox a přidal widget CurrentLayout, který zobrazí název aktuálního rozložení oken na pracovní ploše. Následně uvedu ukázkový kód, který prezentuje některé widgety a jejich případnou konfiguraci:

screens = [
    Screen(
        top=bar.Bar( [
            widget.GroupBox(),
            widget.Spacer(length=bar.STRETCH),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.TextBox(text='CPU:'),
            widget.CPUGraph(frequency=10, graph_color='#A32020', fill_color='#E0301E'),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.TextBox(text='RAM:'),
            widget.Memory(fmt='{MemUsed} MB'),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.TextBox(text='NET:'),
            widget.NetGraph(graph_color='#D3A625', fill_color='#EEBA30'),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.TextBox(text='DF:'),
            widget.DF(format='{f} {m}', warn_space=50),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.TextBox(text='HDD:'),
            widget.HDDBusyGraph(),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.CurrentLayout(),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.Clock(format='%F %R'),
            widget.Sep(foreground='#000000', linewidth=2),
            widget.Systray(),
            widget.Sep(foreground='#000000', linewidth=2),
        ], 30, background='#008080'),
        bottom=bar.Bar([
            widget.TaskList(),], 32, background='#008080'),),
]

Ke zkušební konfiguraci krátký komentář:

  • jsou použity dva panely nahoře a dole. Je velká škoda, že využití výše uvedených vertikálních panelů je prakticky vyloučené. Použít třeba panel na levé straně obrazovky a na něm widget LaunchBar pro umístění ikon spouštěných aplikací by nebylo jistě pro některé uživatele na škodu. Pro tento typ panelu je ale k dispozici žalostně málo rozumně využitelných widgetů, takže pro jejich použití by se musely widgety vytvořit
  • oba panely mají nastavenou výšku a barvu pozadí
  • pro oddělení jednotlivých widgetů se používá typ Sep s nastavením šířky vertikální čárky a její barvy
  • pro názvy jednotlivých widgetů se používá typ TextBox, kde se uvádí konkrétní text pro zobrazení v panelu
  • GroupBox – byl již v původní verzi, zobrazuje názvy pracovních ploch a aktuálně používanou plochu
  • Spacer – slouží k nastavení mezery mezi widgety. V aktuální konfiguraci odděluje seznam ploch a ostatní widgety posunuje doprava
  • CPUGraph – zobrazuje graficky zatížení procesoru (souhrnně pro všechny jádra/vlákna), nastaven je interval obnovení a barva grafu
  • Memory – číselně ukazuje využití RAM, konkrétně aktuální „spotřebu“, jsou nastavené jednotky
  • NetGraph – ukazuje aktivitu na síti (bez nastavení směr „zvenku dovnitř = download“), nastavena pouze barva grafu
  • DF – číselně zobrazuje volné místo na diskovém oddílu root. Je nastaven formát zobrazení – volné místo a jednotky. Druhý parametr je pak proto, aby widget vůbec něco ukázal. Cifra je totiž viditelná pouze tehdy, když je volné místo menší než nastavená hodnota
  • HDDBusyGraph – ukazuje aktivitu pevného disku, bez dalších parametrů se jedná o disk /dev/sda
  • CurrentLayout – zobrazuje název aktuálního typu rozložení oken na ploše
  • Clock – zobrazuje hodiny, byl pouze nastaven a zjednodušen formát zobrazení
  • Systray – zobrazuje systémovou lištu, ve které se umístí ikony aplikací
  • TaskList – zobrazí ikony a názvy všech spuštěných oken. Jedná se o podobný widget, jako byl původní WindowName. Ten ale zobrazuje název pouze aktuálního okna, na kterém je fokus. Důležité upozornění: tyto dva widgety NESMÍ být umístěné v jednom panelu!

Pro demonstraci jsem do souboru $HOME/.xinitrc do sekce Qtile přidal spuštění správce obrazovky CopyQ. Výsledný vzhled obrazovky je viditelný na obrázku

Panely a widgety,

Poslední možnost, na kterou u Qtile chci upozornit, je mechanismus reakcí na určité systémové (z hlediska WM) události. Zde se také projevuje inspirace od XMonad, proto se tento systém nazývá Hooks (háky, háčky) – viz Nápověda Hooks, Built-in Hooks. Do ukázkové konfigurace přidám oba, které uvádí nápověda – pro nastavení dialogových oken jako plovoucích a pro spuštění aplikací při startu WM:

from libqtile import hook

@hook.subscribe.client_new
def floating_dialogs(window):
    dialog = window.window.get_wm_type() == 'dialog'
    transient = window.window.get_wm_transient_for()
    if dialog or transient:
        window.floating = True

import os
import subprocess

@hook.subscribe.startup_once
def autostart():
    home = os.path.expanduser('~/.config/qtile/autostart.sh')
    subprocess.call([home])

Pro dokončení konfigurace je nutné ještě vytvořit příslušný soubor se skriptem a nastavit mu příznak spouštění:

touch $HOME/.config/qtile/autostart.sh

chmod +x $HOME/.config/qtile/autostart.sh

Pak už jenom stačí do skriptu doplnit jednoduchý kód pro spuštění správce schránky, změny uložit a vyzkoušet funkčnost:

#!/bin/sh
copyq &

Jako úplně poslední věc bych uvedl možnost do Qtile přidávat vlastní kód. Vzhledem k tomu, že je WM sám o sobě napsaný v Pythonu a pomocí souboru příslušného typu je také konfigurovaný, tak to není žádný zásadní problém (samozřejmě pro ty, kteří Python alespoň trochu ovládají…). Nemá smysl zde uvádět nějaké bližší podrobnosti, takže pro zájemce pouze odkaz na možnou inspiraci: Příklady konfigurace

Pro případné zájemce dávám do přílohy definitivní podobu konfiguračního souboru

CS24_early

Uživatelský konfigurační soubor

Dnešní díl jsem věnoval dokončení popisu stylů rozložení oken na ploše. Dále byla představena možnost propojení stylů s jednotlivými pracovními plochami. Díl i celá wm. Bude představena základní konfigurace a způsob uživatelské konfigurace. Podrobněji proberu nastavení klávesových zkratek, spouštění aplikací a manipulace s pracovními plochami a okny.

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

Autor článku