Automatické rozmisťování oken

13.12.2010 17:13

 

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ě:

  1. Otevřeme terminál
  2. Zadáme příkaz:

 

xprop |grep WM_CLASS

 

  1. 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:

  1. Otevřete si příslušné okno a nastavte si jeho velikost a pozici na obrazovce jak se vám hodí
  2. Zadejte v terminálu

 

xwininfo | grep geometry

a kurzorem klikněte na ono okno. Výstupem bude něco jako

-geometry 218x405-0+0

 

  1. 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