arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
175 lines (109 loc) • 6.57 kB
Markdown
Related articles
* [Xmodmap](/index.php/Xmodmap "Xmodmap")
* [Sxhkd](/index.php/Sxhkd "Sxhkd")
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 independent of the window manager and desktop environment.
## Contents
* [1 Installation](#Installation)
* [2 Configuration](#Configuration)
* [2.1 Volume control](#Volume_control)
* [2.2 Backlight control](#Backlight_control)
* [2.3 GUI method](#GUI_method)
* [3 Identifying keycodes](#Identifying_keycodes)
* [4 Making changes permanent](#Making_changes_permanent)
* [5 Simulating multimedia keys](#Simulating_multimedia_keys)
* [6 Troubleshooting](#Troubleshooting)
## Installation
[Install](/index.php/Install "Install") the [xbindkeys](https://www.archlinux.org/packages/?name=xbindkeys) package.
## Configuration
Create a blank `~/.xbindkeysrc`, or you can create a sample file (Note this includes some bindings such as `Ctrl+f`, which you may want to edit or remove):
```
$ xbindkeys -d > ~/.xbindkeysrc
```
Now you can either edit `~/.xbindkeysrc` to set keybindings, or you can do that with the GUI.
**Tip:** After you made a change, execute `xbindkeys -p` to reload the configuration file and apply the changes.
### Volume control
Here is an example configuration file that binds Fn key combos on a laptop to *pactl* commands that adjust sound volume. Note that pound (#) symbols can be used to create comments.
```
# Increase volume
"pactl set-sink-volume @DEFAULT_SINK@ +1000"
XF86AudioRaiseVolume
```
```
# Decrease volume
"pactl set-sink-volume @DEFAULT_SINK@ -1000"
XF86AudioLowerVolume
```
```
# Mute volume
"pactl set-sink-mute @DEFAULT_SINK@ toggle"
XF86AudioMute
```
For alternative commands to control volume, see [PulseAudio#Keyboard volume control](/index.php/PulseAudio#Keyboard_volume_control "PulseAudio") or [ALSA#Keyboard volume control](/index.php/ALSA#Keyboard_volume_control "ALSA").
### Backlight control
Keybindings can also be defined in order to control the brightness of the screen.
```
# Increase backlight
"xbacklight -inc 10"
XF86MonBrightnessUp
```
```
# Decrease backlight
"xbacklight -dec 10"
XF86MonBrightnessDown
```
### GUI method
For graphical configuration [install](/index.php/Install "Install") the [xbindkeys_config-gtk2](https://aur.archlinux.org/packages/xbindkeys_config-gtk2/) package and run:
```
$ xbindkeys_config
```
## Identifying keycodes
To find the keycodes for a particular key, enter the following command:
```
$ xbindkeys -k
```
A blank window will pop up. Press the key(s) to which you wish to assign a command and *xbindkeys* will output a handy snippet that can be entered into `~/.xbindkeysrc`. For example, while the blank window is open, press `Alt+o` to get the following output (results may vary):
```
"(Scheme function)"
m:0x8 + c:32
Alt + o
```
The first line represents a command. The second contains the state (0x8) and keycode (32) as reported by `xev`. The third line contains the keysyms associated with the given keycodes. To use this output, copy either one of the last two lines to `~/.xbindkeysrc` and replace "(Scheme function)" with the command you wish to perform.
**Tip:** Use `xbindkeys -mk` to keep the key prompt open for multiple keypresses. Press `q` to quit.
To identify mouse buttons, you can use xev, see [[1]](https://blog.hanschen.org/2009/10/13/mouse-shortcuts-with-xbindkeys/).
## Making changes permanent
Once you are done configuring your keys, edit your [xprofile](/index.php/Xprofile "Xprofile") or [xinitrc](/index.php/Xinitrc "Xinitrc") file (depending on your window manager) and place
```
xbindkeys
```
before the line that starts your window manager or DE.
## Simulating multimedia keys
The XF86Audio* and other multimedia keys [[2]](http://wiki.linuxquestions.org/wiki/XF86_keyboard_symbols) are pretty-much well-recognized by the major DEs. For keyboards without such keys, you can simulate their effect with other keys
```
# Decrease volume on pressing Super-minus
"pactl set-sink-volume 0 -1000"
m:0x50 + c:20
Mod2+Mod4 + minus
```
However, to actually call the keys themselves you can use tools like [xdotool](https://www.archlinux.org/packages/?name=xdotool) (from [official repositories](/index.php/Official_repositories "Official repositories")) and [xmacro](https://aur.archlinux.org/packages/xmacro/) (from the [AUR](/index.php/AUR "AUR")). Unfortunately since you would already be holding down some modifier key (Super or Shift, for example), X will see the result as `Super-XF86AudioLowerVolume` which will not do anything useful. Here is a script based on *xmacro* and *xmodmap* from the [xorg-xmodmap](https://www.archlinux.org/packages/?name=xorg-xmodmap) package for doing this[[3]](https://bbs.archlinux.org/viewtopic.php?pid=843395).
```
#!/bin/sh
echo 'KeyStrRelease Super_L KeyStrRelease minus'
```
This works for calling XF86AudioLowerVolume once (assuming you are using `Super+minus`), but repeatedly calling it without releasing the Super key (like tapping on a volume button) does not work. If you would like it to work that way, add the following line to the bottom of the script.
```
echo 'KeyStrPress Super_L' | xmacroplay :0
```
With this modified script, if you press the key combination fast enough your Super_L key will remain 'on' till the next time you hit it, which may result in some interesting side-effects. Just tap it again to remove that state, or use the original script if you want things to 'just work' and do not mind not multi-tapping on volume up/down.
These instructions are valid for pretty much any one of the XF86 multimedia keys (important ones would be XF86AudioRaiseVolume, XF86AudioLowerVolume, XF86AudioPlay, XF86AudioPrev, XF86AudioNext).
## Troubleshooting
If, for any reason, a hotkey you *already* set in `~/.xbindkeysrc` does not work, open up a terminal and type the following:
```
$ xbindkeys -n
```
By pressing the non-working key, you will be able to see any error *xbindkeys* encounter (e.g: mistyped command/keycode,...).
If the command for a keybind works via the xdotool in command line, but not when activated by the hotkey try adding "+ Release" to the hotkey (Esp notable on gnome):
```
"xdotool key --clearmodifiers XF86AudioPlay"
Mod2 + F7 + Release
```
This will make the F7 key play/pause audio. Where the "xdotool" command would work in commandline, if the "+ Release" is removed it will fail with xbindkeys.