Wie kann ich das Touchpad umschalten, je nachdem, ob eine Maus angeschlossen ist?

10

Ich möchte, dass mein Touchpad automatisch deaktiviert wird, wenn eine externe Maus angeschlossen ist, und aktiviert wird, wenn keine vorhanden ist. Ich habe versucht, es zu verwenden, touchpad-indicatoraber das schlägt fehl, wenn der Computer mit angeschlossener Maus in den Ruhezustand versetzt und mit nicht angeschlossener Maus geweckt wurde.

Ich habe versucht, das folgende Skript in einen Daemon zu verwandeln, um dieses Problem zu lösen, aber ich kann es nicht zum Laufen bringen:

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

Ich habe es versucht start-stop-daemon -S -x ./myscript.sh -b

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

und nohup ./myscript 0<&- &>/dev/null & und sogar./myscript.sh &

Alle diese geben eine 4-stellige Zahl zurück, die meiner Meinung nach die PID des gestarteten Prozesses sein sollte, aber wenn ich lxtask starte, gibt es keine Prozesse mit dieser PID , selbst wenn ich "Alle Prozesse anzeigen" ankreuze . Und natürlich funktioniert es nicht!

Mekkanizer
quelle
@terdon Ich versuche, einen Daemon dazu zu bringen, eine verbundene USB-Maus zu beobachten und xinput zu bitten, das Touchpad zu aktivieren oder zu deaktivieren. Die einzige andere Lösung für das Problem, ein Programm namens Touchpad-Indikator, weist einen kleinen Fehler auf. Wenn ich mein Notebook mit angeschlossener Maus schlafend einschalte und ohne wecke, muss ich nach der nächsten Maus suchen, um es zu verbinden / zu trennen, damit mein Touchpad aktiviert wird. Kurz gesagt, ich möchte, dass die Tatsache beim Aufwachen erneut überprüft wird.
Mekkanizer
Willkommen bei Ask Ubuntu! Bitte bearbeiten Sie Ihre Frage, um zusätzliche Informationen hinzuzufügen. Sie ist schwer zu lesen und in den Kommentaren leicht zu übersehen.
Terdon
Zunächst sollten Sie erklären, dass Sie "versuchen, es zu dämonisieren" und wie genau Sie das tun. Dann xinputbraucht einen laufenden X - Server und die meisten Methoden der laufenden Sachen als Daemons keine Kenntnis oder Fähigkeit haben, X. Drittens und den Hauptgrund zu verbinden , warum Sie immer erklären , sollten Sie zu tun , was versuchen , das ist sehr oft die Lösung Dass jemand versucht, sich zu bewerben, ist eigentlich nicht der richtige Weg, um dies zu erreichen, und Sie stellen am Ende die falsche Frage, die allgemein als XY-Problem bekannt ist .
Terdon
@terdon Zurück zur Suche nach Lösungen, was ist das (mögliche?) Analogon von xinput, das: 1. Kann im Hintergrund ausgeführt werden 2. Kann Geräte aktivieren / deaktivieren?
Mekkanizer
1
Kommentare entfernt . Auf Ask Ubuntu nett zu sein, ist nicht optional. Bitte sei nett. Unhöfliche Kommentare werden ohne Vorwarnung entfernt.
Seth

Antworten:

10

Das grundlegende Skript, das Sie benötigen, ist einfach:

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

Das obige Skript schaltet das Trackpad um, je nachdem, ob eine Maus angeschlossen ist. Beim Start wird es für immer ausgeführt und sucht jede Sekunde nach einer Maus, wodurch das Touchpad entsprechend deaktiviert oder aktiviert wird.

