xrandr par l'exemple

Troumad alias Bernard SIAUD

gestion de l'affichage avec xrandr

- Titre : xrandr par l'exemple

- Auteur : Troumad alias Bernard SIAUD

- Parution : 15 novembre 2009

- Mise à jour : 7 novembre 2012

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Bernard Siaud. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Avant-Propos

- 1. Présentation de xrandr

- 2. Version de xrandr

- 3. Utilisation de xrandr

- 3-1. État d'origine

- 3-2. Placement des écrans

- 3-3. Adaptations simples à l'environnement

- 3-4. Les options de xrandr 1.3

- 3-4-1. L'option panning

- 3-4-2. L'option transform

- 3-4-3. L'option scale

- 3-4-4. L'option primary

- 4. Une petite aide pour vidéo projecteur, un cas pratique

- 4-1. Environnement au départ

- 4-2. Modification de l'affichage des écrans

- 4-3. Voir l'écran entier du vidéo projecteur sur l'ordinateur

- 4-3-1. La mise à l'échelle

- 4-3-2. Le mode panorama

- 4-4. Affichage trapézoïdal

- 5. L'affichage en 1360x768

- 6. La sortie svideo

- 7. Les parties invisibles

- 8. D'autres petits outils

- 8-1. Option --set

- 9. Les GUI de xrandr

- 10. Conclusion

- 11. Remerciements

Avant-Propos

xrandr commence à supplanter xorg.conf pour la gestion de l'affichage. Bien que toujours utile pour définir certains modes écrans, xorg.conf ne gère plus tout. Il est même remplacé par xrandr pour la gestion du double écran par certains drivers comme les drivers Intel.

De plus, les possibilités de xrandr étant si importantes, il devient parfois même intéressant de savoir l'utiliser pour la manipulation d'un seul écran même si ce papier est orienté vers l'utilisation de plusieurs écrans.

Ces deux raisons font que xrandr mérite d'avoir sa page à lui tout seul. Je ne laisse donc qu'un bref résumé sur la page "Exemples d'affichage sous deux écrans avec Linux" pour me permettre d'en dire beaucoup plus ici.

1 - Présentation de xrandr

J'ai découvert xrandr le jour où xorg.conf ne gérait plus mon double écran. En effet, il semblerait que la configuration par xorg.conf deviendra assez vite désuète. Un des gros avantages de cette dernière est de pouvoir reconfigurer l'affichage sans avoir à relancer le serveur X. C'est donc très pratique dès que l'environnement est variable, comme avec un ordinateur portable.

La meilleure façon d'appréhender les possibilités de xrandr est de regarder man xrandr qui est traduit en français. Attention, seules les versions de RandR (composante de xorg) supérieures ou égales à 1.2 peuvent configurer un affichage sur deux écrans. Ceci est valable à partir de la version 1.2 de xorg.

Le double écran n'est plus géré par le fichier de configuration /etc/X11/xorg.conf, mais il est géré par l'utilisateur final qui peut l'adapter à ses besoins. Au début, xorg.conf ne devait générer qu'un écran virtuel englobant l'affichage qu'on voulait avoir. Ce xorg.conf sera donc simplifié. Voici la partie spécifique à l'affichage :

Section "Monitor"
Identifier "monitor1"
VendorName "Plug'n Play"
ModelName ""

HorizSync 28.0 - 81.0
VertRefresh 56.0 - 75.0
Modeline "1360x768_60.00"  85.86  1366 1460 1604 1800  768 769 772 795  -HSync +Vsync
Option "DPMS"
EndSection

Section "Device"
Identifier "device1"
VendorName "Intel Corp."
BoardName "Intel 915"
Driver "Intel"
BusID "PCI:0:2:0"  # plus dans les dernières configurations
Option "DPMS"
Option "XaaNoOffscreenPixmaps" #"1"  # plus dans les dernières configurations
Option "SWCursor"  # plus dans les dernières configurations
EndSection

Section "Screen"
Identifier "screen1"
Device "device1"
Monitor "monitor1"
DefaultColorDepth 16

