neděle 6. února 2011

Dva monitory a X RandR

Poslední aktualizace 9.2.11
Již jsem tu psal o přepínání monitorů na grafice Nvidia, jejíž proprietární ovladače zatím nepodporují nástroj pro správu monitorů, který (nejen) Ubuntu obsahuje v základní instalaci. Jedná se o program X RandR (Xorg RandR), který je rozhraním RandR pro příkazový řádek. Jeho pomocí můžete měnit konfiguraci připojených monitorů, měnit rozlišení, rotaci a další věci, které můžete dělat z grafických center ovladačů grafiky, za běhu, bez restartu X serveru. Otevřené ovladače, i uzavřené ovladače AMD/ATI, RandR podporují a tak není potřeba shánět nic dalšího, jako v případě Nvidie, která implementaci stále odkládá.

Program X RandR se volá příkazem xrandr a samozřejmě doporučím pročíst manuál

man xrandr

Přepínání monitorů
Po přechodu z Nvidie na ATI, jsem opět řešil přepínání mých dvou monitorů, z nichž běžně používám jen jeden, podle toho, zda sedím u pracovního stolu, nebo se válím v posteli. Pomocí ACCC (ATI Catalyst Control Center) jsem nakonfiguroval xorg.conf tak, aby se při startu systému spustily oba monitory v klonovaném režimu a sám si po přihlášení vyberu, který budu používat.



Pro přepínání jsem si napsal jednoduchý skript:

switch_monitor.sh
#!/bin/bash

if xrandr --current | grep -q "DFP1 connected [0-9]";
   then
     xrandr --output DFP2 --mode 1920x1200 --output DFP1 --off
   else
      xrandr --output DFP1 --mode 1280x1024 --output DFP2 --off
fi

xrandr --current vypíše aktuální konfiguraci monitorů, bez toho, aby výstupy testoval, tudíž tento příkaz si nevšimne, že jste nějaký monitor připojili, nebo odpojili, zobrazí poslední známý stav. Oproti tomu spuštění samotného xrandr, nebo ekvivalentu xrandr -q, otestuje výstupy a vypíše aktuální stav. Pokud xrandr zjistí, že byl připojen nový druhý monitor, automaticky se tento monitor připojí v režimu rozšíření pracovní plochy, což mívá efekt v podobě pádu Compizu (přepne se na Metacity). Nevím zatím, jak této automatice zabránit, rozhodně o takové chování nestojím.
Výpis obsahuje informace o jménech jednotlivých výstupů, zda jsou k nim připojeny monitory, případně jaké podporují rozlišení, jakou mají rotaci, ..

Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 4096 x 4096
DFP1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024 60.0*+
   1280x960 60.0 +
   1280x800 60.0 +
   1152x864 60.0 +
   1280x768 59.9 +
   1280x720 60.0 +
   1152x648 60.0 +
   1024x768 60.0
   800x600 60.3
   720x480 60.0
   640x480 60.0

... 

Dále uvedený skript ve výpisu konfigurace zjišťuje, zda je aktivní monitor s označením DFP1, což se pozná podle toho, že za slovem connected následuje aktuální rozlišení monitoru, tedy se očekává, že bude následovat nějaké číslo. Pokud budou aktivní oba monitory, nebo DFP1, vypne se DFP1 a DFP2 zůstane zapnutý a nastaví se na nativní rozlišení.

Při použití xrandr je vždy potřeba definovat výstup, který chcete nastavit, k tomu slouží přepínač --output a dále definujete, co s ním. V případě
xrandr --output DFP2 --mode 1920x1200 --output DFP1 --off

nastavuje najednou dva monitory, DFP2 aktivuje v rozlišení 1920x1200 a DFP1 vypne. Můžete využít i automatiky:

xrandr --output DFP2 --auto --output DFP1 --off

kdy přepínač --auto použije preferovaný mód připojeného monitoru. To ale nemusí být, zvláště v případě CRT monitorů, ideální, pokud jste si preferovaný mód sami předtím nenastavili v xorg.conf. Pokud žádaný mód v nabídce xrandr není, můžete ho přidat přepínači --newmode a --addmode, podle manuálu. Přepínač --auto také výstup na monitor vypne, pokud zjistí, že monitor není připojen.
Problém mi způsobuje vymoženost posledních Catalystů - Tear Free Desktop, který je vynikající při sledování videa a jiných pohyblivých záležitostí, méně vynikající je pak fakt, že pokud je tato funkce zapnutá, končí v mém případě pokus o přepnutí na druhý monitor vytuhnutím celého počítače, nejen X. A nejde to nejspíš dočasně vypnout jinak, než přes ACCC, abych si ošetřil přepínací skript.

