How do you make volume keys and mute key work in Xmonad
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")
]
Solution 1:
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
-CUT-
} `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.
Solution 2:
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")
...]
Solution 3:
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
.
Solution 4:
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.