Como alternar o touchpad, dependendo de um mouse estar conectado?

10

Desejo que meu touchpad seja desativado automaticamente quando um mouse externo estiver conectado e ativado quando não houver nenhum. Eu tentei usar, touchpad-indicatormas isso falha nos casos em que o computador foi colocado no modo de suspensão com um mouse conectado e acordado com o mouse desconectado.

Tentei transformar o seguinte script em um daemon para resolver esse problema, mas não consigo fazê-lo funcionar:

#!/bin/bash

declare -i TID
declare -i MID
TID=`xinput list | grep -Eo 'Touchpad\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
MID=`xinput list | grep -Eo 'Mouse\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
if [ $MID -gt 0 ]
then
    xinput disable $TID
else
    xinput enable $TID
fi

eu tentei start-stop-daemon -S -x ./myscript.sh -b

e setsid ./myscript.sh >/dev/null 2>&1 < /dev/null &

ee nohup ./myscript 0<&- &>/dev/null & mesmo./myscript.sh &

Tudo isso retorna um número de 4 dígitos, que, eu acho, deve ser o PID do processo iniciado, mas quando inicio o lxtask não há processos com esse PID , mesmo se eu marque "exibir todos os processos". E, claro, não funciona!

mekkanizer
fonte
@terdon Estou tentando fazer um daemon assistindo o mouse USB conectado e peça ao xinput para ativar ou desativar o touchpad. A única outra solução para o problema, um programa chamado indicador do touchpad, tem uma pequena falha. Quando deixo meu notebook adormecido com o mouse conectado e o acorde sem, tenho que procurar o mouse mais próximo para conectá-lo / desconectá-lo para que meu touchpad seja ativado. Em resumo, quero que o fato seja verificado novamente ao acordar.
mekkanizer
Bem-vindo ao Ask Ubuntu! Por favor edite sua pergunta para adicionar informações adicionais, é difícil de ler e fácil de se perder nos comentários.
terdon
Antes de tudo, você deve explicar que está "tentando daemonizar" e como exatamente está fazendo isso. Então, xinputprecisa de um servidor X em execução, e a maioria dos métodos de execução de daemons não tem conhecimento ou capacidade de se conectar ao X. Terceiro, e a principal razão pela qual você deve sempre explicar o que está tentando fazer é que muitas vezes a solução que alguém está tentando se inscrever não é realmente a maneira de fazer isso e você acaba fazendo a pergunta errada, comumente conhecida como o problema XY .
terdon
@terdon Voltando a procurar soluções, qual é o possível (análogo) do xinput que: 1. Pode ser executado em segundo plano 2. Pode ativar / desativar dispositivos?
mekkanizer
1
comentários removidos . Ser gentil com o Ask Ubuntu não é opcional. Por favor seja gentil. Comentários rudes serão removidos sem aviso prévio.
Seth

Respostas:

10

O script básico que você precisa é simplesmente:

#!/usr/bin/env bash

## Get the touchpad id. The -P means perl regular expressions (for \K)
## the -i makes it case insensitive (better portability) and the -o
## means print only the matched portion. The \K discards anything matched
## before it so this command will print the numeric id only.
TID=$(xinput list | grep -iPo 'touchpad.*id=\K\d+')

## Run every second
while :
do
   ## Disable the touchpad if there is a mouse connected
   ## and enable it if there is none.
    xinput list | grep -iq mouse &&  xinput disable "$TID" || xinput enable "$TID" 
    ## wait one second to avoind spamming your CPU
    sleep 1
done

O script acima alternará o trackpad, dependendo de um mouse estar conectado. Quando iniciado, ele será executado para sempre e procurará um mouse a cada segundo, desativando ou ativando o touchpad de acordo.