Subsection "Display" # plus utile dans les dernières configurations de xrandr
Virtual 2304 1536
# je pourrais mettre côte à côte un écran de 1024 de large et un autre de 1280
# ou l'un sur l'autre 2 écrans de 768 de haut
EndSubsection
EndSection

Section "ServerLayout"
Identifier "xrandr"
InputDevice "Keyboard1" "CoreKeyboard" # plus dans les dernières configurations
InputDevice "Mouse1" "CorePointer" # plus dans les dernières configurations
InputDevice "SynapticsMouse1" "AlwaysCore" # plus dans les dernières configurations
Screen "screen1"
EndSection

Avec la dernière version (xrandr 1.3), la sous partie Subsection "Display" de la Section "Screen" est devenue inutile.

2 - Version de xrandr

Un xrandr vous informera rapidement des possibilités de votre configuration :

[troumad@portable][~/tmp]$ xrandr --prop
xrandr: Server RandR version before 1.2

[troumad@localhost][~]  xrandr
Screen 0: minimum 1600 x 600, current 2048 x 768, maximum 2048 x 768
default connected 2048x768+0+0 0mm x 0mm
2048x768      429.0*
1600x600      429.0

Le premier exemple indique la présence d'une version trop ancienne de RandR pour pouvoir gérer un affichage sur 2 écrans. Le second affiche une configuration avec un seul écran. Le plus surprenant, dans ce second cas, c'est qu'on a déjà un affichage sur 2 écrans avec le driver ATI. Donc, dans l'état des choses, xrandr ne pouvait rien faire à ce niveau. Cependant, pour pouvoir avoir cet affichage sur deux écrans, j'ai dû modifier le xorg.conf par rapport à l'ancienne version de xorg :

[...]

Section "Device"
[...]
Option "MetaModes" "1024x768-1024x768 800x600-800x600"
[...]
EndSection

Section "Screen"
[...]
Subsection "Display"
Modes "1024x768"
Virtual 2048 768
EndSubsection
EndSection

[...]

Section "ServerLayout"
Identifier "layout1"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
Screen "screen0"
EndSection

Ça marchait comme ça, mais je n'étais pas heureux de cet état des choses car je n'avais défini nulle part la place relative des deux écrans. Il y a NVIDIA qui n'est pas compatible avec xrandr. Avec ce driver, il faut utiliser les outils NVIDIA pour configurer son double écran. Le driver libre nv permet d'utiliser xrandr.

3 - Utilisation de xrandr

Toutes les explications ici présentées n'ont été testées qu'avec le driver Intel sur des chipsets Intel. Si vous avez des retours sur d'autres chipsets, je serai heureux de les avoir.

3-1 - État d'origine

Par défaut, il y a le même affichage sur les deux écrans, même si parfois, ils ont une taille différente. Dans ce cas, soit le petit écran ne va afficher qu'une partie de l'écran soit le grand écran s'adaptera pour afficher la configuration du petit. L'utilisateur verra sur le total de ces deux écrans l'image ci-dessous :

Il vous restera alors à configurer votre affichage : la place d'un écran par rapport à l'autre.

C'est encore avec xrandr qu'on va identifier nos écrans ainsi que leurs modes disponibles. xrandr --prop pourra apporter plus de renseignements.

[troumad@portable][~]$ xrandr
Screen 0: minimum 320 x 200, current 2304 x 1024, maximum 2304 x 1536
VGA connected 1280x1024+1024+0 (normal left inverted right) 376mm x 301mm
1280x1024      60.0*+   59.9
1360x768_60.00   60.0
1152x864       75.0     74.8
1024x768       70.1     60.0
832x624        74.6
800x600        72.2     75.0     60.3     56.2
640x480        75.0     72.8     66.7     60.0
720x400        70.1
LVDS connected 1024x768+0+0 (normal left inverted right) 304mm x 228mm
1024x768       60.0*+
800x600        60.3
640x480        59.9
TMDS-1 disconnected (normal left inverted right)
TV disconnected (normal left inverted right)

