Ubuntu – How to toggle the touchpad depending on whether a mouse is connected


I want to have my touchpad disabled automatically when an external mouse is connected and enabled when there is none. I have tried using touchpad-indicator but that fails in cases when the computer has been put to sleep with a mouse connected and awoken with the mouse disconnected.

I have tried to make the following script into a daemon to solve this issue but I can't get it to work:


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 ]
    xinput disable $TID
    xinput enable $TID

I tried start-stop-daemon -S -x ./myscript.sh -b

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

and nohup ./myscript 0<&- &>/dev/null &
and even ./myscript.sh &

All of these return some 4-digit number, which, I guess, should be PID of the started process but when I launch lxtask there are no processes with this PID, even if I tick "view all processes". And, of course, it doesn't work!

Best Answer

The basic script you need is simply:

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

The script above will toggle the trackpad depending on whether a mouse is connected. When launched, it will run for ever and will check for a mouse every second, disabling or enabling the touchpad accordingly.

Now, save the script as ~/touchpad.sh, make it executable (chmod +x ~/touchpad.sh) and add it to your GUI session startup programs. You have not specified which desktop environment you are using but since you mentioned lxtask, I will assume you are using LXDE. In any case, here are instructions for both LXDE and Unity:

  1. Add the script to LXDE's autostart files

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

    Make sure you replace "PROFILE" with the actual name of your LXDE profile, you can find out what it is by running ls ~/.config/lxsession/.

  2. Add the script to Unity's autostart files

    Open Startup Applications (search in the dashboard for "Startup")

    enter image description here

    Click on "Add" and then paste the path to your script in the command field:

    enter image description here