I am new to Xmonad (just installed it yesterday), and since I have never used haskell before, I found configuration a little bit confusing for me. I got somewhat made xmobar and trayer work, but I have no idea how might I make multimedia keys to adjust volume. Can anyone help with that?

Additional question: How do you manage your volume in xmonad. Do you use tray icon, or other things like that?

Here is my xmonad configuration:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.EZConfig(additionalKeys)
import System.IO

main = xmonad =<< statusBar myBar myPP toggleStrutKey myConfig

-- Command to launch the bar
myBar = "xmobar"

-- Custom PP, it determines what is written to the bar
myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }

-- Key bindings to toggle the gap for the bar
toggleStrutKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

myConfig = defaultConfig {
    manageHook = manageDocks <+> manageHook defaultConfig,
    layoutHook = avoidStruts $ layoutHook defaultConfig,
    modMask = mod4Mask -- Rebind Mod to windows key
    } `additionalKeys`
    [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock")

4 Answers 4


Use 'xev' and tap the multimedia keys to discover their names. One might be 'XF86XK_AudioMute'. Then look at the contents of '/usr/include/X11/XF86keysym.h' and look for the name. On my system, 'XF86XK_AudioMute' is '0x1008FF12'.

Drop that where you would put a key in your config file. It might look like this:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.EZConfig(additionalKeys)
import System.IO


 } `additionalKeys`
    [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock"),
      ((0                     , 0x1008FF11), spawn "amixer -q sset Master 2%-"),
      ((0                     , 0x1008FF13), spawn "amixer -q sset Master 2%+"),
      ((0                     , 0x1008FF12), spawn "amixer set Master toggle")

'amixer' will set your volume. The '0' replacing mod4Mask allows you to tap the multimedia key without holding your mod key.

  • 1
    When I use xev and press volume keys on my HP laptop I get no keycodes, but showkey command show them as keycode 114 and keycode 115. How do I need to change this XMonad config file to work with my keys?
    – valentt
    Jul 3, 2013 at 18:38
  • On Ubuntu 13.04 this worked copy/paste without looking up the keys symbols.
    – Cory Klein
    Oct 16, 2013 at 21:19
  • 2
    If the mute above cannot unmute, try amixer -D pulse set Master toggle instead.
    – zw324
    Dec 26, 2013 at 19:26
  • 1
    Mute key problem: When I start xev and press mute key, there's nothing to find in the terminal. (Other keys are fine.) I looked up from /usr/include/X11/XF86keysym.h, I found this: #define XF86XK_AudioMute 0x1008FF12 /* Mute sound from the system */ Do you know what's the problem with my mute key? Thank you.
    – Nick
    Dec 18, 2014 at 0:42
  • Another Mute key problem: I can't find the name for Mute either. (I use ThinkPad.)
    – Nick
    Dec 22, 2014 at 14:48

See this Graphics.X11.ExtraTypes.XF86 for keys you want and add to your config file:

import Graphics.X11.ExtraTypes.XF86
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[ ...
, ((0, xF86XK_AudioLowerVolume   ), spawn "amixer set Master 2-")
, ((0, xF86XK_AudioRaiseVolume   ), spawn "amixer set Master 2+")
, ((0, xF86XK_AudioMute          ), spawn "amixer set Master toggle")
  • I get an error with this config: "xmonad.hs:29:1: parse error (possibly incorrect indentation) Please check the file for errors." That line is where "[ ..." begins ... Do you know why this happens?
    – valentt
    Jul 3, 2013 at 18:09
  • 4
    To use Graphics.X11.ExtraTypes.XF86 is the better solution for readability.
    – erik
    Oct 4, 2013 at 9:52
  • @valentt The line with the dots is just an example. It should look like that, so instead of the three dots you have your first key defined: [ ((modMask, xK_e ), spawn "dmenu_run")
    – erik
    Oct 4, 2013 at 9:57

If you're using pulseaudio, pactl also should work.

, ((0 , xF86XK_AudioRaiseVolume), spawn "pactl set-sink-volume 0 +1.5%")
, ((0 , xF86XK_AudioLowerVolume), spawn "pactl set-sink-volume 0 -- -1.5%")
, ((0 , xF86XK_AudioMute), spawn "pactl set-sink-mute 0 toggle")

0 is sink id. pactl list short sinks will show sink list.

pactl stat|grep 'Default Sink' | cut -f2 -d':'

will show current default sink. You can use sink name instead numeric id.

Doulble dash -- tells 'this is not option(like -h), just value' to pactl.

  • 1
    Nice! However, the -- didn't work for me on 15.10, just removing it did the trick. Also, there is a special name @DEFAULT_SINK@, so you don't need to fiddle around with device specific numbers/names.
    – iGEL
    Jan 8, 2016 at 12:54
  • 1
    This is perfect, replacing 0 with @DEFAULT_SINK@ in the above commands! At least for those switching from other DEs -- thanks a lot to you!
    – Jan D
    Mar 3, 2016 at 12:05
  • This answer has the benefit of going over 100% instead of capping (like amixer caps). The bad thing is that it stops working when you play the music from different sink. May 6, 2018 at 23:48

If amixer set Master 2- does not work. Try amixer -D pulse set Master 2- instead. Also 2%- and 2%+ will change the volume by 2 percent, which may be easier to use. You can test these commands in the terminal to adjust them to your liking before you put them in you xmonad config file.

  • ... -D pulse ... worked for me! also, a -q flag quiets the output
    – Josh.F
    Jan 16, 2017 at 19:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.