Correction bizeaux (bezels) multi-écrans avec xrandr
Sous GNU/Linux, quand sont utilisés plusieurs écrans pour étendre le bureau, se pose souvent le problème pour afficher une image, un film ou un jeux vidéo s'étendant sur tous les écrans de manière «réaliste». J'entends par là que nous nous attendons à ce que les écrans affichent une image comme nous la verrions à travers les carreaux d'une fenêtre d'habitation. À moins d'avoir des écrans sans aucune bordure, ce n'est pas du tout ce que nous constatons.
Voici un petit dessin pour illustrer le problème :
____________________ ____________________ ||⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻|||⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻|| || ||| * || || ||| *** || || |||***** || || *|||****** || || **|||******* || ||_______________***|||********__________|| ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻
Cet article va détailler comment modifier notre affichage à l'aide de la commande xrandr
pour corriger cet effet de bizeaux induit par les bordures des écrans.
Le résultat final devra ressembler à cela :
____________________ ____________________ ||⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻|||⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻|| || |||* || || |||** || || |||*** || || *|||**** || || **|||***** || ||_______________***|||******____________|| ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻
Disposition et taille des écrans
Voici un schéma simple pour mieux comprendre la disposition et les dimensions de nos écrans. Ils seront au nombre de trois et de modèles différents :
Gauche Centre Droit _________________ _________________ _________________ | ___________ | | ___________ | | ___________ | | | | | | | | | | | | | | |<--477mm-->| | | |<--478mm-->| | | |<--475mm-->| | | | | | | | | | | | | | | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ | | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ | | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ <------520mm------> <------510mm------> <------515mm------> DisplayPort-1 HDMI-A-0 DisplayPort-2
Les écrans sont alignés horizontalement collés les uns aux autres, mais vous pourrez très bien appliquer les principes décrits ci-après pour des alignements verticaux ou un mix des deux.
Vous pouvez obtenir le nom de vos écrans avec la commande xrandr
sans lui passer de paramètres.
Deux mesures en milimètres sont à relever pour chaque écran :
- La largeur de l'écran (et/ou la hauteur dans une configuration verticale),
- La largeur de la dalle (ou matrice LCD).
Pour la largeur de l'écran il faut effectuer la mesure sois-même avec une règle ou, plus pratique, avec un mètre de tailleur ou de chantier si vous avez.
Les dimensions de la dalle s'affichent lors de l'exécution de la commande xrandr
.
Si comme moi vous souhaitez obtenir une sortie plus compacte de la commande xrandr
vous pouvez faire la commande suivante :
for screen in DisplayPort-1 HDMI-A-0 DisplayPort-2; do xrandr -q -d :0 | grep $screen; done
DisplayPort-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 477mm x 268mm HDMI-A-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 478mm x 269mm DisplayPort-2 connected 1920x1080+3840+0 (normal left inverted right x axis y axis) 475mm x 267mm
Taille de l'affichage virtuel en pixels
Tout d'abord nous devons déterminer pour chaque écran le nombre de pixels contenues dans 1mm. La règle de calcul est la suivante :
Résolution X de l'écran / largeur dalle en mm = Nombre de pixels par milimètres.
Pour chaque écran si nous appliquons ce calcul, nous obtenons :
- Écran gauche :
1920 / 477 = 4.025px/mm
- Écran centre :
1920 / 478 = 4.017px/mm
- Écran droit :
1920 / 475 = 4.042px/mm
Ensuite calculons en pixels la taille des bords de nos écrans. Pour chaque écran :
- Écran gauche :
(520-477) / 2 * 4.025 = 86.538 = 87 pixels
Ce calcul ne prends en compte que le bord droit de l'écran. - Écran centre :
(510-478) * 4.017 = 128.544 = 129 pixels
Ce calcul prends en compte les deux bords de l'écran. - Écran droit :
(515-475) / 2 * 4.042 = 80.84 = 81 pixels
Ce calcul ne prends en compte que le bord gauche de l'écran.
Nous avons tous les éléments nécessaires pour calculer la largeur exacte qu'aura notre affichage en pixels :
1920 * 3 + 87 + 129 + 81 = 6057 pixels
La résolution de notre affichage virtuel sera donc de 6057x1080.
Position des écrans en pixels
Nous devons calculer pour chaque écran sa position de départ en pixels dans notre affichage virtuel. Pour cela, nous prenons en compte la résolution X de chaque écran à laquelle il faut ajouter la taille des bordures correspondantes en pixels calculées précédemment :
- Écran gauche : Position X = 0 (C'est le point de départ, donc il commence bien à 0).
- Écran centre : Position X = 1920 + 87 + (129 / 2) = 2071.5 = 2071
- Écran droit : Position X = 2071 + 1920 + (129 / 2) + 81 = 4136.5 = 4136
Commande xrandr
Nous connaissons la taille de notre affichage virtuel ainsi que la position de départ de chaque écran dans cet espace. Il ne nous reste plus qu'à créer la commande xrandr
correspondante :
xrandr --fb 6057x1080 --output DisplayPort-1 --pos 0x0 --output HDMI-A-0 --pos 2071x0 \
--output DisplayPort-2 --pos 4136x0
Grâce à cette commande finalement très simple, nous pouvons nous passer totalement de devoir tripatouiller dans les fichiers de configuration de notre serveur Xorg pour arriver au même résultat.
À titre personnel je place cette commande dans mon fichier ~/.xinitrc
de manière à ce qu'elle soit exécutée chaque fois que je lance mon gestionnaire de fenêtre avec startx
.
Pour vérifier que les changements soient bien effectifs, relançons de nouveau la commande xrandr
sans arguments pour nous permettre de voir la taille de notre affichage virtuel et la position des écrans :
xrandr
Screen 0: minimum 320 x 200, current 6057 x 1080, maximum 16384 x 16384 DisplayPort-0 disconnected primary (normal left inverted right x axis y axis) DisplayPort-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 477mm x 268mm 1920x1080 60.00*+ 1600x1200 60.00 1680x1050 59.95 1280x1024 75.02 60.02 1440x900 74.98 59.89 1280x960 60.00 1280x800 59.81 1152x864 75.00 1280x720 60.00 1024x768 75.03 70.07 60.00 832x624 74.55 800x600 72.19 75.00 60.32 56.25 640x480 75.00 72.81 66.67 59.94 720x400 70.08 DisplayPort-2 connected 1920x1080+4136+0 (normal left inverted right x axis y axis) 475mm x 267mm 1920x1080 60.00*+ 1680x1050 60.00 1280x1024 75.02 60.02 1440x900 60.00 1280x800 60.00 1152x864 75.00 1280x720 60.00 1024x768 75.03 60.00 800x600 75.00 60.32 640x480 75.00 59.94 720x400 70.08 HDMI-A-0 connected 1920x1080+2071+0 (normal left inverted right x axis y axis) 478mm x 269mm 1920x1080 60.00*+ 59.94 1680x1050 59.88 1280x1024 75.02 60.02 1440x900 74.98 59.90 1280x960 60.00 1280x800 60.00 1152x864 75.00 1280x720 60.00 50.00 59.94 1440x576 50.00 1024x768 75.03 70.07 60.00 832x624 74.55 800x600 72.19 75.00 60.32 56.25 720x576 50.00 720x480 60.00 59.94 640x480 75.00 72.81 66.67 60.00 59.94 720x400 70.08 DVI-D-0 disconnected (normal left inverted right x axis y axis)
Bon ben voilà ça a fonctionné pour moi. J'espère qu'il en sera de même pour vous également ou au moins que cela vous aide dans votre quête d'informations.