Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
automatické_rozmisťování_oken [2012/09/26 09:31]
Vojtěch Trefný old revision restored
automatické_rozmisťování_oken [2019/02/25 18:21] (aktuální)
Řádek 1: Řádek 1:
 +====== 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í:​
 +<​code>​
 +(if
 +  (//​operátor//​ (//​matcher//​) "//​řetězec//"​)
 +  (//akce//)
 +)
 +</​code>​
 +Případně:​
 +<​code>​
 +(if
 +  (//​operátor//​ (//​matcher//​) "//​řetězec//"​)
 +  (begin
 +    //akce1//
 +    //akce2//
 +    ...
 +  )
 +)
 +</​code>​
 +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:
 +
 +<​code>​
 +(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
 +)
 +</​code>​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:​
 +<​code>​
 +(if ;když
 +  (is (application_name) "​synaptic"​) ;je jméno spustitelného souboru synaptic
 +  (set_workspace 3) ;přesuň jeho okna na plochu 3
 +)
 +</​code>​
 +==== 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:
 +<​code>​
 +(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
 +  )
 +)
 +</​code>​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:
 +<​code>​
 +xprop |grep WM_CLASS
 +</​code> ​ - Kurzorem klikneme na požadované okno. Výstup bude vypadat nějak takto:
 +<​code>​
 +WM_CLASS(STRING) = "​gimp",​ "​Gimp"​
 +</​code>​
 +
 +
 +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:
 +<​code>​
 +(if ;když
 +  (is (window_class) "​gimp"​) ;je okno členem třídy "​gimp"​
 +  (set_workspace 4) ;přesuň toto okno na plochu 4
 +)
 +</​code>​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:
 +<​code>​
 +(if ;když
 +  (is (window_class) "​gimp"​) ;je okno členem třídy "​gimp"​
 +  (set_workspace 4) ;přesuň toto okno na plochu 4
 +)
 +</​code>​
 +==== maximize ====
 +Maximalizuje okno. Příklad:
 +<​code>​
 +(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
 +  )
 +)
 +</​code>​
 +==== 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
 +<​code>​
 +xwininfo | grep geometry
 +</​code>​
 +a kurzorem klikněte na ono okno. Výstupem bude něco jako
 +<​code>​
 +-geometry 218x405-0+0
 +</​code> ​ - Zadejte záskaná čísla jako parametr akce ''​geometry''​. Příklad:
 +<​code>​
 +(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
 +)
 +</​code>​
 +
 +
 +==== 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:
 +<​code>​
 +(if ;když
 + (is (window_class) "​Pidgin"​) ;je třída okna "​Pidgin"​
 + (pin) ;zobrazuj na všech plochách
 +)
 +</​code>​
 +==== above ====
 +Okno bude vždy navrchu, nikdy nebude překryto. Příklad:
 +<​code>​
 +(if ;když
 +  (is (window_class) "​gimp"​) ;je okno členem třídy "​gimp"​
 +  (above) ;Zakáže překrývání oken Gimpu
 +)
 +</​code>​
 +==== 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.
 +<​code>​
 +(if ;když
 +  (is (application_name) "​xterm"​) ;je jméno spustitelného souboru xterm
 +  (opacity 50) ; nastav jeho průhlednost na 50%
 +)
 +</​code>​
 +==== skip_tasklist ====
 +Okno nevytvoří "​tlačítko"​ na liště jako obyčejně.
 +
 +==== spawn_sync ====
 +Spustí externí příkaz. Příklad:
 +<​code>​
 +(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
 +  )
 +)
 +</​code>​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:
 +<​code>​
 +sudo killall devilspie #zabije případnou instanci spuštěnou po startu
 +devilspie #nastartuje devil'​s pie
 +</​code>​Pokud nyní uložíte do konfiguračního souboru například
 +<​code>​
 +(if ;když
 +  (is (window_class) "​gimp"​) ;je okno členem třídy "​gimp"​
 +  (println "Okno Gimpu detekováno"​) ​ ;vypiš text
 +)
 +</​code>​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}}