Depuis que je suis passé à LXDE, mon bouton d'alimentation ne fonctionne plus. J'aimerais pouvoir afficher un menu de déconnexion sophistiqué comme celui de Unity et des DE similaires. Comment puis-je atteindre cet objectif?
Vue d'ensemble
Il existe de nombreuses façons de résoudre ce problème. Si vous parcourez le Web, vous trouverez des suggestions sur l'installation de gestionnaires d'alimentation utilisés dans d'autres environnements de bureau (DE) tels que xfce4-power-manager
ou gnome-settings-daemon
. Toutefois, en tant qu’utilisateur LXDE, vous recherchez probablement une solution légère. Un moyen simple d'afficher un menu de déconnexion lorsque vous appuyez sur le bouton d'alimentation consiste à utiliser un script ACPID.
Qu'est-ce que ACPID?
De la ArchWiki :
acpid est un démon flexible et extensible permettant de générer des événements ACPI. Il écoute sur/proc/acpi/event et lorsqu'un événement se produit, exécute des programmes pour gérer l'événement. Ces événements sont déclenchés par certaines actions, telles que:
Appuyer sur les touches spéciales, y compris le bouton Marche/Veille/Suspension
Fermeture du couvercle d’un ordinateur portable (Dés) Branchement d’un adaptateur secteur depuis un ordinateur portable
Débrancher la prise téléphonique, etc.
Installation
Sudo apt-get install acpi acpid
Configuration
Ouvrez /etc/acpi/powerbtn.sh
dans un éditeur de texte de votre choix, par exemple. calepin:
gksudo leafpad /etc/acpi/powerbtn.sh
À la fin du fichier, vous trouverez le passage suivant:
# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"
Juste avant ce passage, ajoutez l'extrait suivant:
# If LXDE is running execute lxsession-logout
if [ -n $(pidof lxsession) ]; then
for x in /tmp/.X11-unix/*; do
displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
getXuser;
if [ x"$XAUTHORITY" != x"" ]; then
export DISPLAY=":$displaynum"
export _LXSESSION_PID=`pidof lxsession`
lxsession-logout
exit
fi
done
fi
La majeure partie de l'extrait de code consiste en des fonctions et des commandes permettant de s'assurer qu'une application graphique telle que le menu de déconnexion puisse être exécutée par ACPID (définition de variables d'environnement telles que XUSER
et DISPLAY
).
Remarque: Si des composants GNOME s'exécutent dans votre session LXDE (par exemple, nautilus, divers démons), la détection de session risque de mal tourner. Dans ces cas, je vous conseillerais d'insérer le code de la manière suivante:
if pidof x $PMS > /dev/null; then
if [ -n $(pidof lxsession) ]; then
for x in /tmp/.X11-unix/*; do
displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
getXuser;
if [ x"$XAUTHORITY" != x"" ]; then
export DISPLAY=":$displaynum"
export _LXSESSION_PID=`pidof lxsession`
killall lxsession-logout
lxsession-logout
fi
done
echo "if correct"
exit
else
exit
fi
<...>
Dépannage
Pour une raison inconnue, ces fonctions ne fonctionnent pas toujours. Dans ce cas, vous devrez remplacer le fragment ci-dessus par le suivant:
if [ -n $(pidof lxsession) ]; then
export DISPLAY=:0
export _LXSESSION_PID=$(pidof lxsession)
export XUSER=user
export XAUTHORITY=/home/user/.Xauthority
lxsession-logout
exit
fi
Les variables d'environnement sont codées en dur dans celui-ci. Assurez-vous de remplacer user
par votre propre nom d'utilisateur. Cela devrait fonctionner pour la plupart des configurations système mono-utilisateur.
Voici une autre solution de contournement, au cas où aucune des variantes ci-dessus ne fonctionnerait. Remplacez la fonction getXuser
par le passage suivant:
getXuser() {
user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
if [ x"$user" = x"" ]; then
startx=`pgrep -n startx`
if [ x"$startx" != x"" ]; then
user=`ps -o user --no-headers $startx`
fi
fi
if [ x"$user" = x"" ]; then # lines added
user=$(pinky -fw | awk '{ print $1; exit; }') # lines added
fi # lines added
if [ x"$user" != x"" ]; then
userhome=`getent passwd $user | cut -d: -f6`
export XAUTHORITY=$userhome/.Xauthority
else
export XAUTHORITY=""
fi
export XUSER=$user
}
Que fait-il?
Le script powerbtn.sh
est déclenché par ACPID chaque fois que vous appuyez sur le bouton d'alimentation. Comme vous pouvez le constater, il inclut déjà un certain nombre de vérifications pour les DE courants tels que Unity, GNOME et KDE. Ces vérifications sont là pour vous assurer que l'événement d'arrêt est géré par le gestionnaire d'alimentation respectif. Hélas, LXDE n'en a pas.
C'est pourquoi nous avons ajouté un extrait de notre propre code qui vérifie le ACPID. S'il détecte une session LXDE, il s'assure que votre PC n'est pas simplement arrêté et lance à la place le menu de déconnexion auquel vous devriez être habitué.
Avec ces modifications, vous devriez maintenant pouvoir lancer votre menu de déconnexion avec le bouton d'alimentation de votre matériel, sans avoir à installer un gestionnaire d'alimentation volumineux. Et encore mieux, cela n’interfère en aucune manière avec les autres ID.
Sources
http://www.ollie-reardon.co.uk/lxde-tip-power-button-not-working/
https://wiki.archlinux.org/index.php/Acpid
http://forum.lxde.org/viewtopic.php?f=8&t=205
Autres lectures
Lubuntu - le bouton d’alimentation n’éteint pas l’ordinateur
Le bouton d'alimentation de l'ordinateur portable ne fonctionne pas
Il semble que LXDE n'inclut pas le paquet lxsession-logout. Installez le paquet en tapant ceci dans le terminal:
Sudo apt install lxsession-logout
Je sais que c'est un vieux fil, mais je viens de vivre ce problème et je ne pouvais trouver de réponse directe nulle part.