====== Ubuntu - Mouse - Map Mouse Buttons to Arbitrary Functions ======
There are various options that can be used to allow a mouse button click to action an arbitrary function.
These include:
* **xbindkeys** allows you to map any mouse (or keyboard) event to some program.
* **xautomation** provides the **xte** program; which can generate fake input, including keystrokes and mouse-clicks.
* **xvkbd** can send a keyboard key signal or mouse click to other programs.
* **xdotool** can simulate keyboard input and mouse activity, move and resize windows, etc.
----
===== Install xbindkeys =====
sudo apt install xbindkeys
**NOTE:** Xbindkeys is a program that allows to bind commands to certain keys or key combinations on the keyboard.
* Xbindkeys works with multimedia keys and is window manager independent.
----
===== Install xautomation =====
sudo apt install xautomation
**NOTE:** This provides the **xte** program; which can generate fake input, including keystrokes and mouse-clicks.
----
===== Create the xbindkeys Configuration File =====
xbindkeys --defaults > $HOME/.xbindkeysrc
**NOTE:** The **$HOME/.xbindkeysrc** file could also be created manually.
**NOTE:** The format of this file is a series of paired lines.
- The first line is a command to be executed for an event;
* The quotation marks ("") around the command is required.
- The second line is the associated mouse button.
* The first mouse button (left) is called b:1, the second b:2 and so forth.
----
===== Assign a function to a Mouse Button =====
Edit the xbindkeys Configuration file, **~/.xbindkeysrc**:
Add commands similar to this:
"xte 'keydown Home' 'keyup Home'"
b:6
**NOTE:** This binds __button 6__ to the __home__ key
* Raw keycodes can be used too, for example:
"xte 'keydown Home' 'keyup Home'"
m:0x0 + b:6
See: [[Ubuntu:Mouse:Map Mouse Buttons to Arbitrary Functions:Identify the key codes to use|Identify the key codes to use]]
----
==== Another examples ====
# Refresh
"xte 'key F5'"
b:4 + control
**NOTE:** This maps:
* This will cause the forward mouse button and the CTRL key to emulate pressing the F5 key.
* This is useful for refreshing a web page without moving your hand off the mouse.
----
==== Other examples ====
# Back
"xte 'keydown Alt_L' 'key Left' 'keyup Alt_L'"
b:8
# Forward
"xte 'keydown Alt_L' 'key Right' 'keyup Alt_L'"
b:9
**NOTE:** This maps:
* Button 8 is mapped to ALT+LEFT.
* Button 9 is mapped to ALT+RIGHT.
----
==== More complex examples ====
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
**NOTE:** This maps a double-left-click to button 8.
* The **Release** option catches __release__ events instead of __press__ events.
----
====== Restart xbindkeys ======
If any changes are made to the config file then xbindkeys needs to be restarted:
killall xbindkeys
xbindkeys
----
====== References ======
https://linux.die.net/man/7/xautomation
https://manpages.debian.org/stretch/xautomation/xte.1
https://linux.die.net/man/1/xte