Rozšíření pracovní plochy
S xrandrem se dají dělat i další kejkle, například rozšířit si pracovní plochu za hranice rozlišení vašeho monitoru.

xrandr --fb 1920x1200 --output DFP1 --mode 1280x1024 --panning 1920x1200

Přpínačem --fb si takto vyrobíte virtuální plochu  o rozměru 1920x1200 na monitoru s rozlišením 1280x1024 a přepínačem --panning nastavíte, že se bude dát výřez posouvat po celé virtuální ploše.
Maximální rozlišení virtuální plochy je potřeba definovat v nastavení Xorgu, jinak je většinou dáno maximálním rozlišením monitoru. Pokud používáte fglrx ovladače ATI, máte již vygenerovaný /etc/X11/xorg.conf, do kterého to můžete připsat do sekce "Screen", subsekce "Display". V Ubuntu 10.10 se jinak využívá místo tradičního xorg.conf souborů v adresáři /usr/share/X11/xorg.conf.d/ ( v Ubuntu 10.04 /usr/lib/X11/xorg.conf.d/), kde mohou být  jednotlivá zařízení nastavována odděleně, což usnadňuje správu.

Section "Screen"
   Identifier "aticonfig-Screen[0]-0"
   Device "aticonfig-Device[0]-0"
   DefaultDepth 24
   SubSection "Display"
      Viewport 0 0
      Depth 24
      Modes "1920x1200"
      Virtual 4096 4096
   EndSubSection
EndSection



Při hrátkách s virtuální plochou ale nejspíše narazíte na komplikace, pokud používáte Compiz, protože neumí větší plochu, než jakou zvládne grafická karta texturu, bývá to 2048x2048 bodů. Jinak se plocha jakoby rozšíří, ale přidaná část pouze zobrazuje náhodná data z videopaměti a nepoužívá se. Stačí vypnout Compiz a začne fungovat. Pokud se vejdete do limitu, může se stát, že Compiz stejně bude zlobit, často pomůže přepnout na Metacity a zase zpět na Compiz. Je také třeba dát pozor na to, že virtuální plocha nastavená v konfiguraci xorgu může nárokovat prostředky grafické karty, i když rozšířenou plochu zrovna nepoužíváte, alespoň při použití fglrx ovladače ATI. Při nastavení z příkladu už mi nešel zapnout ani Tearing Free Desktop, nešlo spustit XBMC, Boxee, zkrátka na videopaměť náročnější aplikace - X hlásily nedostatek prostředků. Compiz přitom fungoval bez problémů a jeho vypnutí zmíněným aplikacím nijak nepomohlo. Použitá HD4870 má 512MB VRAM.

Změna měřítka plochy
Další možností je například nacpat větší plochu na menší displej, nastavením měřítka:

xrandr --fb 1920x1536 --output DFP1 --mode 1280x1024 --scale 1.5x1.5

Tímto bude displej s rozlišením 1280x1024 zobrazovat zmenšenou plochu o rozměrech 1920x1536 bodů. Tedy pouze tehdy, pokud to vaše grafická sestava dovolí. Na Intelu mi to většinou funguje, na Ati nikoliv.

Rozšíření pracovní plochy o druhý monitor

xrandr --output DFP1 --auto --rotate normal --output DFP2 --auto --rotate right --right-of DFP1

Tento příkaz nastaví panel DFP1 na preferovaný mód, bez otočení a připojený DFP2, také v preferovaném módu (rozlišení se přizpůsobí podle menšího monitoru), přidá jako rozšíření pracovní plochy napravo a otočený na výšku po směru hodinových ručiček. Paráda. Ovšem na Catalystech mi na takto připojeném monitoru zmizí kurzor myši. Jen pokud je obraz otočený. Compiz už raději ani nezapínám.

Takže možností je fůra, škoda jen, že to tak úplně nefunfuje :) Nicméně mně stačí v zásadě to přepínání monitorů a to i s ATI funguje dobře.

Odkazy k tématu:
http://www.thinkwiki.org/wiki/Xorg_RandR_1.2
https://wiki.ubuntu.com/X/Config/Resolution

Žá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.