GNOME Shell : empêcher l'extinction des écrans lors du verrouillage

Depuis des années j'ai toujours le même problème. Oh pas un problème bien grave, mais un problème agaçant au quotidien.

Mon PC portable est connecté à un dock Thunderbolt sur lequel sont connectés mes écrans, mes périphériques USB et mon câble réseau. C'est très pratique : je n'ai qu'un seul câble à brancher sur mon ordinateur et tout fonctionne... ou presque.

Lorsque je verrouille ma session (<Super>+L), les écrans sont automatiquement éteints... ok cool, ça fait des économies d'énergie ! Le souci c'est que quand je veux déverrouiller le PC pour reprendre mes activités, bien souvent seul l'écran interne se réveille et les écrans externes restent obstinément éteints.

La seule solution pour les rallumer est alors de débrancher le câble Thunderbolt et de le rebrancher... ce qui a tendance à embrouiller GNOME Shell qui mélange alors les fenêtres de mes différents espaces de travail... Je dois donc passer une bonne minute à retrier mes fenêtres à chaque fois (j'ai souvent plus d'une dizaine d'espaces de travail en parallèle, ce qui est certainement beaucoup trop). 😥️

J'ai donc deux problèmes distincts :

  • les écrans qui ne se rallument pas,
  • et les fenêtres qui se retrouvent mélangées par GNOME Shell.

Aujourd'hui, je me suis enfin motivé à me pencher sur la question et je suis bien décidé à résoudre au moins l'un de mes problèmes : celui des écrans qui ne se rallument pas !

Commander l'extinction et l'allumage des écrans

Ma première idée a été de forcer l'allumage des écrans. Il faut savoir que depuis des années on peut contrôler les écrans via une série de protocoles nommés DDC/CI. Ces protocoles permettent de configurer le moniteur (source d'entrée, luminosité, température de la couleur, contraste,...) comme on le ferait depuis les menus intégrés.

Pour communiquer avec les moniteurs sous Linux il faut passer par l'outil ddcutil, installable via le paquet du même nom sur la plupart des distributions.

Je liste donc mes moniteurs et repère l'un de ceux restés éteints avec la commande suivante :

$ sudo ddcutil detect

[...]

Display 1
   I2C bus:  /dev/i2c-18
   DRM connector:           card0-DP-5
   EDID synopsis:
      Mfg id:               AOC - UNK
      Model:                2470W
      Product code:         9328  (0x2470)
      Serial number:        XXXXXXXXXXXXX
      Binary serial number: 128465 (0x0001f5d1)
      Manufacture year:     2019,  Week: 4
   VCP version:         2.2

[...]

Ici on voit mon moniteur AOC accessible sur le bus I2C numéro 18.

Je liste ensuite les fonctionnalités accessibles via DDC/CI et je repère la partie qui correspond à l'alimentation :

$ sudo ddcutil --bus=18 capabilities

[...]
   Feature: D6 (Power mode)
      Values:
         01: DPM: On,  DPMS: Off
         04: DPM: Off, DPMS: Off
[...]

L'alimentation est donc contrôlée par la fonctionnalité numérotée "D6" et deux valeurs sont possibles :

  • "01" : l'écran est allumé,
  • "04" : l'écran est éteint.

Essayons donc de lire l'état du moniteur lorsque mon problème se produit :

$ sudo ddcutil --bus=18 getvcp D6

[...]
VCP code 0xd6 (Power mode                    ): DPM: On,  DPMS: Off (sl=0x01)

D'après le moniteur lui-même, il serait allumé... Étrange ! 🤔️

Essayons quand même de l'éteindre et de le rallumer, ça fonctionnera peut-être ?

$ sudo ddcutil --bus=18 setvcp D6 04  # On éteint
$ sudo ddcutil --bus=18 setvcp D6 01  # Puis on rallume

Résultat ? Que dalle !

Je vois bien l'écran clignoter, m'afficher un laconique « No signal » puis se rééteindre... Le problème ne vient donc pas de l'alimentation de l'écran. Zut, chou blanc... 😥️

J'ai donc poursuivi mes recherches, et je me suis rendu compte que le problème est en fait très répandu, indépendamment de la marque du PC, de la marque du dock et du système d'exploitation... Je sens que ça va être pénible cette histoire... 😩️

Empêcher l'extinction des écrans

Au final, je n'ai pas réussi à trouver de solution pour rallumer à coup sûr les écrans... C'est plutôt décevant. 😟️

Mais je ne vais pas m'avouer vaincu pour autant ! 💪️

On va donc attaquer le problème par un autre bout. S'il ne m'est pas possible de rallumer les écrans, il est peut-être tout simplement possible de ne pas les éteindre ?

J'ai beau fouiller, mon environnement de bureau, GNOME, ne semble pas fournir la moindre option pour configurer cela... Mais durant mes recherches, je suis tombé sur une extension GNOME Shell qui permet justement d'éviter que les écrans ne s'éteignent lors du verrouillage de la session !

Cette extension s'appelle unblank et s'installe en un clic depuis le site des extensions de GNOME Shell :

Capture d'écran de l'extension unblank sur le site des extensions de GNOME Shell

L'extension fournit même quelques options pour éteindre quand même les écrans dans certaines circonstances (lorsque le PC est sur batterie ou au bout d'un certain temps).

Capture d'écran de la fênetre de configuration

Ça semble nickel ! Et si on testait ça ?

Je tape donc le raccourci clavier <Super>+L, qui permet de verrouiller la session... Et... ÇA MARCHE ! Trop bien ! 😎️

Le mot de la fin

La solution n'est clairement pas idéale puisqu'on contourne le problème au lieu de le résoudre. Mais c'est suffisant pour moi, ça améliore ma situation et c'est bien là l'essentiel. Mon seul regret c'est de ne pas avoir pris le temps de me pencher là-dessus plus tôt.

J'espère que cet article pourra être utile à tous ceux qui rencontrent le même problème, et je vous dis à bientôt sur les zinternets ! 😁️