web-dev-qa-db-fra.com

Mon bouton d'alimentation ne fonctionne pas sous LXDE. Comment puis-je réparer cela?

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?

2
Glutanimate

La façon ACPID


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

https://bugs.launchpad.net/xfce4-power-manager/+bug/100865

https://unix.stackexchange.com/questions/87259/why-wont-this-shutdown-script-work-when-executed-by-acpid

4
Glutanimate

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.

1
JustinMT