Speichern Sie nun das Skript als ~/touchpad.sh, machen Sie es ausführbar ( chmod +x ~/touchpad.sh) und fügen Sie es Ihren Startprogrammen für GUI-Sitzungen hinzu. Sie haben nicht angegeben, welche Desktop-Umgebung Sie verwenden, aber da Sie dies erwähnt haben lxtask, gehe ich davon aus, dass Sie sie verwenden LXDE. In jedem Fall finden Sie hier Anweisungen für beide LXDEund Unity:

  1. Fügen Sie das Skript zu den Autostart-Dateien von LXDE hinzu

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

    Stellen Sie sicher, dass Sie "PROFIL" durch den tatsächlichen Namen Ihres LXDE-Profils ersetzen. Sie können herausfinden, was es ist, indem Sie es ausführen ls ~/.config/lxsession/.

  2. Fügen Sie das Skript zu den Autostart-Dateien von Unity hinzu

    Öffnen Startup Applications(im Dashboard nach "Startup" suchen)

    Geben Sie hier die Bildbeschreibung ein

    Klicken Sie auf "Hinzufügen" und fügen Sie den Pfad zu Ihrem Skript in das Befehlsfeld ein:

    Geben Sie hier die Bildbeschreibung ein

Terdon
quelle
Ich habe keine Schleife verwendet, da beim Googeln über das Ausführen von Skripten im Hintergrund alle vorgeschlagen haben, keine Schleifen zu verwenden. Wenn dies die einzige Lösung ist und es kein Analogon von xinput gibt, das in einem Skript für einen Daemon verwendet werden kann und Geräte aktivieren / deaktivieren kann ... ok, ich werde es verwenden.
Mekkanizer
1
@mekkanizer das ist nicht wirklich der beste Weg als solcher. Eine viel sauberere Möglichkeit wäre, udev-Regeln zu verwenden und die erforderlichen X-Anmeldeinformationen in diese zu exportieren . Sie können das prüfen, wenn Sie möchten.
Terdon
Danke, werde tun. Wenn ich es zum Laufen bringe, schreibe ich zurück (oder
poste
10

Okay, ich habe eine udev-Regel dafür aufgestellt, und es ist, wie @terdon sagte, ein viel saubererer Weg

Dank dieses Handbuchs habe ich eine Datei "touchpad_toggle.rules" in /etc/udev/rules.d/ erstellt (Root-Zugriff erforderlich) und sie mit zwei Zeilen gefüllt:

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"

Vergessen Sie nicht, "Benutzername" durch Ihren Benutzernamen zu ersetzen!

Der Inhalt dieser On- und Off-Shell-Skripte ist nur eine kastrierte Version des Skripts in meiner Frage. Beispiel - 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

Sie müssen xinput enable $ TID in on.sh verwenden

Und vergessen Sie nicht, das Skript in meiner Frage (oder das von @terdon vorgeschlagene, aber ohne Schleife) zum automatischen Start der Sitzung hinzuzufügen, wie er es Ihnen in seiner Antwort gesagt hat.

Das ist es, aber ich muss eines hinzufügen:

Wenn Sie ein Synaptics-Touchpad haben (ich habe Elantech, daher ist es nicht für mich geeignet), können Sie Ihre Skripte (Pfade, in die Sie nach RUN + = schreiben) durch einen einfachen Befehl /usr/bin/synclient TouchpadOff=0bzw. 1 ersetzen

Mekkanizer
quelle
Nur ein Trottel, da Sie Root-Zugriff benötigen, um die udevRegel auf irgendeine Weise zu erstellen , ist es möglicherweise besser, die Datei an einem anderen Ort als im Home-Verzeichnis zu speichern. Zum Beispiel: /usr/local/binoder /opt/touchpad-toggle/bin/.
Dan
@ Dan lehnte ab. Alles, was mit Benutzereinstellungen zu tun hat, befindet sich besser im Ausgangsverzeichnis. Leider sind udev - Regeln, Login - Manager - Einstellungen und ein paar andere Dinge , vom Schicksal bestimmt zurück zu / * jedes Mal kopiert werden Sie Schrott / Partition, wenn Sie einen Schnappschuss natürlich wiederherstellen. Es ist also nur bequem, mehr Dinge in / home / zu speichern. Ihr Rat hat also keinen Wert
mekkanizer
Aber da es als udev-Regel hinzugefügt wurde, würde das nicht bedeuten, dass es für jeden Benutzer ausgeführt wird, unabhängig davon, wer es protokolliert hat?
Dan
Ich habe es nicht überprüft, da ich Linux nie auf gemeinsam genutzten PCs verwendet habe. Wie auch immer, jeder Benutzer, der von dieser ordentlichen udev-Regel irritiert ist, interessiert mich nicht. Wenn sie so empfindlich sind, können sie ihre eigene Installation bekommen
mekkanizer