Agora, salve o script como ~/touchpad.sh, torne-o executável ( chmod +x ~/touchpad.sh) e adicione-o aos programas de inicialização da sessão da GUI. Você não especificou qual ambiente de área de trabalho está usando, mas desde que você mencionou lxtask, assumirei que você está usando LXDE. Em todo caso, aqui estão as instruções para ambos LXDEe Unity:

  1. Adicione o script aos arquivos de inicialização automática do LXDE

    echo "@$HOME/touchpad.sh" >> ~/.config/lxsession/PROFILE/autostart file

    Certifique-se de substituir "PROFILE" pelo nome real do seu perfil do LXDE , para descobrir o que é executando ls ~/.config/lxsession/.

  2. Adicione o script aos arquivos de inicialização automática do Unity

    Aberto Startup Applications(pesquise no painel por "Inicialização")

    insira a descrição da imagem aqui

    Clique em "Adicionar" e cole o caminho para o seu script no campo de comando:

    insira a descrição da imagem aqui

Terdon
fonte
Eu não usei um loop porque, quando pesquisei sobre a execução de scripts em segundo plano, todos sugeriram não usar loops. Se essa é a única solução e não há análogo do xinput que PODE ser usado em um script para um daemon e PODE ativar / desativar dispositivos ... ok, vou usá-lo.
mekkanizer
1
@mekkanizer esta não é realmente a melhor maneira como tal. Uma maneira muito mais limpa seria usar as regras do udev e exportar as credenciais X necessárias para elas. Você pode investigar isso, se desejar.
terdon
Obrigado, vai fazer. Se eu obtê-lo para o trabalho, eu vou escrever de volta (ou postar uma resposta)
mekkanizer
10

Ok, eu fiz uma regra de udev para isso, e é, como @terdon disse, uma maneira muito mais limpa

Portanto, graças a este guia , criei um arquivo "touchpad_toggle.rules" em /etc/udev/rules.d/ (requer acesso root) e o preenchi com duas linhas:

SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="add", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/home/username/on.sh"
SUBSYSTEM=="input", KERNEL=="mouse[0-9]*", ACTION=="remove", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/home/username/off.sh"

Não se esqueça de substituir "nome de usuário" por seu nome de usuário!

O conteúdo desses scripts shell on e off é apenas uma versão castrada do script na minha pergunta. Exemplo - off.sh:

#!/bin/bash

declare -i TID
TID=`xinput list | grep -Eo 'Touchpad\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'`
xinput disable $TID

Você precisará usar o xinput enable $ TID no on.sh

E não se esqueça de adicionar o script na minha pergunta (ou o sugerido por @terdon, mas sem um loop) para iniciar automaticamente a sessão, como ele disse em sua resposta.

É isso, mas tenho que acrescentar uma coisa:

Se você possui um touchpad Synaptics (eu tenho a Elantech, então não é adequado para mim), você pode substituir seus scripts (caminhos nos quais você escreve após RUN + =) por um comando simples /usr/bin/synclient TouchpadOff=0e 1 respectivamente

mekkanizer
fonte
apenas um nitpick, já que você precisa de acesso root para criar a udevregra de qualquer maneira, pode ser melhor salvar o arquivo em outro lugar que não seja o diretório inicial. Por exemplo: /usr/local/binou /opt/touchpad-toggle/bin/.
Dan
@Dan recusou. Tudo relacionado às configurações do usuário deve estar no diretório inicial. Infelizmente, as regras do udev, as configurações do gerenciador de login e algumas outras coisas estão fadadas a serem copiadas para / * toda vez que você fragmenta / particiona, a menos que você restaure um instantâneo, é claro. Portanto, ter mais coisas armazenadas em / home / é apenas conveniência. Assim, o seu conselho não tem valor
mekkanizer
Mas desde que foi adicionado como uma regra do udev, isso não significa que seria executado para qualquer usuário, independentemente de quem o registrou?
18717 Dan
Não verifiquei, pois nunca usei o Linux em PCs compartilhados. De qualquer forma, qualquer usuário que esteja irritado com essa regra pura do udev não é do meu interesse. Se eles são tão sensíveis, que podem começar a sua própria instalação
mekkanizer