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...
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...
... 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 :
... 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...
Oui je sais, c'est du grand art... 😜️