module Monky.Examples.IBus
( getIBusH
, IBusH
)
where
import qualified Data.Text as T
#if MIN_VERSION_base(4,8,0)
#else
import Control.Applicative ((<$>))
#endif
import DBus.Client (clientErrorMessage)
import Control.Exception (try)
import Control.Monad (void)
import Monky.Modules
import IBus
import IBus.EngineDesc
data IBusH = IBusH IBusClient [(String, MonkyOut)]
instance PollModule IBusH where
getOutput (IBusH h m) = do
engine <- try $ engineName <$> getIBusEngine h
case engine of
(Left e) -> return [MonkyPlain . T.pack $ clientErrorMessage e]
(Right x) -> return [remapEngine m x]
instance EvtModule IBusH where
startEvtLoop ih@(IBusH h m) r = do
r =<< getOutput ih
void $ subscribeToEngine h $ \xs -> do
let engine = head xs
r [remapEngine m engine]
getIBusH
:: [(String, MonkyOut)]
-> IO IBusH
getIBusH m = fmap (`IBusH` m) iBusConnect
remapEngine :: [(String, MonkyOut)] -> String -> MonkyOut
remapEngine [] x = MonkyPlain $ T.pack x
remapEngine ((l,r):xs) x = if l == x
then r
else remapEngine xs x