web-dev-qa-db-fra.com

Comment rendre les paramètres de la souris xinput persistants pour une souris USB?

J'utilise xinput à modifie les paramètres de ma souris USB :

xinput set-ptr-feedback 'USB Optical Mouse' 4 1 1

Comment puis-je rendre ces paramètres persistants après avoir débranché la souris ou redémarré?

5
ændrük

Vous pouvez cron la commande ou l'ajouter à votre démarrage, mais aucune n'est particulièrement élégante. Si j’étais vous, j’ajouterais cela à mes règles udev et laisserais le système détecter les événements et déclencher la commande quand il le faudrait.

Nous avons d’abord besoin du vendeur de souris et des chaînes de produit. Vous pouvez les trouver via lsusb. Cherchez votre souris. Voici ma souris apparaît:

Bus 004 Device 012: ID 1532:000f Razer USA, Ltd 

Dans la partie 1532:000f, 1532 est le fournisseur et 000f est le produit.

Nous ajoutons donc une règle à udev. Les règles udev se trouvent dans /lib/udev/rules.d/. Vous pouvez écrire le vôtre ou être effronté et en éditer un autre. Il y a un petit README utile aussi que je vous suggère de parcourir (cat /lib/udev/rules.d/README).

Selon que vous voulez ajouter une règle comme celle-ci. Notez que j'utilise les identifiants précédents pour que cela fonctionne.

BUS=="usb", SYSFS{idVendor}=="1532", SYSFS{idProduct}=="000f", ACTION=="add",
RUN+="/usr/bin/xinput set-ptr-feedback 'USB Optical Mouse' 4 1 1"

udev devrait le relever immédiatement.

Remarque udev peut faire des choses très intelligentes en ce qui concerne la configuration des périphériques. Vous pourriez ne pas avoir besoin de xinput du tout. Voici un exemple de ne configuration personnalisée pour une souris.

7
Oli

Je ne peux penser à aucune autre solution que de démarrer un petit démon qui interroge périodiquement xinput --list et exécute une commande lorsqu'un périphérique est branché ou supprimé.

Exemple de code:

#! /bin/sh -x
#
# xievd [INTERVAL]
#
# Poll `xinput` device list every INTERVAL seconds (default: 10)
# and run script in ~/.xievd/${device_name}.sh when a device is
# plugged-in (or pulled out).
#
# The device name is the same as given by `xinput --list`, with
# the following transformations applied:
#   * any non-alphanumeric character is deleted (except: space, `_` and `-`)
#   * leading and trailing spaces are removed
#   * any sequence of 1 or more space chars is converted to a single `_`
#

interval=${1:-10}

scripts_dir="$HOME/.xievd"
if [ ! -d "$scripts_dir" ]; then
  echo 1>&2 "xievd: No scripts directory -- exiting."
  exit 1
fi

state_dir="$(mktemp -t -d xievd.XXXXXX)" \
  || { echo 1>&2 "xievd: Cannot create state directory -- exiting."; exit 1; }
trap "rm -rf $state_dir; exit;" TERM QUIT INT ABRT

process_xinput_device_list() {
  touch "${state_dir}/.timestamp"

  # find new devices and run "start" script
  xinput --list --short \
    | fgrep slave \
    | sed -r -e 's/id=[0-9]+.+//;s/[^a-z0-9 _-]//ig;s/^ +//;s/ *$//;s/ +/_/g;' \
    | (while read device; do 
        if [ ! -e "${state_dir}/${device}" ]; then
          # new device, run plug-in script
          [ -x "${scripts_dir}/${device}" ] && "${scripts_dir}/${device}" start
        fi
        touch "${state_dir}/${device}"
      done)

  # find removed devices and run "stop" script
  for d in "$state_dir"/*; do
    if [ "${state_dir}/.timestamp" -nt "$d" ]; then
      # device removed, run "stop" script
      device="$(basename $d)"
      [ -x "${scripts_dir}/${device}" ] && "${scripts_dir}/${device}" stop
      rm -f "$d"
    fi
  done
}

# main loop
while true; do
      process_xinput_device_list
      sleep $interval
      sleep 1
done

# cleanup
rm -rf "$state_dir"

Enregistrez le code ci-dessus dans un fichier exécutable xievd quelque part dans votre CHEMIN, ajoutez-le à vos applications de démarrage, puis créez un script shell ~/.xievd/USB_Optical_Mouse:

#! /bin/sh
if [ "$1" = "start" ]; then
  xinput set-ptr-feedback 'USB Optical Mouse' 4 1 1
fi
2
Riccardo Murri