module XMonad.Util.Spotify (
mediaKeys
, mediaKeysWith
, audioPrev
, audioNext
, audioPlayPause
, audioStop
, audioNextWith
, audioPrevWith
, audioPlayPauseWith
, audioStopWith
) where
import Control.Monad (void)
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
mediaKeys :: MonadIO m => M.Map (KeyMask, KeySym) (m ()) -> M.Map (KeyMask, KeySym) (m ())
mediaKeys :: Map (KeyMask, KeySym) (m ()) -> Map (KeyMask, KeySym) (m ())
mediaKeys = Map (KeyMask, KeySym) (m ())
-> Map (KeyMask, KeySym) (m ()) -> Map (KeyMask, KeySym) (m ())
forall k a. Ord k => Map k a -> Map k a -> Map k a
M.union Map (KeyMask, KeySym) (m ())
mediaKeyMap
where mediaKeyMap :: Map (KeyMask, KeySym) (m ())
mediaKeyMap = [((KeyMask, KeySym), m ())] -> Map (KeyMask, KeySym) (m ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [((KeyMask, KeySym), m ())]
forall (m :: * -> *). MonadIO m => [((KeyMask, KeySym), m ())]
mediaKeyList
mediaKeyList :: MonadIO m => [((KeyMask, KeySym), m ())]
mediaKeyList :: [((KeyMask, KeySym), m ())]
mediaKeyList = [ ((0, KeySym
xF86XK_AudioNext), m ()
forall (m :: * -> *). MonadIO m => m ()
audioNext)
, ((0, KeySym
xF86XK_AudioPrev), m ()
forall (m :: * -> *). MonadIO m => m ()
audioPrev)
, ((0, KeySym
xF86XK_AudioPlay), m ()
forall (m :: * -> *). MonadIO m => m ()
audioPlayPause)
, ((0, KeySym
xF86XK_AudioStop), m ()
forall (m :: * -> *). MonadIO m => m ()
audioStop)
]
mediaKeysWith :: MonadIO m => Client -> M.Map (KeyMask, KeySym) (m ()) -> M.Map (KeyMask, KeySym) (m ())
mediaKeysWith :: Client
-> Map (KeyMask, KeySym) (m ()) -> Map (KeyMask, KeySym) (m ())
mediaKeysWith client :: Client
client = Map (KeyMask, KeySym) (m ())
-> Map (KeyMask, KeySym) (m ()) -> Map (KeyMask, KeySym) (m ())
forall k a. Ord k => Map k a -> Map k a -> Map k a
M.union Map (KeyMask, KeySym) (m ())
mediaKeyMap
where mediaKeyMap :: Map (KeyMask, KeySym) (m ())
mediaKeyMap = [((KeyMask, KeySym), m ())] -> Map (KeyMask, KeySym) (m ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList (Client -> [((KeyMask, KeySym), m ())]
forall (m :: * -> *).
MonadIO m =>
Client -> [((KeyMask, KeySym), m ())]
mediaKeyListWith Client
client)
mediaKeyListWith :: MonadIO m => Client -> [((KeyMask, KeySym), m ())]
mediaKeyListWith :: Client -> [((KeyMask, KeySym), m ())]
mediaKeyListWith client :: Client
client = [ ((0, KeySym
xF86XK_AudioNext), Client -> m ()
forall (m :: * -> *). MonadIO m => Client -> m ()
audioNextWith Client
client)
, ((0, KeySym
xF86XK_AudioPrev), Client -> m ()
forall (m :: * -> *). MonadIO m => Client -> m ()
audioPrevWith Client
client)
, ((0, KeySym
xF86XK_AudioPlay), Client -> m ()
forall (m :: * -> *). MonadIO m => Client -> m ()
audioPlayPauseWith Client
client)
, ((0, KeySym
xF86XK_AudioStop), Client -> m ()
forall (m :: * -> *). MonadIO m => Client -> m ()
audioStopWith Client
client)
]
spWith :: MonadIO m => Client -> String -> m ()
spWith :: Client -> String -> m ()
spWith client :: Client
client str :: String
str = m MethodReturn -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m MethodReturn -> m ()) -> m MethodReturn -> m ()
forall a b. (a -> b) -> a -> b
$ IO MethodReturn -> m MethodReturn
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO MethodReturn -> m MethodReturn)
-> IO MethodReturn -> m MethodReturn
forall a b. (a -> b) -> a -> b
$
Client -> MethodCall -> IO MethodReturn
call_ Client
client (ObjectPath -> InterfaceName -> MemberName -> MethodCall
methodCall (String -> ObjectPath
objectPath_ "/org/mpris/MediaPlayer2") (String -> InterfaceName
interfaceName_ "org.mpris.MediaPlayer2.Player") (String -> MemberName
memberName_ String
str))
sp :: MonadIO m => String -> m ()
sp :: String -> m ()
sp str :: String
str = do
Client
client <- IO Client -> m Client
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Client
connectSession
Client -> String -> m ()
forall (m :: * -> *). MonadIO m => Client -> String -> m ()
spWith Client
client String
str
IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Client -> IO ()
disconnect Client
client
audioNextWith :: MonadIO m => Client -> m ()
audioNextWith :: Client -> m ()
audioNextWith = (Client -> String -> m ()) -> String -> Client -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Client -> String -> m ()
forall (m :: * -> *). MonadIO m => Client -> String -> m ()
spWith "Next"
audioPrevWith :: MonadIO m => Client -> m ()
audioPrevWith :: Client -> m ()
audioPrevWith = (Client -> String -> m ()) -> String -> Client -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Client -> String -> m ()
forall (m :: * -> *). MonadIO m => Client -> String -> m ()
spWith "Previous"
audioPlayPauseWith :: MonadIO m => Client -> m ()
audioPlayPauseWith :: Client -> m ()
audioPlayPauseWith = (Client -> String -> m ()) -> String -> Client -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Client -> String -> m ()
forall (m :: * -> *). MonadIO m => Client -> String -> m ()
spWith "PlayPause"
audioStopWith :: MonadIO m => Client -> m ()
audioStopWith :: Client -> m ()
audioStopWith = (Client -> String -> m ()) -> String -> Client -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Client -> String -> m ()
forall (m :: * -> *). MonadIO m => Client -> String -> m ()
spWith "Stop"
audioNext :: MonadIO m => m ()
audioNext :: m ()
audioNext = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
sp "Next"
audioPrev :: MonadIO m => m ()
audioPrev :: m ()
audioPrev = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
sp "Previous"
audioPlayPause :: MonadIO m => m ()
audioPlayPause :: m ()
audioPlayPause = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
sp "PlayPause"
audioStop :: MonadIO m => m ()
audioStop :: m ()
audioStop = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
sp "Stop"