Automatické rozmisťování oken
Program Devil's pie slouží k automatickému rozmisťování oken (vzhledem k obrazovce i virtuálním plochám) a nastavení ostatních vlastností jako je průhlednost, dekorace... Tyto vlastnosti jsou užitečné především pro uživatele kteří nejsou zvyklí na používání virtuálních ploch a tento program jim pomůže udržet pořádek ve změti oken. Bohužel tento program není příliš vhodný pro začátečníky, kterým se tento návod pokusí instalaci a konfiguraci usnadnit.
Instalace
Program se nachází v repozitářích Ubuntu, stačí nainstalovat balík devilspie.
Po instalaci je vhodné nastavit Devil's pie na automatické spouštění po startu: Zvolte Systém -> Volby -> Sezení a tlačítkem Přidat otevřete dialog přidání programu po startu. Do kolonky Jméno: napište Devil's pie a do Příkaz: devilspie &
Konfigurace
Konfigurační soubory se ukládají do složky .devilspie ve vašem domovském adresáři. Mají koncovku *.ds a může jich tam být libovolné množství, program prochází vždy všechny. Do těchto souborů se ukládají pravidla pro manipulaci s okny, která se píší v jednoduchém skriptovacím jazyku (jde o speciální dialekt jazyku Lisp), který bude popsán níže.
Pro začátek si vytvořte ve svém domovském adresáři složku .devilspie (pozor, složky začínající na . jsou skryté, v Nautilu je zobrazíte pomocí Ctrl+H). V této složce vytvořte soubor settings.ds do kterého budete ukládat všechna svá pravidla pro manipulaci s okny.
Pravidla
Základní syntaxe
Základní tvar pravidla podle kterého Devil's pie pracuje s okny je následující:
(if (//operátor// (//matcher//) "//řetězec//") (//akce//) )
Případně:
(if (//operátor// (//matcher//) "//řetězec//") (begin //akce1// //akce2// ... ) )
Co to znamená?? Počáteční if jistě napoví, že se jedná o podmínku. //akce//, například přesunutí okna na jinou plochu bude provedena, v případě že bude splněna podmínka. Podmínka je splněna vždy, když nějaký textový řetězec získaný pomocí //matcheru// (matcherem může být například popisek okna, název aplikace...) odpovídá vámi zadanému //řetězci//. Jak moc mu musí odpovídat, určuje //operátor//. Více akcí, které se provedou postupně po sobě musíme definovat pomocí (begin a tento blok po poslední akci uzavřeme ).
Následující příklad to snad objasní lépe:
(if ;když (is (application_name) "firefox-bin") ;je jméno spustitelného souboru firefox-bin (set_workspace 2) ;přesuň jeho okna na plochu 2 )
Z následujícího pravidla je patrné, jak se píšou komentáře, stačí napsat středník a zbytek řádku je ignorován. Jinak tento příklad prostě přesune každé okno Firefoxu na plochu s číslem 2.
Pokud využívate služeb programu compiz (grafické efekty), tak namísto ""set_workspace"" musíte použít ""set_viewport"".
operátory
is
Používá se pro porovnání řetězců, které musí být naprosto stejné. Například:
(if ;když (is (application_name) "synaptic") ;je jméno spustitelného souboru synaptic (set_workspace 3) ;přesuň jeho okna na plochu 3 )
contains
Pro splnění podmínky stačí, matcher obsahoval řetězec v uvozovkách. Podmínka bude splněna i když bude hodnota například matcheru Náhled "Ubuntu Česko - Opera a řetězec se kterým je matcher porovnáván je jen Opera, bude podmínka splněna a dojde k provedení akce. Příklad:
(if ;když (contains (window_name) " - muCommander") ;obsahuje popisek okna řetězec " - muCommander" (begin (set_workspace 3) ;přesuň toto okno na plochu 3 (maximize) ; a maximalizuj ho ) )
Tento operátor je velmi užitečný, protože spoustu aplikací se z nějakého důvodu nepodaří detekovat pomocí matcheru application-name a přesné porovnávání popisku by nemělo cenu, protože většina aplikací popisek svých oken mění (například podle zobrazovaného dokumentu), jen část ho stále zůstává stejná.
matchery
window_name
Jméno okna, zobrazuje se v horním pruhu u každého okna
application_name
Jméno souboru aplikace, která okno vytvořila. Detekce bohužel funguje, jak se jí chce, takže je lepší používat window_name nebo window_class
window_class
Vytvoří-li jedna aplikace více oken, můžeme vytvořit podmínku, na kterou všechna okna dané aplikace zareagují. Jakou má okno window_class zjistíme následovně:
- Otevřeme terminál
- Zadáme příkaz:
xprop |grep WM_CLASS
- Kurzorem klikneme na požadované okno. Výstup bude vypadat nějak takto:
WM_CLASS(STRING) = "gimp", "Gimp"
Příkaz nám vrátil dva alternativní názvy třídy okna, pomocí kterého se na okna stejné aplikace můžeme odkazovat.
Příklad:
(if ;když (is (window_class) "gimp") ;je okno členem třídy "gimp" (set_workspace 4) ;přesuň toto okno na plochu 4 )
Přesune všechna okna "Gimpu" na stejnou plochu.
akce
set_workspace
Přesune okno splňující podmínky na předem určenou plochu. Příklad:
(if ;když (is (window_class) "gimp") ;je okno členem třídy "gimp" (set_workspace 4) ;přesuň toto okno na plochu 4 )
maximize
Maximalizuje okno. Příklad:
(if ;když (begin (is (application_name) "firefox-bin") ;je jméno spustitelného souboru firefox-bin (set_workspace 2) ;přesuň jeho okna na plochu 2 (maximize) ; a maximalizuj ) )
minimize
Funguje jako maximize, akorát okno minimalizuje
geometry
Umožňuje nastavit pozici a rozměry okna v pixelech. Tyto hodnoty je však potřeba nejdříve zjistit. Použijte následující postup:
- Otevřete si příslušné okno a nastavte si jeho velikost a pozici na obrazovce jak se vám hodí
- Zadejte v terminálu
xwininfo | grep geometry
a kurzorem klikněte na ono okno. Výstupem bude něco jako
-geometry 218x405-0+0
-
Zadejte záskaná čísla jako parametr akce geometry. Příklad:
(if ;když (is (window_name) "Seznam kamarádů") ; je zobrazeno hlavní okno Pidginu (geometry "218x405-0+0") ;nastav jej do pravého horního rohu a změň jeho rozměry )
focus
Nastaví okno jako aktivní.
close
Jednoduše okno splňující podmínky zase zavře. Praktická aplikace mě nějak nenapadá
pin
Nastaví okno aby bylo viditelné na všech virtuálních plochách. Velmi praktická funkce, i když nyní již nahraditelná pomocí obdobné funkce poskytované managerem Metacity. Příklad:
(if ;když (is (window_class) "Pidgin") ;je třída okna "Pidgin" (pin) ;zobrazuj na všech plochách )
above
Okno bude vždy navrchu, nikdy nebude překryto. Příklad:
(if ;když (is (window_class) "gimp") ;je okno členem třídy "gimp" (above) ;Zakáže překrývání oken Gimpu )
below
Opak minulé akce, zařídí, že bude dané okno vždy v nejnižší vrstvě oken (nikdy žádné okno nepřekryje). Používá se zcela stejně.
undecorate
Odstraní horní lištu ("titulek") okna.
opacity
Nastaví průhlednost příslušnému oknu. Bohužel, podle mých zkušeností nefunguje.
(if ;když (is (application_name) "xterm") ;je jméno spustitelného souboru xterm (opacity 50) ; nastav jeho průhlednost na 50% )
skip_tasklist
Okno nevytvoří "tlačítko" na liště jako obyčejně.
spawn_sync
Spustí externí příkaz. Příklad:
(if ;když (is (application_name) "firefox-bin") ;je jméno spustitelného souboru firefox-bin (spawn_sync "iwconfig wlan0 essid /essid/ key /key/" ; připoj se k wifi "dhclient" ; získej IP ) )
Po otevření firefoxu se automaticky připojí k WiFi síťi
println
Testovací akce, nepřesouvá okna, jenom vytiskne na standardní výstup programu Devil's pie požadovaný text. Abyste jej viděli musíte spustit Devil's pie z příkazové řádky:
sudo killall devilspie #zabije případnou instanci spuštěnou po startu devilspie #nastartuje devil's pie
Pokud nyní uložíte do konfiguračního souboru například
(if ;když (is (window_class) "gimp") ;je okno členem třídy "gimp" (println "Okno Gimpu detekováno") ;vypiš text )
Zdroj: wiki.ubuntu.cz