Je repère avec cette instruction que j'ai quatre sorties écran (malheureusement, je n'en ai que 3 réellement). La première : la sortie VGA, la seconde : l'écran du portable, la troisième : inconnue et la quatrième, la sortie TV. Au début, je voyais que mon écran plat n'était pas entièrement reconnu : il manquait le mode 1280x1024 ! Ceci était dû au mauvais paramétrage des paramètres HorizSync et VertRefresh. Je repère aussi les modes conseillés avec le "*" et le mode actuel avec le "+".

3-2 - Placement des écrans

Pour la mise en place du double écran, avec xrandr 1.2, l'écran virtuel maximal défini dans la section Screen : Virtual 2304 1536 doit contenir l'ensemble des deux écrans. xrandr pourra s'utiliser simplement comme ceci : xrandr --output VGA --above LVDS ou comme ceci : randr --output LVDS --left-of VGA. Au démarrage, l'affichage se fait en mode clone sur les deux écrans, cette dernière instruction leur permet d'afficher chacun une partie différente de l'écran virtuel et d'étendre l'écran virtuel sur le rectangle minimal couvrant notre affichage. Si on place juste les écrans dessus, dessous, à gauche ou à droite, les écrans sont alignés par défaut comme avec l'ancienne version de xorg : par le haut et la droite.

Si vous voulez modifier un réglage précédent, je vous conseille de revenir à zéro avant de le faire :

[troumad@portable][~]$ xrandr --output LVDS --pos 0x0
[troumad@portable][~]$ xrandr --output LVDS --pos 0x0
[troumad@portable][~]$ xrandr --output VGA --pos 1026x-230
[troumad@portable][~]$ xrandr
Screen 0: minimum 320 x 200, current 2306 x 1024, maximum 2390 x 1536
VGA connected 1280x1024+1026+0 (normal left inverted right) 376mm x 301mm
1280x1024      60.0*+   59.9
1360x768_60.00   60.0
1152x864       75.0     74.8
1024x768       70.1     60.0
832x624        74.6
800x600        72.2     75.0     60.3     56.2
640x480        75.0     72.8     66.7     60.0
720x400        70.1
LVDS connected 1024x768+0+230 (normal left inverted right) 304mm x 228mm
1024x768       60.0*+
800x600        60.3
640x480        59.9
TMDS-1 disconnected (normal left inverted right)
TV disconnected (normal left inverted right)

J'ai fait un réglage avec un nombre négatif : au lieu de descendre l'écran VGA, ce réglage a monté l'écran LVDS. On voit ceci avec le xrandr que j'ai fait juste après : les coordonnées de l'écran VGA sont 1026+0 et celle du LVDS sont 0+230. Il faut donc faire attention avec l'utilisation d'une coordonnée négative sur un écran car pour l'annuler, il faut intervenir sur celles de tous les autres. Voici le résultat final :

Copie d'écran éffectuée sous iceWM.

3-3 - Adaptations simples à l'environnement

xrandr possède de nombreux autres avantages et permet de s'adapter à de nombreuses situations suivant où vous arrivez avec votre ordinateur portable :

- le vidéoprojecteur est accroché au plafond et l'image est à l'envers : xrandr --output VGA --rotate inverted ou xrandr --output VGA --reflect xy. Le vidéoprojecteur peut même être posé sur le côté, dans ce cas, on dispose de 'left' ou 'right'. xrandr --output VGA --rotate normal si vous venez de faire l'essai sur un écran dans le bon sens afin de retrouver la configuration initiale ;) .

- Le vidéoprojecteur éclaire l'envers de l'écran qu'on voit par transparence : xrandr --output VGA --reflect x et xrandr --output VGA --reflect normal pour revenir dans la configuration d'origine (--reflect ne marchait pas chez moi avec xrandr 1.2, mais marche avec xrandr 1.3).

- Un vidéoprojecteur à l'envers par transparence : somme des deux points précédents ou uniquement une symétrie suivant y (attention au maniement de sa souris si vous faites vos essais sur un écran normal)...

3-4 - Les options de xrandr 1.3

