neděle 18. července 2010

Zachování rozmístění oken při přepínání mezi Metacity a Compizem

Compiz je okenní správce (wm), bez jehož možností se již těžko obejdu. Bohužel jeho integrace do systému stále není dokonalá a jsou situace, kdy je nezbytné se ho na chvíli zbavit, protože si nerozumí s některými, především celoobrazovkovými, aplikacemi, jako jsou například hry. Souvisí to mimo jiné i s dostupnou videopamětí - 256MiB je na Compiz s Full HD monitorem málo. Stačí otevřít VBox s podporou 3D, pár dalších oken a už si ani video v celoobrazovkovém režimu nepřehrajete. Zkrátka je potřeba Compiz občas vypnout a přepnout do Metacity, což je původní okenní správce Gnome. To by nebyla taková tragédie, ale je tu problém s nekompatibilitou správy desktopu těchto dvou wm, každý na to má vlastní pohled a tak se při přepnutí z jednoho do druhého sesypou všechna okna na první "plochu". ...


Metacity rozlišuje tzv. pracovní prostory, které definujeme počtem sloupců a řad. Compiz toto trochu rozvedl a tyto pracovní prostory dále dělí na viewporty. Nastavujete počet pracovních prostorů, které jsou od sebe úplně odděleny a každému pracovnímu prostoru definujete viewporty, stejně jako v Metacity pracovní prostory. Pro lepší pochopení - z viewportů se dá dělat ona populární 3D kostka a tu můžete mít v každém pracovním prostoru jinou. A tady je právě ten problém - všechny "plochy" (zde viewporty) Compizu, které jsou v jednom pracovním prostoru, jsou pro Metacity na jedné "ploše", protože Metacity pracovní prostory dál nedělí. V opačném případě je problém v tom, že v Compizu máte nastaven jeden pracovní prostor (rozdělený na viewporty) a Metacity tam cpe okna ze čtyřech. V Ubuntu 10.04 Lucid už ani nejde v Compizu nastavit pracovních prostorů více, takže tato situace je definitivní.
Takhle si to nepředstavuji a tak jsem našel způsob, jak tuto nepříjemnost obejít. Program, který je schopný s tímto problémem pomoci, se jmenuje wmctrl a je k dispozici v repozitáři Ubuntu. wmctrl zprostředkovává interakci s okenními správci kompatibilními se specifikací EWMH/NetWM a důležité je, že Metacity i Compiz s touto specifikací kompatibilní jsou. Pomocí wmctrl od nich můžeme získávat informace i řídit je. V našem případě půjde o to, získat specifikace desktopu a rozmístění jednotlivých oken, abychom je pak mohli po přepnutí wm opět rozmístit na původní místa.

Pro názornou ukázku použiji svůj desktop, který čítá čtyři plochy v jedné řadě. Tedy čtyři pracovní prostory pro Metacity a jednen pracovní prostor se čtyřmi viewporty pro Compiz. Parametry desktopu získáme pomocí příkazu wmctrl -d a výsledek bude vypadat takto:

V Compizu:
$ wmctrl -d
0  * DG: 5120x1024  VP: 1280,0  WA: 0,24 1280x1000  Desk 1

V Metacity:
$ wmctrl -d
0  - DG: 1280x1024  VP: 0,0  WA: 0,24 1280x1000  Desk 1
1  * DG: 1280x1024  VP: N/A  WA: 0,24 1280x1000  Desk 2
2  - DG: 1280x1024  VP: N/A  WA: 0,24 1280x1000  Desk 3
3  - DG: 1280x1024  VP: N/A  WA: 0,24 1280x1000  Desk 4

Jak vidíte, mám monitor s rozlišením 1280x1024, horní Panel má šířku 24 pixelů (WA: 0,24), a aktivní je 2. "plocha" - v Metacity řádek s hvězdičkou, v Compizu si to musíte vypočítat z celkové velikosti desktopu (DG: 5120x1024) a souřadnic levého horního rohu aktivního viewportu (VP: 1280,0). 

Dále je potřeba získat seznam aktivních oken s jejich souřadnicemi.

V Compizu:
$ wmctrl -lG
0x04a6595c -1 0    0    1280 1024 Subscream x-nautilus-desktop
0x04200002 -1 1910 48   320  1000 Subscream Conky (Subscream)
0x04600315  0 0    48   1280 1000 Subscream Blogger – koncept:GdH - Vytvořit záznam - Google Chrome
0x03c00659 -1 52   1884 1227 89   Subscream cairo-dock
0x01000003 -1 0    0    1280 24   Subscream Top Expanded Edge Panel
0x04a4315a  0 -2524 1002 830  462  Subscream bin - File Browser
0x04a42031  0 -2524 254  830  462  Subscream SAMSUNG - File Browser
0x04a44a23  0 788  992  830  462  Subscream Programs_develop - File Browser
0x04a42c05  0 -2524 934  830  462  Subscream bin - File Browser
0x04a65c74  0 704  234  830  462  Subscream Install - File Browser
0x02c0001f  0 0    48   1280 337  Subscream Guake!

