xmonad-spotify-0.1.1.0: src/XMonad/Util/Spotify.hs
-- | Bind media keys for Spotify using @dbus@.
module XMonad.Util.Spotify ( -- * default keybindings
mediaKeys
-- * media control in the 'X' monad
, audioPrev
, audioNext
, audioPlayPause
, audioStop
) where
import Control.Monad.IO.Class
import qualified Data.Map as M
import DBus
import DBus.Client
import Graphics.X11.ExtraTypes.XF86
import Graphics.X11.Types
-- | Given your keymaps, add the media keybindings. Currently they are set up
-- for Spotify.
mediaKeys :: MonadIO m => M.Map (KeyMask, KeySym) (m ()) -> M.Map (KeyMask, KeySym) (m ())
mediaKeys = M.union mediaKeyMap
where mediaKeyMap = M.fromList mediaKeyList
mediaKeyList :: MonadIO m => [((KeyMask, KeySym), m ())]
mediaKeyList = [ ((0, xF86XK_AudioNext), audioNext)
, ((0, xF86XK_AudioPrev), audioPrev)
, ((0, xF86XK_AudioPlay), audioPlayPause)
, ((0, xF86XK_AudioStop), audioStop)
]
-- FIXME: don't connect one session each time?
sp :: MonadIO m => String -> m ()
sp str = liftIO $ do
client <- connectSession
_ <- call_ client (methodCall (objectPath_ "/org/mpris/MediaPlayer2") (interfaceName_ "org.mpris.MediaPlayer2.Player") (memberName_ str))
{ methodCallDestination = Just (busName_ "org.mpris.MediaPlayer2.spotify") }
disconnect client
-- | Action in the 'X' monad to go to next
audioNext :: MonadIO m => m ()
audioNext = sp "Next"
-- | Action in the 'X' monad to go the previous
audioPrev :: MonadIO m => m ()
audioPrev = sp "Previous"
-- | Action in the 'X' monad to play/pause
audioPlayPause :: MonadIO m => m ()
audioPlayPause = sp "PlayPause"
audioStop :: MonadIO m => m ()
audioStop = sp "Stop"