Leur maniement n'est pas toujours aisé. Leur utilité n'est pas toujours évidente (me prévenir si vous avez des exemples concrets d'application). Elles peuvent apporter néanmoins un certain confort dans ce cadre de diaporama sur vidéoprojecteur par exemple. Voici la configuration à partir de laquelle je fais mes essais.

[troumad@iutb-geii-p46][~/xrandr]$ xrandr
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1920x1440      60.0
1856x1392      60.0
2560x960_60    60.0
1792x1344      60.0
1600x1200      60.0
2048x768_60    60.0
1400x1050      60.0
1280x1024      60.0*
1280x960       60.0
1360x768_60    60.0
1280x800       60.0
1024x768       60.0
1280x600_60    60.0
1024x600_60    60.0
1024x480_60    60.0
800x600        60.3
640x480        59.9
LVDS1 connected 1280x800+1280+204 (normal left inverted right x axis y axis) 331mm x 207mm
1280x800       60.0*+   40.0
1024x768       85.0     75.0     70.1     60.0
832x624        74.6
800x600        85.1     72.2     75.0     60.3     56.2
640x480        85.0     72.8     75.0     59.9
720x400        85.0
640x400        85.1
640x350        85.1
DVI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
DVI2 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP3 disconnected (normal left inverted right x axis y axis)
TV1 disconnected (normal left inverted right x axis y axis)

Notez le changement de dénomination des écrans VGA est devenu VGA1 et LVDS est devenu LVDS1. C'est l'arrivée de xrandr 1.3. Pour activer les options de xrandr 1.3, il faut parfois retourner dans la configuration de départ. J'ai donc fait un alias qui remet tout à zéro. C'est d'autant plus important qu'il permet simplement de retrouver un écran utilisable.

[troumad@iutb-geii-p46][~/xrandr]$ alias ecran0
alias ecran0='xrandr  --output VGA1 --pos 0x0 --panning 0x0 --transform none --output LVDS1 --pos 0x0 --panning 0x0  --transform none'

3-4-1 - L'option panning

Elle permet de suivre la souris sur un écran réel plus petit que l'écran virtuel. La remise à zéro de la configuration de l'écran est indispensable. Avec ma configuration de départ, voici comment je m'en sers :

[troumad@iutb-geii-p46][~/xrandr]$ ecran0
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --mode 720x400
xrandr: Configure crtc 1 invalid time
[troumad@iutb-geii-p46][~/xrandr]$ ecran0
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --mode 720x400
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024

Étudions un peu ce que j'ai fait. Ma première instruction, c'est pour récupérer la configuration de départ indispensable pour activer l'option xrandr. Après, je définis le suivi. Pour ceci, je considère que mon petit écran (celui du portable) va suivre le grand (l'extérieur, un bon vidéo projecteur). Autant donner la taille complète du grand écran à suivre. Si on donne plus petit, on ne suivra pas tout l'affichage, si on donne plus grand, on créera une zone vide (noire) sur les bords droits et bas du petit écran.

Après, je considère que l'écran de mon protable est un peu loin, je le vois mal et je n'ai pas envie de me retourner sans arrêt pour voir exactement ce que fait la souris. Je change donc la configuration de l'affichage du petit écran. Et là ? Erreur ! Cette manipulation n'est pas prévue dans ce mode d'affichage, je reviens à zéro "ecran0" et je peux alors définir la nouvelle configuration de l'écran et définir à nouveau la zone de suivi.

Ceci est l'utilisation simple de cette option, il existe encore beaucoup de paramètres que nous allons étudier dans l'ordre d'arrivée.

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1260x1004
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024+20+20
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1260x1004+20+20
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1240x984+20+20

Les deux paramètres suivants permettent de réduire la zone de suivi. La première ligne sans ces paramètres, rogne la droite et le bas uniquement des 20 pixels manquants. Si on veut rogner le haut et la gauche, on peut essayer la seconde ligne. Mais alors, il apparaît une zone vide (noire) en bas et à droite. Pour que cette zone disparaisse, il faut alors réduire l'affichage de 20 dans les deux directions : la ligne 3. Si on veut rogner de 20 les 4 directions, il faut mettre la ligne 4. Je vous laisse là-dessus pour faire vos propres essais avant de passer à la suite.