V Metacity:
$ wmctrl -lG
0x04a6595c -1 0    0    1280 1024 Subscream x-nautilus-desktop
0x04200002 -1 1910 48   320  1000 Subscream Conky (Subscream)
0x04a4315a  0 20   523  830  462  Subscream bin - File Browser
0x04a42031  0 20   149  830  462  Subscream SAMSUNG - File Browser
0x04a44a23  1 396  518  830  462  Subscream Programs_develop - File Browser
0x04a42c05  0 20   489  830  462  Subscream bin - File Browser
0x04a65c74  1 354  139  830  462  Subscream Install - File Browser
0x04600315  1 0    48   1280 1000 Subscream Blogger – koncept:GdH - Vytvořit záznam - Google Chrome
0x01000003 -1 0    0    1280 24   Subscream Top Expanded Edge Panel
0x03c00659 -1 52   1884 1227 89   Subscream cairo-dock
0x02c0001f -1 0    48   1280 337  Subscream Guake!

První sloupec je id číslo okna, druhý obsahuje číslo pracovního prostoru, ve kterém se okno nachází (číslováno od 0, -1 označuje okna, která se zobrazují na všech), třetí a čtvrtý sloupec jsou souřadnice okna, pátý a šestý jeho rozměry a sedmý obsahuje jméno okna. Jak vidíte v compizu jsou souřadnice okna udávány relativně k levému hornímu rohu aktuálního viewportu (plochy). Je tu ovšem pár chytáků. Jednak souřadnice oken jsou násobené dvěma, nevím proč, ale je to tak přinejmenším od Ubuntu 8.04 až po 10.04. Další perlička je v tom, že přinejmenším okna gnome-terminálu mění id číslo při přepnutí do jiného wm. Tedy přepnete Metacity <-> Compiz a ztratíte kontakt na okna gnome-terminálu (v Ubuntu 8.04 ne, ovšem v 9.04 i 10.04 ano), leda, že budete okna identifikovat i podle jména. Nebo začnete používat třeba Guake terminál a může vám to být jedno. Ve výčtu záludností musím pokračovat, je tu ještě rozdíl v tom, že v Metacity jsou souřadnice oken ovlivněny šířkou levého a horního Panelu, zatímco v Compizu ne.
Je jasné, že data musíte prohnat nějakým tím filtrem, který vybere jen ta užitečná, přepočítat souřadnice oken do použitelného formátu a nakonec, po přepnutí wm, okna opět rozmístit na svá místa. Pokud pro identifikaci oken použijete jejich id, budou vás u příkazu wmctrl zajímat přepínače -i, -r , -e a v případě Metacity ještě -t. Pokud použijete jména oken, obejdete se bez přepínače -i a naopak se může hodit -F. Po rozmístění oken, pak aktivujete původní "plochu", v Compizu  wmctrl -o, jenž vyžaduje souřadnice viewportu, a v Metacity s přepínačem -s, jehož parametrem je pořadové číslo pracovního prostoru ("plochy").

Přikládám svůj skript, který předchozí informace využívá. Je to doplněný skript z mého staršího článku Spouštění programu, který nerad Compiz. Skript má k dokonalosti zatím daleko, ale mně funguje bez problémů a umí několik věcí:

  • Přepíná mezi Compizem a Metacity s tím, že zachovává pozici oken i aktuální "plochu", ale zatím podporuje pouze jednu řadu "ploch"
  • s přepínačem -c /--composit se po přepnutí do Metacity aktivuje kompozitní režim (ten podporuje průhlednost)
  • pokud jako parametr zadáte cestu k programu, nejlépe v jednoduchých uvozovkách, spustí se tento s vypnutým Compizem a po skončení obnoví původní stav - zapne Compiz, pokud byl předtím aktivní. Protože procesy některých her hynou až za delší dobu po tom, co zavřou hlavní okno a je již možné pracovat se systémem, přidal jsem ruční reaktivaci Compizu na kliknutí. V případě automatiky se po návratu z hry UT2004 Compiz reaktivoval někdy až po půl minutě, tak proto.
  • přepínačem -l /--launcher se spustí průvodce, který vám umožní vytvořit spouštěč na Plochu, který automaticky zajistí spouštění vybraného programu s vypnutím Compizu, jako v minulém bodě.
Download: Compiz GSwitch

Pokud budete chtít skript vyzkoušet, nezapomeňte nastavit spustitelný příznak. Skript můžete uložit, kam chcete, ale pokud si s jeho pomocí vytvoříte nějaký ten spouštěč, už s ním nehýbejte, spouštěč by přestal fungovat.

Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.