Meu botão liga / desliga não funciona no LXDE. Como posso consertar isso?

2

Desde que mudei para o LXDE, meu botão liga / desliga não funciona mais. Eu adoraria poder exibir um menu extravagante de logout como o do Unity e DEs semelhantes. Como posso conseguir isso?

    
por Glutanimate 18.08.2013 / 17:54

2 respostas

4

O caminho do ACPID

Visão geral

Existem várias maneiras de corrigir esse problema. Se você procurar na Web, encontrará sugestões sobre a instalação de gerenciadores de energia usados em outros ambientes de desktop (DEs), como xfce4-power-manager ou gnome-settings-daemon . No entanto, como usuário do LXDE, você provavelmente está se esforçando para obter uma solução leve. Uma maneira leve de exibir um menu de logout no botão liga / desliga é utilizar um script ACPID.

O que é o ACPID?

Do ArchWiki :

  

acpid é um daemon flexível e extensível para entregar eventos ACPI.   Ele escuta em / proc / acpi / event e quando um evento ocorre, executa   programas para lidar com o evento. Esses eventos são desencadeados por certos   ações, como:

     
  • Pressionando teclas especiais, incluindo o botão Ligar / Suspender / Suspender

  •   
  • Fechando uma tampa do notebook (Un) Conectando um adaptador de energia CA de um notebook

  •   
  • (Des) Ligação do telefone, etc.

  •   

Instalação

sudo apt-get install acpi acpid

Configuração

Abra /etc/acpi/powerbtn.sh em um editor de texto de sua escolha, por exemplo leafpad:

gksudo leafpad /etc/acpi/powerbtn.sh

No final do arquivo, você encontrará a seguinte passagem:

# If all else failed, just initiate a plain shutdown.
/sbin/shutdown -h now "Power button pressed"

Pouco antes dessa passagem, adicione o seguinte snippet:

# 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

A maior parte do snippet consiste em funções e comandos que garantem que um aplicativo gráfico como o menu de logout possa ser executado pelo ACPID (configurando variáveis de ambiente como XUSER e DISPLAY ).

Nota: Se você tiver componentes do GNOME em execução na sua sessão do LXDE (por exemplo, nautilus, vários daemons), a detecção da sessão pode dar errado. Nestes casos, aconselho-o a inserir o código da seguinte forma:

  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
<...>

Solução de problemas

Por alguma razão desconhecida, essas funções nem sempre funcionam. Nesse caso, você terá que substituir o snippet acima pelo seguinte:

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

As variáveis de ambiente são codificadas neste. Certifique-se de substituir user pelo seu próprio nome de usuário. Deve funcionar para a maioria das configurações do sistema de usuário único.

Aqui está outra solução alternativa, apenas no caso de nenhuma das variantes acima funcionar. Substitua a função getXuser pela seguinte passagem:

getXuser() {
        user='pinky -fw | awk '{ if ( == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print ; 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 ; 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
}

O que isso faz?

O script powerbtn.sh é acionado pelo ACPID cada vez que o botão liga / desliga é pressionado. Como você pode ver, ele já inclui várias verificações para DEs comuns, como Unity, GNOME e KDE. Essas verificações estão lá para garantir que o evento de desligamento seja tratado pelo respectivo gerenciador de energia. Infelizmente, o LXDE não possui um desses recursos.

É por isso que adicionamos um trecho próprio que verifica a ACPID. Se ele detectar uma sessão do LXDE, ele se certificará de que seu computador não será simplesmente desligado e, em vez disso, iniciará o menu de logout com o qual você deve estar familiarizado.

Com essas alterações, você agora deve poder iniciar seu menu de logout com o botão liga / desliga do seu hardware - sem a necessidade de instalar um gerenciador de energia volumoso. E, melhor ainda, isso não interfere de nenhuma maneira com outros DEs.

Fontes

link

link

link

Outras leituras

Lubuntu - botão de energia não desliga o computador,

Botão de energia do laptop não funciona

link

link

    
por Glutanimate 18.08.2013 / 17:54
1

Parece que o LXDE não inclui o pacote lxsession-logout. Instale o pacote digitando isto no terminal:

sudo apt install lxsession-logout

Eu sei que esse é um tópico antigo, mas acabei de experimentar esse problema e não consegui encontrar uma resposta direta em lugar algum.

    
por JustinMT 10.04.2017 / 06:24