module IBus.EngineDesc
( IBusEngineDesc (..)
, getIBusEngine
, subscribeToEngine
)
where
import Control.Monad (join)
import Data.Maybe (fromJust)
import Data.Word (Word32)
import DBus
import DBus.Client
import IBus
type SignalH = SignalHandler
data IBusEngineDesc
= IBusEngineDesc
{ engineName :: String
, engineLongName :: String
, engineDescription :: String
, engineLanguage :: String
, engineLicense :: String
, engineAuthor :: String
, engineIcon :: String
, engineLayout :: String
, engineRank :: Int
, engineHotkeys :: String
, engineSymbol :: String
, engineSetup :: String
, engineLayoutVar :: String
, engineLayoutOpt :: String
, engineVersion :: String
, engineDomain :: String
, engineIconKey :: String
} deriving (Eq, Show)
getBody :: MethodReturn -> Variant
getBody = fromJust . join . fmap fromVariant . fromVariant . head . methodReturnBody
replyToEngineDesc :: MethodReturn -> Maybe IBusEngineDesc
replyToEngineDesc m = do
let [name, _, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17] = structureItems . fromJust . fromVariant . getBody $m
a1 <- fromVariant v1 :: Maybe String
a2 <- fromVariant v2 :: Maybe String
a3 <- fromVariant v3 :: Maybe String
a4 <- fromVariant v4 :: Maybe String
a5 <- fromVariant v5 :: Maybe String
a6 <- fromVariant v6 :: Maybe String
a7 <- fromVariant v7 :: Maybe String
a8 <- fromVariant v8 :: Maybe String
a9 <- fromVariant v9 :: Maybe Word32
a10 <- fromVariant v10 :: Maybe String
a11 <- fromVariant v11 :: Maybe String
a12 <- fromVariant v12 :: Maybe String
a13 <- fromVariant v13 :: Maybe String
a14 <- fromVariant v14 :: Maybe String
a15 <- fromVariant v15 :: Maybe String
a16 <- fromVariant v16 :: Maybe String
a17 <- fromVariant v17 :: Maybe String
if (fromJust $fromVariant name :: String) == "IBusEngineDesc"
then return (IBusEngineDesc a1 a2 a3 a4 a5 a6 a7 a8 (fromIntegral a9) a10 a11 a12 a13 a14 a15 a16 a17)
else Nothing
getIBusEngine :: IBusClient -> IO IBusEngineDesc
getIBusEngine client = fmap (fromJust . replyToEngineDesc) $
call_ client (methodCall "/org/freedesktop/IBus" "org.freedesktop.DBus.Properties" "Get")
{ methodCallDestination = Just "org.freedesktop.IBus"
, methodCallBody =
[ toVariant ("org.freedesktop.IBus" :: String)
, toVariant ("GlobalEngine" :: String)
]
}
getNewOrder :: Signal -> Maybe [String]
getNewOrder s = do
[section, option] <- sequence . map fromVariant . init . signalBody $s:: Maybe [String]
vars' <- fromVariant . last . signalBody $s
vars <- fromVariant vars' :: Maybe [String]
if section == "general" && option == "engines_order"
then return vars
else Nothing
subscribeToEngine :: Client -> ([String] -> IO ()) -> IO SignalH
subscribeToEngine client f =
addMatch client
(matchAny {matchPath = Just "/org/freedesktop/IBus/Config"})
(\s -> case getNewOrder s of
Just x -> f x
Nothing -> return ())