¿Cómo puedo alternar el panel táctil dependiendo de si un mouse está conectado?

10

Quiero que mi panel táctil se deshabilite automáticamente cuando se conecte un mouse externo y se habilite cuando no haya ninguno. He intentado usarlo, touchpad-indicatorpero eso falla en los casos en que la computadora se ha dormido con un mouse conectado y despertado con el mouse desconectado.

Intenté convertir el siguiente script en un demonio para resolver este problema, pero no puedo hacer que funcione:

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

Lo intenté start-stop-daemon -S -x ./myscript.sh -b

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

e nohup ./myscript 0<&- &>/dev/null & incluso./myscript.sh &

Todos estos devuelven un número de 4 dígitos, que, supongo, debería ser PID del proceso iniciado, pero cuando ejecuto lxtask no hay procesos con este PID , incluso si marco "ver todos los procesos". Y, por supuesto, ¡no funciona!

mekkanizer
fuente
@terdon Estoy tratando de hacer un demonio mirando el mouse usb conectado y le pido a xinput que active o desactive el panel táctil. La única otra solución para el problema, un programa llamado panel táctil-indicador, tiene un pequeño defecto. Cuando pongo mi computadora portátil dormida con el mouse conectado y la despierto sin ella, tengo que buscar el mouse más cercano para conectarlo / desconectarlo para que mi touchpad esté habilitado. En resumen, quiero que se vuelva a comprobar el hecho al despertar.
mekkanizer
Bienvenido a Ask Ubuntu! Por favor, editar su pregunta para añadir información adicional, que es difícil de leer y es fácil perderse en los comentarios.
terdon
En primer lugar, debe explicar que está "tratando de demonizarlo" y cómo exactamente lo está haciendo. Luego, xinputnecesita un servidor X en ejecución, y la mayoría de los métodos para ejecutar cosas como demonios no tienen conocimiento ni capacidad para conectarse a X. En tercer lugar, y la razón principal por la que siempre debe explicar lo que está tratando de hacer es que muy a menudo la solución que alguien está intentando aplicar no es realmente la forma de hacerlo y terminas haciendo la pregunta incorrecta, comúnmente conocida como el problema XY .
terdon
@terdon Volviendo a la búsqueda de soluciones, ¿cuál es el (posible) análogo de xinput que: 1. Puede ejecutarse en segundo plano 2. ¿Puede habilitar / deshabilitar dispositivos?
mekkanizer
1
comentarios eliminados . Ser amable en Ask Ubuntu no es opcional. Por favor, ser amable. Los comentarios groseros se eliminarán sin previo aviso.
Seth

Respuestas:

10

El script básico que necesita es simplemente:

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

La secuencia de comandos anterior alternará el panel táctil dependiendo de si un mouse está conectado. Cuando se inicie, se ejecutará para siempre y buscará un mouse cada segundo, deshabilitando o habilitando el panel táctil en consecuencia.

Ahora, guarde el script como ~/touchpad.sh, hágalo ejecutable ( chmod +x ~/touchpad.sh) y agréguelo a sus programas de inicio de sesión de GUI. No ha especificado qué entorno de escritorio está utilizando, pero desde que lo mencionó lxtask, supondré que lo está utilizando LXDE. En cualquier caso, aquí hay instrucciones para ambos LXDEy Unity:

  1. Agregue el script a los archivos de inicio automático de LXDE

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

    Asegúrese de reemplazar "PERFIL" con el nombre real de su perfil LXDE , puede averiguar cuál es ejecutando ls ~/.config/lxsession/.

  2. Agregue el script a los archivos de inicio automático de Unity

    Abrir Startup Applications(busque en el panel de control "Inicio")

    ingrese la descripción de la imagen aquí

    Haga clic en "Agregar" y luego pegue la ruta a su script en el campo de comando:

    ingrese la descripción de la imagen aquí

terdon
fuente
No utilicé un bucle porque cuando busqué en Google las secuencias de comandos en segundo plano, todos sugirieron no usar bucles. Si esa es la única solución y no hay un análogo de xinput que PUEDE usarse en un script para un demonio y PUEDE habilitar / deshabilitar dispositivos ... ok, lo usaré.
mekkanizer
1
@mekkanizer esta no es realmente la mejor manera como tal. Una forma mucho más limpia sería utilizar las reglas de udev y exportarles las credenciales X necesarias . Puedes investigar eso si lo deseas.
terdon
Gracias, lo hare. Si lo hago funcionar, lo escribiré de nuevo (o publicaré una respuesta)
mekkanizer
10

Bien, hice una regla de udev para ello, y es, como dijo @terdon, una forma mucho más limpia

Entonces, gracias a esta guía , creé un archivo "touchpad_toggle.rules" en /etc/udev/rules.d/ (requiere acceso de root) y lo llené con dos líneas:

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"

¡No olvides reemplazar "nombre de usuario" con tu nombre de usuario!

El contenido de estos scripts de shell dentro y fuera de la consola es solo una versión castrada del script en mi pregunta. Ejemplo - 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

Tendrás que usar xinput enable $ TID en on.sh

Y no olvide agregar el script en mi pregunta (o la que sugirió @terdon, pero sin bucle) al inicio automático de la sesión como le dijo en su respuesta.

Eso es todo, pero tengo que agregar una cosa:

Si tiene un panel táctil Synaptics (tengo Elantech, por lo que no es adecuado para mí), puede reemplazar sus scripts (rutas en las que escribe después de RUN + =) con un comando simple /usr/bin/synclient TouchpadOff=0y 1 respectivamente

mekkanizer
fuente
solo un poco, ya que necesita acceso de root para crear la udevregla de cualquier manera, puede ser mejor guardar el archivo en otro lugar que no sea el directorio de inicio. Por ejemplo: /usr/local/bino /opt/touchpad-toggle/bin/.
Dan
@Dan se negó. Todo lo relacionado con la configuración del usuario debe estar en el directorio de inicio. Desafortunadamente, las reglas de udev, la configuración de gestor de inicio y un par de otras cosas están predestinadas a copiar de nuevo a / * cada vez que Metal / partición, a menos que restaure una instantánea por supuesto. Así que tener más cosas almacenadas en / home / es solo conveniencia. Por lo tanto, su consejo no tiene valor
mekkanizer
Pero dado que se agregó como una regla de udev, ¿eso no significaría que se ejecutaría para cualquier usuario, sin importar quién lo haya registrado?
Dan
No lo comprobé, ya que nunca usé Linux en PC compartidas. De todos modos, cualquier usuario que esté irritado por esta clara regla de udev no es de mi interés. Si son tan sensibles, pueden obtener su propia instalación
mekkanizer