Comment basculer le pavé tactile selon que la souris est connectée?

10

Je souhaite que mon pavé tactile soit automatiquement désactivé lorsqu'une souris externe est connectée et activé lorsqu'il n'y en a pas. J'ai essayé d'utiliser touchpad-indicatormais cela échoue dans les cas où l'ordinateur a été mis en veille avec une souris connectée et réveillé avec la souris déconnectée.

J'ai essayé de faire du script suivant un démon pour résoudre ce problème mais je n'arrive pas à le faire fonctionner:

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

j'ai essayé start-stop-daemon -S -x ./myscript.sh -b

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

et nohup ./myscript 0<&- &>/dev/null & et même./myscript.sh &

Tous ceux-ci renvoient un nombre à 4 chiffres, qui, je suppose, devrait être le PID du processus démarré, mais lorsque je lance lxtask, il n'y a pas de processus avec ce PID , même si je coche "Afficher tous les processus". Et, bien sûr, cela ne fonctionne pas!

mekkanizer
la source
@terdon Im essayant de faire un démon en regardant une souris USB connectée et demander à xinput d'activer ou de désactiver le pavé tactile. La seule autre solution au problème, un programme appelé touchpad-indicator, a un petit défaut. Lorsque je sens mon ordinateur portable endormi avec la souris connectée et que je le réveille sans, je dois rechercher la souris la plus proche pour la connecter / déconnecter afin que mon pavé tactile soit activé. Bref, je veux que le fait soit revérifié au réveil.
mekkanizer
Bienvenue sur Ask Ubuntu! Veuillez modifier votre question pour ajouter des informations supplémentaires, elle est difficile à lire et facile à manquer dans les commentaires.
terdon
Tout d'abord, vous devez expliquer que vous "essayez de démonifier" et comment vous vous y prenez exactement. Ensuite, a xinputbesoin d'un serveur X en cours d'exécution, et la plupart des méthodes d'exécution de trucs en tant que démons n'ont aucune connaissance ni capacité de se connecter à X. Troisièmement, la principale raison pour laquelle vous devez toujours expliquer ce que vous essayez de faire est que très souvent la solution que quelqu'un tente de postuler n'est pas vraiment le moyen de le faire et vous finissez par poser la mauvaise question, communément appelée le problème XY .
terdon
@terdon Retour à la recherche de solutions, quel est l'analogue (possible?) de xinput qui: 1. Peut fonctionner en arrière-plan 2. Peut activer / désactiver les périphériques?
mekkanizer
1
commentaires supprimés . Être gentil avec Ask Ubuntu n'est pas facultatif. Soyez gentil. Les commentaires grossiers seront supprimés sans avertissement.
Seth

Réponses:

10

Le script de base dont vous avez besoin est simplement:

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

Le script ci-dessus bascule le trackpad selon que la souris est connectée ou non. Une fois lancé, il fonctionnera pour toujours et recherchera une souris à chaque seconde, désactivant ou activant le pavé tactile en conséquence.

Maintenant, enregistrez le script sous ~/touchpad.sh, rendez-le exécutable ( chmod +x ~/touchpad.sh) et ajoutez-le à vos programmes de démarrage de session GUI. Vous n'avez pas spécifié l'environnement de bureau que vous utilisez, mais comme vous l'avez mentionné lxtask, je suppose que vous utilisez LXDE. Dans tous les cas, voici des instructions pour les deux LXDEet Unity:

  1. Ajouter le script aux fichiers de démarrage automatique de LXDE

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

    Assurez-vous de remplacer "PROFILE" par le nom réel de votre profil LXDE , vous pouvez découvrir ce que c'est en exécutant ls ~/.config/lxsession/.

  2. Ajouter le script aux fichiers de démarrage automatique d'Unity

    Ouvrir Startup Applications(rechercher dans le tableau de bord "Démarrage")

    entrez la description de l'image ici

    Cliquez sur "Ajouter" puis collez le chemin de votre script dans le champ de commande:

    entrez la description de l'image ici

terdon
la source
Je n'ai pas utilisé de boucle parce que lorsque j'ai cherché sur Google à exécuter des scripts en arrière-plan, tout le monde a suggéré de ne pas utiliser de boucles. Si c'est la seule solution et qu'il n'y a pas d'analogue de xinput qui PEUT être utilisé dans un script pour un démon et CAN activer / désactiver des périphériques ... ok, je vais l'utiliser.
mekkanizer
1
@mekkanizer ce n'est pas vraiment le meilleur moyen en tant que tel. Une façon beaucoup plus propre serait d'utiliser les règles udev et de leur exporter les informations d' identification X nécessaires . Vous pouvez examiner cela si vous le souhaitez.
terdon
Merci, fera l'affaire. Si je le fais fonctionner, je vous répondrai (ou
posterai
10

D'accord, j'ai fait une règle udev pour cela, et c'est, comme l'a dit @terdon, une manière beaucoup plus propre

Donc, grâce à ce guide , j'ai créé un fichier "touchpad_toggle.rules" dans /etc/udev/rules.d/ (nécessite un accès root) et je l'ai rempli de deux lignes:

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'oubliez pas de remplacer "nom d'utilisateur" par votre nom d'utilisateur!

Le contenu de ces scripts shell on et off n'est qu'une version castrée du script dans ma question. Exemple - 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

Vous devrez utiliser xinput enable $ TID dans le on.sh

Et n'oubliez pas d'ajouter le script dans ma question (ou celle suggérée par @terdon, mais sans boucle) au démarrage automatique de la session comme il vous l'a dit dans sa réponse.

Ça y est, mais je dois ajouter une chose:

Si vous avez un pavé tactile Synaptics (j'ai Elantech, donc il ne me convient pas), vous pouvez remplacer vos scripts (chemins vers lesquels vous écrivez après RUN + =) par une simple commande /usr/bin/synclient TouchpadOff=0et 1 respectivement

mekkanizer
la source
juste un coup de pouce, puisque vous avez besoin d'un accès root pour créer la udevrègle de toute façon, il peut être préférable d'enregistrer le fichier ailleurs que dans le répertoire personnel. Par exemple: /usr/local/binou /opt/touchpad-toggle/bin/.
Dan
@Dan a refusé. Tout ce qui concerne les paramètres utilisateur doit être dans le répertoire personnel. Malheureusement, les règles udev, les paramètres du gestionnaire de connexion et quelques autres choses sont destinés à être recopiés dans / * chaque fois que vous supprimez / partitionnez, sauf si vous restaurez un instantané bien sûr. Donc, avoir plus de choses stockées dans / home / n'est que de la commodité. Donc, vos conseils n'ont aucune valeur
mekkanizer
Mais depuis qu'il a été ajouté en tant que règle udev, cela ne signifierait-il pas qu'il fonctionnerait pour n'importe quel utilisateur, peu importe qui l'a enregistré?
Dan
Je n'ai pas vérifié, car je n'ai jamais utilisé Linux sur des PC partagés. Quoi qu'il en soit, tout utilisateur irrité par cette règle udev soignée ne m'intéresse pas. S'ils sont si sensibles, ils peuvent obtenir leur propre installation
mekkanizer