{-# LANGUAGE OverloadedStrings #-}
module System.Taffybar.Widget.SNITray
( TrayParams
, module System.Taffybar.Widget.SNITray
) where
import Control.Monad.Trans.Class
import Control.Monad.Trans.Reader
import qualified GI.Gtk
import qualified StatusNotifier.Host.Service as H
import StatusNotifier.Tray
import System.Posix.Process
import System.Taffybar.Context
import System.Taffybar.Widget.Util
import Text.Printf
sniTrayNew :: TaffyIO GI.Gtk.Widget
sniTrayNew :: TaffyIO Widget
sniTrayNew = TrayParams -> TaffyIO Widget
sniTrayNewFromParams TrayParams
defaultTrayParams
sniTrayNewFromParams :: TrayParams -> TaffyIO GI.Gtk.Widget
sniTrayNewFromParams :: TrayParams -> TaffyIO Widget
sniTrayNewFromParams TrayParams
params =
Bool -> TaffyIO Host
getTrayHost Bool
False TaffyIO Host -> (Host -> TaffyIO Widget) -> TaffyIO Widget
forall a b.
ReaderT Context IO a
-> (a -> ReaderT Context IO b) -> ReaderT Context IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TrayParams -> Host -> TaffyIO Widget
sniTrayNewFromHostParams TrayParams
params
sniTrayNewFromHostParams :: TrayParams -> H.Host -> TaffyIO GI.Gtk.Widget
sniTrayNewFromHostParams :: TrayParams -> Host -> TaffyIO Widget
sniTrayNewFromHostParams TrayParams
params Host
host = do
client <- (Context -> Client) -> ReaderT Context IO Client
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
asks Context -> Client
sessionDBusClient
lift $ do
tray <- buildTray host client params
_ <- widgetSetClassGI tray "sni-tray"
GI.Gtk.widgetShowAll tray
GI.Gtk.toWidget tray
sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt :: TaffyIO GI.Gtk.Widget
sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt :: TaffyIO Widget
sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt =
Bool -> TaffyIO Host
getTrayHost Bool
True TaffyIO Host -> (Host -> TaffyIO Widget) -> TaffyIO Widget
forall a b.
ReaderT Context IO a
-> (a -> ReaderT Context IO b) -> ReaderT Context IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TrayParams -> Host -> TaffyIO Widget
sniTrayNewFromHostParams TrayParams
defaultTrayParams
getTrayHost :: Bool -> TaffyIO H.Host
getTrayHost :: Bool -> TaffyIO Host
getTrayHost Bool
startWatcher = TaffyIO Host -> TaffyIO Host
forall t. Typeable t => Taffy IO t -> Taffy IO t
getStateDefault (TaffyIO Host -> TaffyIO Host) -> TaffyIO Host -> TaffyIO Host
forall a b. (a -> b) -> a -> b
$ do
pid <- IO ProcessID -> ReaderT Context IO ProcessID
forall (m :: * -> *) a. Monad m => m a -> ReaderT Context m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift IO ProcessID
getProcessID
client <- asks sessionDBusClient
Just host <- lift $ H.build H.defaultParams
{ H.dbusClient = Just client
, H.uniqueIdentifier = printf "taffybar-%s" $ show pid
, H.startWatcher = startWatcher
}
return host