Les quatre paramètres suivants, indispensables pour accéder aux suivants, me semblent sans trop d'intérêts : on a l'impression qu'ils ne font rien de plus que les précédents. En effet, les deux commandes suivantes donnent les mêmes résultats :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1080x824+100+100
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024+0+0/1080x824+100+100

Les quatre derniers peuvent apporter un intérêt pour le suivi. En effet, la zone de suivi doit bouger pour suivre la souris, la souris se trouve en bord d'écran et on ne peut pas anticiper. Ces options permettent de voir un peu plus loin ce qui va arriver. Voici par exemple comment avoir 100 pixels d'avance de déplacement :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024+0+0/1280x1024+0+0/100/100/100/100

Maintenant, on peut voir une action particulière de la seconde série de paramètres avec les commandes suivantes :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1080x824+100+100/1280x1024+0+0/100/100/100/100
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1080x824+100+100/1080x824+0+0/100/100/100/100
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1280x1024+0+0/1080x824+100+100/100/100/100/100
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --panning 1080x824+100+100

La première et la seconde me semblent farfelues. La troisième montre l'effet de la seconde série de paramètres. Pour ceci, il suffit de faire le tour de l'écran virtuel avec la souris à moins de 100 pixels du bord : l'écran réel LVDS1 ne bougera pas. Alors que la quatrième commande implique le même affichage, mais l'écran LVDS1 suivra la souris pendant ce même tour.

3-4-2 - L'option transform

Voir Coordonnées homogènes pour la théorie mathématique.

--transform a,b,c,d,e,f,g,h,i,j permet au point de coordonnées (x,y) de l'écran réel d'afficher le point de l'écran virtuel dont les coordonnées se calculent de la manière suivante

On va faire nos transformations petit à petit. Je vais détailler autant que possible les étapes. Pour voir ce qui se passe, on divise par 4 la taille de l'affichage :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --transform 1,0,0,0,1,0,0,0,.25

Après, on place l'origine au milieu de l'écran dont la taille est 1280x800 :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --transform 1,0,-640,0,1,0,0,0,.25
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --transform 1,0,-640,0,1,-400,0,0,.25

On voit que ce n'est pas facile de maintenir la souris dans l'écran : l'écran virtuel est trop grand ! On le façonne à la taille du grand écran :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --fb 1280x1024

On divise la taille encore par deux avec deux autres méthodes :

