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


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


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

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

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

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


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


просто придирка, так как вам нужен root-доступ для создания udevправила любым способом, может быть лучше сохранить файл в другом месте, чем домашний каталог. Например: /usr/local/binили /opt/touchpad-toggle/bin/.
— Дан

@ Дэн отказался. Все, что связано с настройками пользователя, лучше быть в домашнем каталоге. К сожалению, правила udev, настройки менеджера входа в систему и пара других вещей обречены копировать обратно в / * каждый раз, когда вы копируете / разбиваете на разделы, если, конечно, вы не восстановите снимок. Поэтому хранить больше вещей в / home / - это просто удобство. Итак, ваш совет не имеет значения
— мекканизатор

Но так как он был добавлен как правило udev, не означает ли это, что он будет работать для любого пользователя, независимо от того, кто его зарегистрировал?
— Дан

Я не проверял, так как я никогда не использовал Linux на общих компьютерах. В любом случае, любой пользователь, которого раздражает это аккуратное правило udev, меня не интересует. Если они настолько чувствительны, они могут получить свою собственную установку
— mekkanizer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.