Jak mogę przełączać touchpad w zależności od tego, czy mysz jest podłączona?

10

Chcę, aby mój touchpad był automatycznie wyłączany, gdy podłączona jest zewnętrzna mysz, i włączany, gdy nie ma żadnej. Próbowałem używać, touchpad-indicatorale to się nie udaje w przypadkach, gdy komputer został uśpiony z myszą podłączoną i obudzoną z myszą odłączoną.

Próbowałem przekształcić następujący skrypt w demona, aby rozwiązać ten problem, ale nie mogę go uruchomić:

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

próbowałem start-stop-daemon -S -x ./myscript.sh -b

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

a nohup ./myscript 0<&- &>/dev/null & nawet./myscript.sh &

Wszystkie zwracają jakąś 4-cyfrową liczbę, która, jak sądzę, powinna być PID uruchomionego procesu, ale kiedy uruchamiam lxtask, nie ma żadnych procesów z tym PID , nawet jeśli zaznaczę „wyświetl wszystkie procesy”. I oczywiście to nie działa!

mekkanizer
źródło
@terdon Im próbuje zrobić demona oglądającego podłączoną mysz USB i poprosić xinput o włączenie lub wyłączenie touchpada. Jedyne inne rozwiązanie problemu, program o nazwie touchpad-wskaźnik, ma niewielką wadę. Kiedy wyczuwam, że mój komputer śpi z podłączoną myszą i wybudzam go bez niego, muszę wyszukać najbliższą mysz, aby ją podłączyć / odłączyć, aby mój touchpad był włączony. Krótko mówiąc, chcę, aby fakt ponownego sprawdzenia tego po przebudzeniu.
mekkanizer
Witamy w Ask Ubuntu! Proszę edytować swoje pytanie, aby dodać dodatkowe informacje, to jest trudne do odczytania i łatwo przegapić w komentarzach.
terdon
Przede wszystkim powinieneś wyjaśnić, że „próbujesz demonizować to” i jak dokładnie to robisz. Następnie xinputpotrzebuje działającego serwera X i większość metod uruchamiania rzeczy, ponieważ demony nie mają wiedzy ani możliwości łączenia się z X. Po trzecie, a głównym powodem, dla którego zawsze powinieneś wyjaśniać, co próbujesz zrobić, jest to bardzo często rozwiązanie to, że ktoś próbuje się zgłosić, nie jest tak naprawdę sposobem na załatwienie sprawy, a ty ostatecznie zadajesz złe pytanie, powszechnie znane jako problem XY .
terdon
@terdon Wracając do szukania rozwiązań, jaki jest (możliwy?) odpowiednik xinput, który: 1. Może działać w tle 2. Może włączać / wyłączać urządzenia?
mekkanizer
1
komentarze usunięte . Bycie miłym w Ask Ubuntu nie jest opcjonalne. Proszę bądź miły. Niegrzeczne komentarze zostaną usunięte bez ostrzeżenia.
Seth

Odpowiedzi:

10

Podstawowy skrypt, którego potrzebujesz to po prostu:

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

Powyższy skrypt przełącza gładzik w zależności od tego, czy mysz jest podłączona. Po uruchomieniu będzie działał na zawsze i będzie sprawdzał mysz co sekundę, odpowiednio wyłączając lub włączając touchpad.

Teraz zapisz skrypt jako ~/touchpad.sh, ustaw go jako wykonywalny ( chmod +x ~/touchpad.sh) i dodaj go do programów startowych sesji GUI. Nie określiłeś używanego środowiska pulpitu, ale ponieważ wspomniałeś lxtask, założę się, że używasz LXDE. W każdym razie oto instrukcje dla obu LXDEi Unity:

  1. Dodaj skrypt do plików autostartu LXDE

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

    Upewnij się, że zastąpiłeś „PROFIL” rzeczywistą nazwą swojego profilu LXDE , możesz dowiedzieć się, co to jest, uruchamiając ls ~/.config/lxsession/.

  2. Dodaj skrypt do plików autostartu Unity

    Otwórz Startup Applications(wyszukaj w panelu „Uruchomienie”)

    wprowadź opis zdjęcia tutaj

    Kliknij „Dodaj”, a następnie wklej ścieżkę do skryptu w polu poleceń:

    wprowadź opis zdjęcia tutaj

terdon
źródło
Nie korzystałem z pętli, ponieważ kiedy przeglądałem o skryptach w tle, wszyscy sugerowali, aby nie używać pętli. Jeśli to jedyne rozwiązanie i nie ma analogicznego xinput, którego MOŻNA użyć w skrypcie dla demona i CAN włączyć / wyłączyć urządzenia ... ok, skorzystam z niego.
mekkanizer
1
@mekkanizer to nie jest tak naprawdę najlepszy sposób. O wiele czystszy sposób byłoby użyć udev zasady i eksportu niezbędne poświadczenia X do nich. Możesz to sprawdzić, jeśli chcesz.
terdon
Dzięki, zrobię. Jeśli sprawię, że zadziała,
odpiszę
10

Okej, postanowiłem to udev i jest to, jak powiedział @terdon, znacznie czystszy sposób

Dzięki temu przewodnikowi utworzyłem plik „touchpad_toggle.rules” w /etc/udev/rules.d/ (wymaga dostępu do katalogu głównego) i wypełniłem go dwoma wierszami:

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"

Nie zapomnij zastąpić nazwy użytkownika nazwą użytkownika!

Treść tych włączanych i wyłączanych skryptów powłoki jest po prostu wykastrowaną wersją skryptu w moim pytaniu. Przykład - 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

Musisz użyć xinput enable $ TID w pliku on.sh

I nie zapomnij dodać skryptu do mojego pytania (lub sugerowanego przez @terdona, ale bez pętli) do automatycznego uruchamiania sesji, tak jak powiedział ci w swojej odpowiedzi.

To jest to, ale muszę dodać jedną rzecz:

Jeśli masz touchpad Synaptics (mam Elantech, więc nie jest to dla mnie odpowiednie), możesz zastąpić swoje skrypty (ścieżki, do których piszesz po RUN + =) za pomocą prostej komendy /usr/bin/synclient TouchpadOff=0i odpowiednio 1

mekkanizer
źródło
tylko nitpick, ponieważ potrzebujesz dostępu do konta root, aby utworzyć udevregułę w jakikolwiek sposób, może być lepiej zapisać plik w innym miejscu niż katalog domowy. Na przykład: /usr/local/binlub /opt/touchpad-toggle/bin/.
Dan
@Dan odmówił. Wszystko, co dotyczy ustawień użytkownika, powinno znajdować się w katalogu domowym. Niestety, zasady udev, ustawienia menedżera logowania i kilka innych rzeczy są skazane na skopiowanie z powrotem do / * za każdym razem, gdy skrobisz partycję, chyba że przywrócisz oczywiście migawkę. Zatem posiadanie większej liczby rzeczy przechowywanych w / home / to tylko wygoda. Tak więc twoja rada nie ma żadnej wartości
mekkanizer
Ale skoro został dodany jako reguła udev, czy nie oznacza to, że będzie działał dla każdego użytkownika, bez względu na to, kto go zalogował?
Dan.
Nie sprawdziłem, ponieważ nigdy nie korzystałem z Linuksa na współdzielonych komputerach. W każdym razie każdy użytkownik, który jest zirytowany tą czystą zasadą udev, nie jest moim zainteresowaniem. Jeśli są tak wrażliwi, mogą uzyskać własną instalację
mekkanizer