Как я могу переключать тачпад в зависимости от того, подключена ли мышь?

Я хочу, чтобы моя сенсорная панель автоматически отключалась при подключении внешней мыши и включалась, когда ее нет. Я пытался использовать touchpad-indicator но это не помогает в тех случаях, когда компьютер был переведен в режим сна с подключенной мышью и проснулся с отключенной мышью.

Я попытался превратить следующий скрипт в демон для решения этой проблемы, но не могу заставить его работать:

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

Я старался start-stop-daemon -S -x ./myscript.sh -b

а также setsid ./myscript.sh >/dev/null 2>&1 < /dev/null &

а также nohup ./myscript 0<&- &>/dev/null &и даже ./myscript.sh &

Все они возвращают некое 4-значное число, которое, я полагаю, должно быть PID запущенного процесса, но когда я запускаю lxtask , нет процессов с этим PID, даже если я отмечаю "просмотреть все процессы". И, конечно, это не работает!

2 ответа

Решение

Основной скрипт, который вам нужен, это просто:

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

Сценарий выше будет переключать трекпад в зависимости от того, подключена ли мышь. После запуска он будет работать вечно и каждую секунду будет проверять наличие мыши, соответственно отключая или включая сенсорную панель.

Теперь сохраните скрипт как ~/touchpad.shсделать его исполняемым (chmod +x ~/touchpad.sh) и добавьте его в программу запуска сеанса GUI. Вы не указали, какую среду рабочего стола вы используете, но так как вы упомянули lxtaskЯ предполагаю, что вы используете LXDE, В любом случае, здесь есть инструкции для обоих LXDE а также Unity:

  1. Добавьте скрипт в файлы автозапуска LXDE

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

    Убедитесь, что вы заменили "PROFILE" реальным именем вашего профиля LXDE, вы можете узнать, что это такое, запустив ls ~/.config/lxsession/,

  2. Добавьте скрипт в файлы автозапуска Unity

    открыто Startup Applications (поиск на панели инструментов для "запуска")

    введите описание здесь

    Нажмите "Добавить", а затем вставьте путь к вашему сценарию в поле команды:

    введите описание здесь

Хорошо, я сделал для него правило udev, и, как сказал @terdon, это намного чище

Итак, благодаря этому руководству я создал файл "touchpad_toggle.rules" в /etc/udev/rules.d/ (требуется доступ с правами root) и заполнил его двумя строками:

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"

Не забудьте заменить "имя пользователя" на ваше имя пользователя!

Содержимое этих включенных и выключенных сценариев оболочки - просто кастрированная версия сценария в моем вопросе. Пример - 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

Вам нужно будет использовать xinput enable $TID в on.sh

И не забудьте добавить скрипт в моем вопросе (или тот, который предложил @terdon, но без цикла) в автозапуск сеанса, как он сказал вам в своем ответе.

Вот и все, но я должен добавить одну вещь:

Если у вас есть тачпад Synaptics (у меня есть Elantech, так что он мне не подходит), вы можете заменить свои скрипты (пути к которым вы пишете после RUN+=) простой командой /usr/bin/synclient TouchpadOff=0 и 1 соответственно

Другие вопросы по тегам