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

10

Я хочу, чтобы моя сенсорная панель автоматически отключалась, когда подключена внешняя мышь, и включалась, когда ее нет. Я пытался использовать, 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 , даже если я отмечаю «просмотреть все процессы». И, конечно же, это не работает!

mekkanizer
источник
@terdon Я пытаюсь заставить демона наблюдать за подключенной USB-мышью и попросить xinput включить или отключить тачпад. Единственное другое решение проблемы, программа под названием touchpad-индикатор, имеет небольшой недостаток. Когда я просыпаю свой ноутбук с подключенной мышью и просыпаюсь без него, мне приходится искать ближайшую мышь, чтобы подключить / отключить ее, чтобы тачпад был включен. Короче говоря, я хочу, чтобы факт этого был перепроверен при пробуждении.
mekkanizer
Добро пожаловать в Спросите Ubuntu! Пожалуйста, отредактируйте свой вопрос, чтобы добавить дополнительную информацию, это трудно прочитать и легко пропустить в комментариях.
тердон
Прежде всего вы должны объяснить, что вы «пытаетесь демонизировать это» и как именно вы это делаете. Затем xinputтребуется работающий X-сервер, и большинство методов запуска вещей в качестве демонов не знают или не могут подключиться к X. В-третьих, и главная причина, почему вы всегда должны объяснять, что вы пытаетесь сделать, это то, что очень часто решение то, что кто-то пытается подать заявку, на самом деле не способ сделать это, и в итоге вы задаете неправильный вопрос, обычно известный как проблема XY .
тердон
@terdon Возвращаясь к поиску решений, каков (возможный?) аналог xinput, который: 1. может работать в фоновом режиме 2. может включать / отключать устройства?
mekkanizer
1
комментарии удалены . Быть милым в Ask Ubuntu не является обязательным. Пожалуйста будь вежлив. Грубые комментарии будут удалены без предупреждения.
Сет

Ответы:

10

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

#!/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(поиск на панели инструментов для «запуска»)

    введите описание изображения здесь

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

    введите описание изображения здесь

terdon
источник
Я не использовал цикл, потому что когда я гуглял о запуске скриптов в фоновом режиме, все предлагали не использовать циклы. Если это единственное решение и нет аналога xinput, который МОЖЕТ быть использован в скрипте для демона и МОЖЕТ включать / отключать устройства ... хорошо, я буду его использовать.
mekkanizer
1
@mekkanizer это не самый лучший способ как таковой. Гораздо чище способом было бы использовать Udev правила и экспортировать необходимые X учетных данных для них. Вы можете посмотреть на это, если хотите.
тердон
Спасибо, сделаю. Если я заставлю это работать, я напишу назад (или
отправлю
10

Хорошо, я сделал для него правило 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 соответственно

mekkanizer
источник
просто придирка, так как вам нужен root-доступ для создания udevправила любым способом, может быть лучше сохранить файл в другом месте, чем домашний каталог. Например: /usr/local/binили /opt/touchpad-toggle/bin/.
Дан
@ Дэн отказался. Все, что связано с настройками пользователя, лучше быть в домашнем каталоге. К сожалению, правила udev, настройки менеджера входа в систему и пара других вещей обречены копировать обратно в / * каждый раз, когда вы копируете / разбиваете на разделы, если, конечно, вы не восстановите снимок. Поэтому хранить больше вещей в / home / - это просто удобство. Итак, ваш совет не имеет значения
мекканизатор
Но так как он был добавлен как правило udev, не означает ли это, что он будет работать для любого пользователя, независимо от того, кто его зарегистрировал?
Дан
Я не проверял, так как я никогда не использовал Linux на общих компьютерах. В любом случае, любой пользователь, которого раздражает это аккуратное правило udev, меня не интересует. Если они настолько чувствительны, они могут получить свою собственную установку
mekkanizer