Ubuntu, GNOME : Mon PC refuse de se mettre en veille lorsque je rabats l’écran

Il s'agit d'un problème tout bête mais qui a fini par devenir assez énervant: lorsque des écrans externes sont connectés à mon PC portable, il n'y a pas moyen de le faire partir en veille lorsque je rabats son écran.

J'avais déjà eu ce problème il y a quelques années, mais la solution que j'avais trouvée à l'époque ne marche plus depuis un bout de temps. Pour être plus précis, elle ne marche plus depuis fin 2017, lorsque Canonical a replacé Unity par GNOME dans Ubuntu, comme on le verra par la suite.

Jusqu'à présent je m'étais accommodé du bug et j'utilisais le bouton de mise en veille de GNOME Shell, mais depuis la dernière de GNOME, le bouton est planqué au fin fond d'un menu... Comme j'en ai marre de devoir faire 3 clics pour mettre en veille ma machine, je me suis donc motivé à trouver une solution...

Bouton de mise en veille de GNOME Shell

Tests et investigations

Comme le disait un célèbre zoiseau : « reprenons depuis le début ! ». Il existe un certains nombre d'options dans GNOME censées gérer ce cas, la première chose à faire est de tester si elles fonctionnent... On sait jamais, des fois qu'ils aient réparé des trucs...

La première option est celle présente dans GNOME Tweak (oui, celle qui ne marchait déjà plus lors de mon article de 2015...). On active l'option, et...

Option pour mettre en veille le PC lorsque l'écran est rabattu dans GNOME Tweak Tools

... et c'est un échec, rien ne se passe. Mais bon je m'y attendais... 😑️

La seconde option est fournie par GNOME Settings Deamon... mais elle est bien planquée. Le seul moyen d'y accéder est de passer par Dconf Editor. Par contre elle porte un nom plutôt encourageant : lid-close-suspend-with-external-monitor... Le rêve ! 😍️

Bref j'active l'option :

Option de GNOME Settings Daemon pour mettre en en veille la machine même lorsque des écrans sont connectés

... et cette fois encore ça marche pas... Déception... 😔️

Cherchons donc le coupable... 🤔️

Normalement c'est systemd-logind qui est censé gérer tout ça, et c'était d'ailleurs grâce à lui que j'avais pu faire marcher la mise en veille il y a quelques années, mais comme je l'ai dit en introduction, ça ne marche plus... Le tout est de comprendre pourquoi.

Ce qu'il faut savoir, c'est que logind permet à d'autres applications de retarder voir même d'empêcher la mise en veille de la machine... Ils appellent ça des inhibitors, et c'est notamment utilisé par les environnements de bureau (vous commencez à le voir venir ? 🙄️)...

Il existe une commande pour lister ces inhibiteurs... Voyons donc qui nous casse les pattes depuis toutes ces années...

$ systemd-inhibit --list

WHO                          UID  USER   PID  COMM            WHAT              WHY                                                         MODE
ModemManager                 0    root   1456 ModemManager    sleep             ModemManager needs to reset devices                         delay
NetworkManager               0    root   1341 NetworkManager  sleep             NetworkManager needs to turn off networks                   delay
UPower                       0    root   1712 upowerd         sleep             Pause device polling                                        delay
Unattended Upgrades Shutdown 0    root   1586 unattended-upgr shutdown          Stop ongoing upgrades or perform upgrades before shutdown   delay
GNOME Shell                  1000 fabien 2625 gnome-shell     sleep             GNOME a besoin de verrouiller l’écran                       delay
Telepathy                    1000 fabien 2815 mission-control shutdown:sleep    Disconnecting IM accounts before suspend/shutdown...        delay
fabien                       1000 fabien 2846 gsd-power       handle-lid-switch External monitor attached or configuration changed recently block
fabien                       1000 fabien 2845 gsd-media-keys  handle-power[...] GNOME handling keypresses                                   block
fabien                       1000 fabien 2845 gsd-media-keys  sleep             GNOME handling keypresses                                   delay
fabien                       1000 fabien 2846 gsd-power       sleep             GNOME needs to lock the screen                              delay

10 inhibitors listed.

Et là, sous nos yeux ébahis, le nom du coupable nous est dévoilé : gsd-power ! Autrement dit, le plugin de gestion d'énergie de GNOME Settings Deamon... Et son mobile est lui aussi très clair : « External monitor attached ». 🤯️

Maintenant qu'on connait le coupable, allons faire quelques recherches sur les zinternets...

Ce premier rapport de bug sur Launchpad nous confirme qu'effectivement, ce bug ne date pas d'hier... Il est présent depuis qu'Unity a été supprimé d'Ubuntu, ce qui a provoqué le remplacement de unity-settings-daemon par gnome-settings-daemon. Ça tombe bien, ça colle avec ce que l'on a trouvé jusqu'à présent...

Quelques clics plus loin, on tombe sur un autre rapport de bug, chez GNOME cette fois-ci, qui décrit très exactement le problème qui nous occupe... Ce rapport de bug ne nous apprendra rien de plus malheureusement...

Finalement, c'est une réponse sur l'ancien Bugzilla de GNOME qui me donnera la solution : UPower. 😤️

La solution

Pour résoudre notre problème de mise en veille, on va procéder en 2 étapes.

Premièrement on va utiliser une option de UPower permettant d'indiquer qu'il ne faut pas prendre en compte l'état du capteur indiquant si l'écran du PC est rabattu ou non (normalement on l'utilise lorsque le capteur est cassé ou fonctionne mal). Cette option est (étonnamment) suivie par GNOME Settings Daemon, et lorsqu'elle est active, il n'ajoute plus son foutu inhibiteur.

Pour activer cette option, il faut éditer le fichier /etc/UPower/UPower.conf (en root), et définir l'option IgnoreLid à true :

# Do we ignore the lid state
#
# Some laptops are broken. The lid state is either inverted, or stuck
# on or off. We can't do much to fix these problems, but this is a way
# for users to make the laptop panel vanish, a state that might be used
# by a couple of user-space daemons. On Linux systems, see also
# logind.conf(5).
#
# default=false
IgnoreLid=true

Maintenant qu'on a plus GNOME dans les pattes, on peut laisser systemd gérer la mise en veille de la machine. Pour ce faire, il faut éditer (toujours en root), le fichier /etc/systemd/logind.conf et y définir l'option suivante :

HandleLidSwitchDocked=suspend

Et voilà ! Il suffit à présent d'un petit redémarrage et notre PC accepte enfin de partir en veille lorsque l'on rabat son écran ! 😁️

S'il faut retenir quelque chose de cette histoire, c'est qu'il existe toujours une solution, si on prend la peine de la chercher (même si j'ai bien conscience que ce n'est pas toujours évident).


La couverture de cet article est bien sûr inspirée du fameux Sandwich de XKCD. Je vous remets cet hommage ci-dessous comme j'ai été obligé de le tronquer pour que ça rentre dans la cover...

Parodie du Sandwich de XKCD

Oui je sais, c'est du grand art... 😜️