====== Automatické rozmisťování oken ======
{{.:tip.png}} Uživatelé kteří mají funkční [[Akcelerované prostředí]], mohou velmi jednoduše nastavit rozmisťování oken pomocí správce jeho nastavení. V Ubuntu je to [[Compiz Fusion#Mana.2BAX4-er_nastaven.2BAO0_Compizu|Manažer nastavení compizu]].
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čí [[Instalace programů|nainstalovat]] balík [[apt://devilspie|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"".
:!: Toto je jen základní tvar jednoduchého pravidla. Schéma tvoření složitějších pravidel najdete na [[http://foosel.org/linux/devilspie|specializované wiki]].
===== 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
)
vypíše při každém otevření okna s třídou ''gimp'' vámi zadaný text v uvozovkách. Tato akce samořejmě slouží jen jako nástroj pro testování, zda jsou pravidla definována správně.
====== Odkazy ======
* [[http://foosel.org/linux/devilspie|Podrobná příručka k Devil's pie]]
* [[http://burtonini.com/blog/computers/devilspie|Domovská stránka programu]]
{{page>Úpravy/Grafika}}
{{page>Úpravy/Konvence}}