Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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")
share|improve this question
up vote 16 down vote accepted

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 set Master 2-"),
      ((0                     , 0x1008FF13), spawn "amixer set 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.

share|improve this answer
This works. Thanks. – yasar Feb 14 '12 at 17:17
if the amixer set Master 2- doesn't work for your system, try amixer set Master 2%- – zhenjie May 30 '13 at 19:11
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 '13 at 18:38
On Ubuntu 13.04 this worked copy/paste without looking up the keys symbols. – Cory Klein Oct 16 '13 at 21:19
If the mute above cannot unmute, try amixer -D pulse set Master toggle instead. – Ziyao Wei Dec 26 '13 at 19:26

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")
share|improve this answer
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 '13 at 18:09
To use Graphics.X11.ExtraTypes.XF86 is the better solution for readability. – erik Oct 4 '13 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 '13 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.

share|improve this answer
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 at 12:54
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 at 12:05

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.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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