Come posso attivare o disattivare il touchpad a seconda che sia collegato un mouse?


10

Voglio che il mio touchpad sia disabilitato automaticamente quando un mouse esterno è collegato e abilitato quando non ce n'è. Ho provato a utilizzare touchpad-indicatorma ciò non riesce nei casi in cui il computer è stato messo in sospensione con un mouse collegato e risvegliato con il mouse disconnesso.

Ho provato a trasformare il seguente script in un demone per risolvere questo problema, ma non riesco a farlo funzionare:

#!/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

Provai start-stop-daemon -S -x ./myscript.sh -b

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

e nohup ./myscript 0<&- &>/dev/null & perfino./myscript.sh &

Tutti questi restituiscono un numero di 4 cifre, che, suppongo, dovrebbe essere PID del processo avviato, ma quando avvio lxtask non ci sono processi con questo PID , anche se seleziono "visualizza tutti i processi". E, ovviamente, non funziona!


@terdon Sto provando a creare un demone guardando un mouse USB collegato e chiedendo a xinput di abilitare o disabilitare il touchpad. L'unica altra soluzione al problema, un programma chiamato indicatore touchpad, ha un piccolo difetto. Quando riaccendo il mio notebook con il mouse collegato e lo riattivo senza, devo cercare il mouse più vicino per collegarlo / disconnetterlo in modo che il mio touchpad sia abilitato. In breve, voglio che il fatto venga ricontrollato al risveglio.
Mekkanizer,

Benvenuto in Ask Ubuntu! Si prega di modificare la tua domanda per aggiungere informazioni supplementari, è difficile da leggere e facile da perdere nei commenti.
terdon,

Prima di tutto dovresti spiegare che stai "provando a demonizzarlo" e come stai andando esattamente a questo. Quindi, ha xinputbisogno di un server X in esecuzione e la maggior parte dei metodi per eseguire roba da demoni non ha conoscenza o capacità di connettersi a X. Terzo, e il motivo principale per cui dovresti sempre spiegare cosa stai cercando di fare è che molto spesso la soluzione che qualcuno stia tentando di candidarsi non è in realtà il modo per farlo e finisci per fare la domanda sbagliata, comunemente nota come problema XY .
terdon,

@terdon Alla ricerca di soluzioni, qual è l'analogo (possibile?) di xinput che: 1. Può essere eseguito in background 2. Può abilitare / disabilitare i dispositivi?
Mekkanizer,

1
commenti rimossi . Essere gentili con Ask Ubuntu non è facoltativo. Per favore sii carino. I commenti maleducati verranno rimossi senza preavviso.
Seth,

Risposte:


10

Lo script di base di cui hai bisogno è semplicemente:

#!/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

Lo script sopra commuta il trackpad a seconda che sia collegato un mouse. Una volta lanciato, funzionerà per sempre e controllerà il mouse ogni secondo, disabilitando o abilitando il touchpad di conseguenza.

Ora, salva lo script come ~/touchpad.sh, rendilo eseguibile ( chmod +x ~/touchpad.sh) e aggiungilo ai programmi di avvio della sessione della GUI. Non hai specificato quale ambiente desktop stai utilizzando, ma da quando hai citato lxtask, suppongo che tu stia utilizzando LXDE. In ogni caso, ecco le istruzioni per entrambi LXDEe Unity:

  1. Aggiungi lo script ai file di avvio automatico di LXDE

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

    Assicurati di sostituire "PROFILE" con il nome effettivo del tuo profilo LXDE , puoi scoprire di cosa si tratta eseguendo ls ~/.config/lxsession/.

  2. Aggiungi lo script ai file di avvio automatico di Unity

    Apri Startup Applications(cerca nella dashboard "Startup")

    inserisci qui la descrizione dell'immagine

    Fai clic su "Aggiungi" e quindi incolla il percorso dello script nel campo comando:

    inserisci qui la descrizione dell'immagine


Non ho usato un loop perché quando ho cercato su Google di eseguire script in background, tutti mi hanno suggerito di non usare i loop. Se questa è l'unica soluzione e non esiste un analogo di xinput che PU CAN essere utilizzato in uno script per un demone e PU enable abilitare / disabilitare i dispositivi ... ok, lo userò.
Mekkanizer,

1
@mekkanizer questo non è davvero il modo migliore in quanto tale. Un modo molto più pulito sarebbe usare le regole udev ed esportare le credenziali X necessarie ad esse. Puoi esaminarlo se lo desideri.
terdon,

Grazie, lo farà. Se riesco a farlo funzionare, riscriverò (o
invierò

10

Va bene, ho fatto una regola udev per questo, ed è, come ha detto @terdon, un modo molto più pulito

Quindi, grazie a questa guida , ho creato un file "touchpad_toggle.rules" in /etc/udev/rules.d/ (richiede l'accesso come root) e lo ho riempito con due righe:

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"

Non dimenticare di sostituire "nome utente" con il tuo nome utente!

Il contenuto di questi script shell dentro e fuori è solo la versione castrata dello script nella mia domanda. Esempio - 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

Dovrai usare xinput enable $ TID in on.sh

E non dimenticare di aggiungere la sceneggiatura alla mia domanda (o quella suggerita da @terdon, ma senza un ciclo) alla sessione di avvio automatico come ti ha detto nella sua risposta.

Questo è tutto, ma devo aggiungere una cosa:

Se hai un touchpad Synaptics (ho Elantech, quindi non è adatto a me), puoi sostituire i tuoi script (percorsi su cui scrivi dopo RUN + =) con un semplice comando /usr/bin/synclient TouchpadOff=0e 1 rispettivamente


solo un nitpick, poiché è necessario l'accesso root per creare la udevregola in qualsiasi modo, potrebbe essere meglio salvare il file in un posto diverso dalla home directory. Ad esempio: /usr/local/bino /opt/touchpad-toggle/bin/.
Dan,

@ Dan rifiutato. Tutto ciò che riguarda le impostazioni dell'utente deve essere nella home directory. Sfortunatamente, le regole udev, le impostazioni del gestore degli accessi e un paio di altre cose sono destinate a essere copiate in / * ogni volta che scarti / partiziona, a meno che tu non ripristini un'istantanea, ovviamente. Quindi avere più cose archiviate in / home / è solo comodità. Quindi, il tuo consiglio non ha alcun valore
mekkanizer il

Ma dal momento che è stato aggiunto come regola udev, ciò non significherebbe che sarebbe eseguito per qualsiasi utente, indipendentemente da chi lo ha registrato?
Dan,

Non ho controllato, dato che non ho mai usato Linux su PC condivisi. Ad ogni modo, qualsiasi utente che sia irritato da questa ordinata regola udev non è di mio interesse. Se sono così sensibili, possono ottenere la propria installazione
mekkanizer il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.