** xinput-toggle

Enable, disable or toggle devices such as the mouse, touchpad, etc...

Specify devices using ~cl-ppcre~ regular expressions:
https://edicl.github.io/cl-ppcre/.

This module depends on ~xinput~ which is part of the ~X.Org~ suite of tools.

** Usage

Add something like the following to your =~/.stumpwmrc=:

#+BEGIN_SRC lisp
  (load "xinput-toggle")

  ;; disable all devices whose names match the regex "touchpad".
  (xinput-toggle:xinput-disable-devices "touchpad")

  ;; enable all devices whose names match the regex "wireless mouse".
  (xinput-toggle:xinput-enable-devices "wireless mouse")

  ;; bind a key to toggle all devices whose names match the regex "touchpad"
  (define-key *top-map* (kbd "XF86TouchpadToggle")
    "xinput-toggle-devices touchpad")
#+END_SRC

~touchpad~ and ~wireless mouse~ are regular expressions matching device names.

On my system the touchpad device name is ~FTCS1000:00 2808:0101 Touchpad~. The
regex ~touchpad~ matches it.

*** ~*case-insensitive-regex*~

~xinput-toggle:*case-insensitive-regex*~ allows case-insensitive matching. By
default its value is ~T~ and can be set to ~NIL~ for case-sensitive matching.

** Discover device names

To specify a device you need its name.  Hence the first step is to discover the
device name.  You can then decide suitable regular expressions.

*** Using StumpWM command xinput-list-devices

One way to discover device names is to run the command (StumpWM command (colon))
~xinput-list-devices~ passing NAME-REGEX as an argument. It lists devices whose
names match NAME-REGEX.

List all devices:

#+begin_src
  xinput-list-devices ""
#+end_src

List all devices whose names matche ~mouse~ or ~touchpad~:

#+begin_src
  xinput-list-devices "mouse|touchpad"
#+end_src

*** Using the xinput utility program

Alternatively list devices using the ~xinput~ program via the command line:

#+BEGIN_SRC bash :results output
  xinput list --name-only
#+END_SRC

#+RESULTS:
#+begin_example
Virtual core pointer
Virtual core XTEST pointer
Logitech Wireless Mouse
FTCS1000:00 2808:0101 Mouse
ImPS/2 Logitech Wheel Mouse
Virtual core keyboard
Virtual core XTEST keyboard
Power Button
Video Bus
Power Button
Sleep Button
BisonCam,NB Pro: BisonCam,NB Pr
AT Translated Set 2 keyboard
∼ FTCS1000:00 2808:0101 Touchpad
#+end_example

See https://linux.die.net/man/1/xinput.

** Excluding keyboards

The following example would have disabled all devices including keyboards.
However if keyboards get disabled by mistake, there might be no way to interact
with StumpWM.

Hence there is a guard in place to exclude device names containing "keyboard".

#+BEGIN_SRC lisp
  (xinput-toggle:xinput-disable-devices "")
#+END_SRC

~xinput:*exclude-keyboards*~ acts as a guard against disabling keyboards by
mistake. By default its value is ~T~ during which ~xinput-toggle~ excludes
devices whose name contains the string ~keyboard~ (always case insensitive). It
can be set to ~NIL~ to disable the guard.

The below will not list keyboard devices as the guard is enabled.

#+BEGIN_SRC lisp
  (xinput-toggle:xinput-list-devices "keyboard")
#+END_SRC

This below lists device names matching "keyboard" as we disable the guard.

#+BEGIN_SRC lisp
  (let ((xinput-toggle:*exclude-keyboards* NIL))
    (xinput-toggle:xinput-list-devices "keyboard"))
#+END_SRC
