====== 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}}