[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --transform 2,0,-640,0,2,-400,0,0,.25
[troumad@iutb-geii-p46][~/xrandr]$ xrandr --output LVDS1 --transform 1,0,-640,0,1,-400,0,0,.125

On voit que une des deux méthodes a changé la place du centre ! Pourquoi ? Simplement parce que le déplacement (avec les paramètres c et f) n'est pas multiplié par la matrice 2x2 du début.

Maintenant, on va faire des rotations. Il faut savoir que mathématiquement parlant, une rotation de vecteurs d'un angle t se fait avec la formule suivante :
(sens inverse des aiguilles d'une montre, mais ici, l'axe des x est inversé, vers le bas au lieu de vers le haut). Voici un exemple avec une rotation de 45° suivit d'un recentrage.

[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform .7071,-0.7071,0,.7071,.7071,0,0,0,.25
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform .7071,-0.7071,0,.7071,.7071,-905,0,0,.25
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform .7071,-0.7071,-170,.7071,.7071,-735,0,0,.25

Vous allez demander pourquoi cette translation de (-170,-735) pour arriver au même point qu'avec la translation de (-640,-400) de l'affichage droit du début ! Encore comme tout à l'heure : la translation subit la rotation à rebours ! C'est-à-dire qu'elle se fait sur les axes qui ont subi la rotation. On vérifie bien que (-170)cos t + (-735).sin t = -640 et - (-170)sin t + (-735)cos t = -400 (produit matriciel). Pour les autres transformations à partir de la matrice faite des coefficients a, b, d et e, la théorie serait bien intéressante, mais elle fait appel à des notions mathématiques qui trouveraient ici enfin une application pratique facile à voir ! C'est la notion des vecteurs propres et des valeurs propres.

Il nous reste deux coefficients qu'on n'a pas encore étudiés. Nous allons nous y mettre avec des photos d'écrans cette fois. Comme ils sont multipliés par x pour c et y pour f afin de donner un coefficient d'étirement, il faut que ( g.x+h.y + i ) reste petit (pas beaucoup plus grand que 1 au maximum), ils ne devraient donc de pas dépasser 1/1000=0,001. Je teste alors :

xrandr --output LVDS1 --transform 1,0,0,0,1,0,0.00054,0,.25

Je vérifie ma formule : pour mon écran de 33,3 cm de long (1280 points), le bas est atteint au bout de 25,6 cm (985 points). Si avec la formule, je calcule la coordonnée du bas du point (985,800) : 800x1/(0,00054*985+0,25)=1023,... j'ai presque le 1024 attendu. En changeant le 0,00054 par 0,00059, j'atteins la largeur complète, c'est aussi vérifié par calcul. Comme on peut encore vérifier avec les calculs, j'obtiens la hauteur complète avec le code de gauche ci-dessous et pour le fun , je fais un autre essai avec la dernière formule à droite.

xrandr --output LVDS1 --transform 1,0,0,0,1,0,0,0.00068,.25

xrandr --output LVDS1 --transform 1,0,0,0,1,0,0.0004,0.0004,.25

Comme vous l'avez peut-être remarqué, le nombre de paramètres est long ! Heureusement, en pensant à cette option les concepteurs ont pensé à une solution simple pour revenir à la configuration initiale : juste un seul paramètre : none.

xrandr --output LVDS1 --transform none

3-4-3 - L'option scale

Elle est juste là pour simplifier la vie et éviter d'avoir à utiliser l'option transform pour des changements d'échelle. Voici trois listes de transformations équivalentes :

[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform 1,0,0,0,1,0,0,0,.5
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform 2,0,0,0,2,0,0,0,1
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --scale 2x2

[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --scale 2x1
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform 2,0,0,0,1,0,0,0,1

[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --transform 1,0,0,0,2,0,0,0,1
[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --scale 1x2

3-4-4 - L'option primary

[troumad@iutb-geii-p46][~]$ xrandr --output LVDS1 --primary
[troumad@iutb-geii-p46][~]$ xrandr --output VGA1 --primary

Ces commandes permettent de changer l'écran qui sera considéré comme l'écran 1 et écran 2. On peut le voir avec Krandr onglet moniteurs Multiples bouton en bas à droite [Identifier tous les affichages].

4 - Une petite aide pour vidéo projecteur, un cas pratique

4-1 - Environnement au départ

Je vais ici décrire ici une manipulation simple pour régler le vidéo projecteur et l'écran de votre portable. Comme je veux qu'elle soit efficace, on est obligé de passer par la ligne de commande. Il faut donc commencer par ouvrir un terminal konsole ou terminal par exemple.

On commence par régler l'affichage des écrans. On va voir les meilleures définitions pour chaque écran. C'est la commande xrandr qui va nous éclairer !

Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1400x1050      60.0
1280x1024      60.0 +
1280x960       60.0*
1280x800       60.0
1024x768       60.0
800x600        60.3     56.2
640x480        59.9
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
1280x800       60.0 +   40.0
1024x768       85.0*    75.0     70.1     60.0
832x624        74.6
800x600        85.1     72.2     75.0     60.3     56.2
640x480        85.0     72.8     75.0     59.9
720x400        85.0
640x400        85.1
640x350        85.1
DVI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
DVI2 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP3 disconnected (normal left inverted right x axis y axis)
TV1 disconnected (normal left inverted right x axis y axis)

Tout commence mal ! Les deux écrans sont mal réglés, ou, ne sont pas sur leur configuration optimale ! C'est à dire que pour les deux entrées, le * et le + ne sont pas sur la même ligne. Le * montre la configuration actuelle et le + l'optimale.

4-2 - Modification de l'affichage des écrans

On va régler ceci de suite :

xrandr --output VGA1 --mode 1280x1024
xrandr --output LVDS1 --mode 1280x800

On vient de donner aux deux écrans leur définition (mode) optimale. Ceci dit, ceci peut se faire en une seule ligne de commande :

xrandr --output VGA1 --mode 1280x1024 --output LVDS1 --mode 1280x800

4-3 - Voir l'écran entier du vidéo projecteur sur l'ordinateur

Après, on a un problème, l'écran de notre portable ne visionne pas tout l'écran vidéoprojeté ! Comme souvent il est dans notre dos, soit on attrape un torticolis à force de regarder l'écran vidéoprojeté, soit on trouve une solution. Et bien, je fais mieux, je vous en propose deux ! Mais, toutes les deux nécessitent xrandr 1.3.

4-3-1 - La mise à l'échelle

La première, que je conseillerais si on arrive à voir le "petit" écran du portable, c'est de changer l'échelle d'affichage sur l'écran du portable. On repère la taille en x des deux écrans. Pour le vidéoprojecteur, c'est Xv=1280 et pour l'écran du portable, c'est Xp=1280. Ceci nous fait un rapport de a=Xv/Xp=1. On fait de même avec la hauteur, vidéoprojecteur Yv=1024, portable Yp=800 pour b=Yv/Yp=1.28. Mes coefficient d'échelle seront donc axb ou 1x1.28. Ceci donnera la commande suivante :

xrandr --output LVDS1 --scale 1x1.28

Je viens de faire un petit programme C pour faire tout ça automatiquement : optimise.c.

4-3-2 - Le mode panorama

La seconde que je propose, c'est que l'écran du portable suive la souris sur l'écran du vidéo projecteur dont, je rappelle, le mode de fonctionnement est 1280x1024. Ceci donnera comme commande :

xrandr --output LVDS1 --panning 1280x1024

Dès que la souris veut sortir de l'écran du portable, l'écran du portable suit la souris. Si ensuite, on est gêné par le manque d'anticipation qu'on est obligé d'avoir lorsque la souris arrive au bord de l'écran du portable, on peut prévoir une marge, disons 100 sur chaque bord, dans ce cas, la commande devient :

xrandr --output LVDS1 --panning 1280x1024+0+0/1280x1024+0+0/100/100/100/100

4-4 - Affichage trapézoïdal

Si votre rétroprojecteur éclaire de biais votre écran (trop haut, trop bas, trop à gauche, trop à droite), alors l'affichage sur l'écran devient trapèzoïdal. Il est possible avec xrandr de régler ce problème avec l'option transform. Voici l'exemple avec le projecteur qui est légèrement supérieur à l'écran :

xrandr --fb 1024x768 --output VGA --transform 1.24,0.16,-124,0,1.24,0,0,0.000316,1

5 - L'affichage en 1360x768

J'ai mis par défaut la configuration de cet écran dans mon xorg.comf avec la ligne :

Modeline "1360x768_60.00"  85.86  1366 1460 1604 1800  768 769 772 795  -HSync +Vsync

Cette ligne se trouve avec la commande :

$ gtf 1360 768 60.00

# 1360x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 84.72 MHz
Modeline "1360x768_60.00"  84.72  1360 1424 1568 1776  768 769 772 795  -HSync +Vsync

On peut aussi la rajouter manuellement en deux étapes. Tout d'abord, on définit le mode et après, on l'affecte à un écran :

[troumad@localhost][~]
$ xrandr --newmode "1360x768_60.00"  84.72  1360 1424 1568 1776  768 769 772 795  -HSync +Vsync
[troumad@localhost][~]
$ xrandr --addmode VGA1 "1360x768_60.00"

Bien que lors de la mise en route de xorg, avec mon écran 1360x768, j'ai une définition de 1024x768 sur la sortie VGA (même affichage que l'écran du portable), xrandr offre les mêmes options que précédemment, j'active donc l'affichage en 1360x768 avec une des deux commandes suivantes :

xrandr --output VGA --mode 1360x768_60.00
xrandr --output VGA --auto

J'aurais pu éviter ce problème, mais comme c'est un portable qui est régulièrement sur un écran 1280x1024, je ne peux pas choisir cet écran 16/9 comme configuration principale ! Après, il suffit de placer les deux écrans l'un par rapport à l'autre en fonction de votre configuration locale : xrandr --output LVDS --below VGA par exemple.

6 - La sortie svideo

Dès que la sortie svideo est branchée, l'affichage se fait aussi dessus. La commande xrandr nous montre que la sortie TV est active et on peut donc adapter comme précédement l'affichage de la sortie svideo à la TV qui est en 1024x768 par défaut ainsi que placer la TV par rapport à l'écran de l'ordinateur selon notre disposition locale. Je fais donc un xrandr --output TV --mode 848x480 --above LVDS pour avoir ma configuration finale.

./ecran/TV.png

Vous pouvez remarquer sur
cette copie d'écran l'alignement
à gauche qui se fait naturellement
lors de l'empilement vertical
d'écrans.

7 - Les parties invisibles

Contrairement à l'ancienne version de xorg, les parties invisibles apparaissent dans les copies d'écrans, en plus avec les caractéristiques du fond de l'écran. Pour mieux la voir, je l'ai teintée en gris sur le dessin ci-dessus alors qu'elle aurait du être en beige comme la petite bande de fond d'écran qui reste sur le bord juste à côté. Ceci signale que cette partie existe. Cette existence peut parfois surprendre : la souris peut aller dans cet espace et elle devient donc invisible elle aussi !

8 - D'autres petits outils

8-1 - Option --set

Si on regarde la configuration de notre affichage avec précision : xrandr --prop, nous voyons beaucoup d'options comme pour la luminosité d'un écran ou la configuration d'une sortie TV. L'option set peut nous permettre de faire ces réglages manuellement.

Commençons par la luminosité d'un écran. Pour mon portable, je la repère avec :

$ xrandr --prop
[...]
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
[...]
BACKLIGHT: 15 (0x0000000f)    range:  (0,15)
Backlight: 15 (0x0000000f)    range:  (0,15)
[...]

Je peux la modifier comme ceci pour le rendre moins clair :

$ xrandr --output LVDS1 --set Backlight 10

Je repère aussi la sortie TV de mon ordinateur avec plein d'options :

$ xrandr --prop
TV1 disconnected (normal left inverted right x axis y axis)
bottom margin: 37 (0x00000025)    range:  (0,100)
right margin: 46 (0x0000002e)    range:  (0,100)
top margin: 36 (0x00000024)    range:  (0,100)
left margin: 54 (0x00000036)    range:  (0,100)
mode:    NTSC-M
supported: NTSC-M       NTSC-443     NTSC-J       PAL-M
PAL-N        PAL          480p@59.94Hz 480p@60Hz
576p         720p@60Hz    720p@59.94Hz 720p@50Hz
1080i@50Hz   1080i@60Hz   1080i@59.94H

Je peux en changer plusieurs d'un coup avec une commande de la sortie :

$ xrandr --output TV1 --set mode PAL --set bottom\ margin 50

Ici, tout d'abord, j'ai signalé que mon téléviseur est PAL, après, j'ai modifié la marge du bas.

9 - Les GUI de xrandr

Les GUI de xrandr sont grandr_applet sous gnome et krandr(tary) sous KDE, lxrandr. Mais pour le moment, ils ne gèrent pas tout.

Il y a aussi des logiciels qui n'ont pas encore leur rpm pour Mandriva arandr et zarfy. Eux non plus ne gèrent pas les options de xrandr 1.3 .

Par manque de GUI, j'ai fait un petit programme pour gérer des options de la version 1.3 : optimise.c.

10 - Conclusion

Ces nouvelles options permettent de gérer plusieurs configurations d'affichage différentes sans avoir à passer par une modification du fichier de configuration /etc/X11/xorg.conf. Le grand avantage de cette nouveauté est de pouvoir s'adapter à son environnement graphique sans avoir accès aux droits administrateurs pour modifier un fichier de configuration. Ceci est d'autant plus intéressant que les ordinateurs portables se démocratisent en même temps que les vidéoprojecteurs, donc les utilisateurs sont de plus en plus souvent confrontés à des configurations différentes avec le même matériel.

Commentez

11 - Remerciements

Pour les relectures du premier document sur xorg, je remercie Gorgonite, Miles, trotters213 et mlny84.

Pour la relecture de ce document sur xrandr, je remercie ZedroS et Caro-Line.