Como desativo o touchpad quando a tampa está torcida ou fechada?

1

Eu tenho o Lenovo ThinkPad X230 Tablet com o Ubuntu 16.04. Ele tem uma tela conversível e, quando está no modo tablet, o touchpad ainda está ativo e faz uma bagunça.

Eu criei o seguinte script e liguei um dos botões incorporados (por um < href="https://askubuntu.com/a/591605/566421"> atalho personalizado ):

#!/bin/bash -e

# Find the TouchPad device ID
ID="$(xinput | grep -ioP 'touchpad.*id=\K[0-9]*')"                                  

if   [ "$(LANG=C xinput --list-props "$ID" | awk 'NR==2{print $4}')" == "0" ]; then 
        # If the device is disabled, then enable it and kill 'onboard' virtual keyboard
        xinput enable "$ID"; killall onboard; xrandr -o normal
elif [ "$(LANG=C xinput --list-props "$ID" | awk 'NR==2{print $4}')" == "1" ]; then
        # If the device is enabled, then disable it and run 'onboard' virtual keyboard
        xinput disable "$ID"; nohup onboard >/dev/null 2>&1 &
fi

O script funciona corretamente, mas esta é uma solução falsa e ontem passei algumas horas para aprender como fazer isso de maneira apropriada. Então decidi compartilhar essa experiência aqui.

    
por pa4080 28.11.2017 / 08:37

1 resposta

0

Para verificar se o dispositivo está no modo tablet ou não, poderíamos ler o valor ( 0 ou 1 ) de:

/sys/devices/platform/thinkpad_acpi/hotkey_tablet_mode

Este valor é trocado por eventos específicos. Podemos capturar esses eventos e vincular scripts a eles usando acpid - Advanced O daemon de eventos Configuration e Power Interface.

1. Capture os eventos. Execute um dos comandos a seguir, gire a tampa no modo tablet e gire-o de volta: acpi_listen ou netcat -U /var/run/acpid.socket . Aqui está um exemplo de saída:

$ acpi_listen
video/tabletmode TBLT 0000008A 00000001
video/tabletmode TBLT 0000008A 00000000

Por favor, note que quando a tampa está fechada, o resultado é diferente:

$ acpi_listen
button/lid LID close
button/lid LID open

2. Configure acpid para reconhecer os eventos acionados quando o dispositivo altera o estado do modo tablet. (Os scripts para abertura / fechamento da tampa não são fornecidos aqui.) Execute as seguintes linhas no terminal como um comando (único):

cat << EOF | sudo tee /etc/acpi/events/thinkpad-tablet-enabled
# /etc/acpi/events/thinkpad-tablet-enabled
# This is called when the lid is placed in tablet position on
# Lenovo ThinkPad X230 Tablet

event=video/tabletmode TBLT 0000008A 00000001
action=/etc/acpi/thinkpad-touchpad-twist-mode.sh 1
EOF
cat << EOF | sudo tee /etc/acpi/events/thinkpad-tablet-disabled
# /etc/acpi/events/thinkpad-tablet-disabled
# This is called when the lid is placed in normal position on
# Lenovo ThinkPad X230 Tablet

event=video/tabletmode TBLT 0000008A 00000000
action=/etc/acpi/thinkpad-touchpad-twist-mode.sh 0
EOF

Os comandos acima criarão os arquivos:

  • /etc/acpi/events/thinkpad-tablet-enabled
  • /etc/acpi/events/thinkpad-tablet-disabled

3. Reinicie o acpid para que ele possa reler os filtros de evento, incluindo os que você acabou de adicionar:

sudo systemctl restart acpid.service

4. Crie o script /etc/acpi/thinkpad-touchpad-in-twist-mode.sh que desativará 1 e habilite 0 do touchpad ( && torne-o executável):

cat << EOF | sudo tee /etc/acpi/thinkpad-touchpad-twist-mode.sh && sudo chmod +x /etc/acpi/thinkpad-touchpad-twist-mode.sh
#!/bin/sh
LANG=C                                                                                                     # Ensure stable parsing
export DISPLAY="\$(w | awk 'NF > 7 && \ ~ /tty[0-9]+/ {print \; exit}' 2>/dev/null)"                      # Get and export the current user's \$DISPAY
export XAUTHORITY="/home/\$(w | awk 'NF > 7 && \ ~ /tty[0-9]+/ {print \; exit}' 2>/dev/null)/.Xauthority" # Get and export the currentuser's \$XAUTHORITY
ID="\$(xinput | grep -ioP 'touchpad.*id=\K[0-9]*')"                                                         # Find the TouchPad device ID

if   [ "\" -eq 0 ]; then xinput enable "\$ID"   # Laptop mode or Lid is open
elif [ "\" -eq 1 ]; then xinput disable "\$ID"  # Tablet mode or Lid is closed
fi
EOF
  • O script analisará e exportará as variáveis de ambiente $DISPAY e $XAUTHORITY da sessão do usuário atual, para permitir que root (que executa o processo acpid ) acesse a sessão X do usuário, respectivamente% código%.
  • Em seguida, o script analisará o xinput do touchpad. E, dependendo da variável de entrada, id= ativará ou desativará o touckpad.

Referências:

por pa4080 28.11.2017 / 08:41