Haute densité (HiDPI) avec deux écrans 4K sous Linux

Vincent Bernat

J’utilise un portable Lenovo Thinkpad X1 Carbon (210 PPP) depuis quatre ans ainsi qu’un téléphone Nokia 8 (550 PPP) depuis un an. J’apprécie la haute densité de leurs écrans respectifs : le rendu du texte est excellent. Pour obtenir des résultats similaires avec ma station de travail, j’ai acheté une paire d’écrans Dell P2415Q :

Deux Dell P2415Q
Configuration en écrans doubles avec deux moniteurs Dell P2415Q

Écrans⚓︎

Le Dell P2415Q est un écran 24” doté d’un panneau IPS d’une résolution de 3840×2160 (185 PPP) et une couverture complète de l’espace de couleurs sRGB. Il est sorti en 2015 et son prix est désormais sous la barre des 400 €. Il a reçu des critiques positives.

L’une des unités est arrivé avec un pixel mort. Je pensais qu’il s’agissait d’un problème du passé, mais la politique de Dell concernant les pixels morts stipule :

Lors du processus de fabrication des écrans LCD, un ou plusieurs pixels se figent parfois dans un état immuable. Un écran comportant de 1 à 5 sous-pixels figés est considéré comme normal et conforme aux normes industrielles.

Un deuxième problème est la présence de lignes grises horizontales (difficilement) visibles sur fond blanc. Le problème ne semble pas être rare, mais Dell est peu enthousiaste à ce sujet. Si je m’assois correctement, les lignes deviennent invisibles.

Je suis un peu déçu par ces aspects, mais je pense qu’ils restent supportables et que c’est l’occasion de corriger mon obsession pour ces détails.

Carte graphique⚓︎

Pour piloter un écran 4K à 60 Hz, il faut au moins un connecteur HDMI 2.0 ou DisplayPort 1.2. Le Dell P2415Q a été mis à niveau vers HDMI 2.0 en 2016 et dispose également d’une entrée DP 1.2. Il y a un port pour chaîner un second écran, mais en l’absence de prise en charge de DP 1.3, le taux de rafraîchissement tomberait à 30 Hz.

Il n’y a actuellement aucune carte Radeon disponible autour de 100 € et capable de piloter deux écrans 4K. Côté Nvidia, la GeForce GT 1030 convient avec une consommation de 20 W pour la version GDDR4. J’ai opté pour un modèle à refroidissement passif de MSI. Sous Linux, le résultat est assez décevant :

A l’avenir, je remplacerai peut-être cette carte par une Radeon. Il est difficile de déterminer si cela améliorera les performances,2 mais le pilote amdgpu sera certainement plus stable et utilisable.

Prise en charge de la haute densité avec X11⚓︎

Gnome et KDE prennent désormais en charge les affichages à haute densité (HiDPI) sans configuration particulière sous X11. Pour les autres environnements, le paramétrage est assez simple, grâce à xsettingsd. Le code suivant doit être invoqué à partir de ~/.xsession ou lorsque la densité change :

# Densité cible
dpi=192

# Pour les applications supportant XSettings, `Xft/DPI' indique
# l'échelle pour les fontes (et parfois pour le reste de l'interface),
# `Gdk/WindowScalingFactor' indique l'échelle pour l'interface avec
# GTK 3 et `Gdk/UnscaledDPI' annule l'échelle choisie pour les fontes
# pour les applications GTK 3.
> ~/.xsettingsd cat <<EOF
Xft/DPI $(( $dpi*1024 ))
Gdk/WindowScalingFactor $(( $dpi/96 ))
Gdk/UnscaledDPI $(( $dpi*1024/($dpi/96) ))
EOF
pkill -HUP xsettingsd || xsettingsd &

# Pour les applications QT.
export QT_AUTO_SCREEN_SCALE_FACTOR=1

# Pour certaines autres applications.
echo Xft.dpi: $dpi | xrdb -merge

Ensuite, c’est à chaque application de savoir comment effectuer le rendu à la densité choisie. Le tableau ci-dessous donne un aperçu de la prise en charge pour certaines d’entre elles, en utilisant les paramètres ci-dessus. « Échelle du texte » indique si une application est capable d’adapter la taille du texte. C’est généralement la fonctionnalité la plus essentielle. « Échelle de l’interface » indique si elle est capable de mettre à l’échelle l’ensemble de l’interface, y compris les icônes. Idéalement, les applications devraient également être en mesure de changer dynamiquement leurs paramètres lorsqu’elles sont notifiées via XSettings, ce qui est utile lors du passage sur un écran externe.

Application Échelle du texte Échelle de l’interface Sans redémarrage ?
Applications QT 5 ✔️ ✔️ ✔️
Chromium3 ✔️ ✔️ ✔️
Applications Electron4 ✔️ ✔️ ✔️
Firefox ✔️ ✔️
Blender5 ✔️ ✔️
Emacs 26.1 (GTK 3) ✔️ 😐 ✔️
Terminaux VTE (GTK 3) ✔️ 😐 ✔️
Applications GTK 3 ✔️ 😐 ✔️
Gimp (GTK 2) ✔️ ✔️
Inkscape (GTK 2) ✔️ ✔️
Applications GTK 2 ✔️ ✔️
Applications Java6 🙄 🙄
xterm and rxvt (avec Xft) ✔️ n/a
Autres applications

Les applications QT 5 offrent une excellente prise en charge. Les applications GTK 3 ne peuvent utiliser qu’un coefficient multiplicateur entier pour mettre à l’échelle leurs interfaces, ce qui est ennuyeux quand on a besoin d’un facteur 1.5×. Les applications GTK 2 ne savent adapter que la taille du texte. Elles sont toujours assez nombreuses, avec notamment Gimp. Pour plus de détails, jetez un œil sur la page dédiée au sujet sur ArchWiki. Au-delà de X11, Wayland permet d’utiliser une densité différente pour chaque écran et de mettre à l’échelle les applications qui ne savent pas prendre en charge les densités élevées.

En conclusion, la situation actuelle dépend énormément des applications utilisées. Mes principales applications étant Firefox, Emacs et un terminal basé sur VTE, le résultat me satisfait.


  1. Sans ce paramètre, il est impossible de lire une vidéo HD ou 4K dans Firefox. C’est un peu dommage que nous ne puissions toujours pas obtenir un rendu vidéo accéléré sous Linux alors que d’autres plates-formes ont cette fonctionnalité depuis longtemps. Pour Chromium, des patchs existent mais ne sont pas acceptés. ↩︎

  2. Par rapport à ma configuration précédente, le nombre de pixels est quadruplé. La carte utilise 4 voies sur PCI 3.0, ce qui correspond à une bande passante de 25 Gbits/s. Cela permet à peine le transfert de 7680×2160 pixels à 60 Hz en 24 bits. Ceci peut expliquer la difficulté à lire des vidéos 4K sans accélération. ↩︎

  3. Pour détecter les changements, Chromium surveille les évènements RandR. Ils peuvent être capturés avant d’avoir pu mettre à jour les variables XSettings↩︎

  4. Si cela ne fonctionne pas, essayez avec le drapeau --force-device-scale-factor=2↩︎

  5. Blender se base sur la valeur de la ressource Xft.dpi↩︎

  6. Les applications Java doivent être invoquées avec la variable d’environnement GDK_SCALE=2, sans quoi, aucune mise à l’échelle n’est effectuée. ↩︎


Partager cet article