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!


@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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.