Org Blog de Sys4
17-01-2021

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.

Tags: multi-écrans xrandr linux
Creative Commons License
https://sys4.fr by Sys4 is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.