{-# LANGUAGE OverloadedStrings #-} ----------------------------------------------------------------------------- -- | -- Module : System.Taffybar.Widget.SNITray -- Copyright : (c) Ivan A. Malison -- License : BSD3-style (see LICENSE) -- -- Maintainer : Ivan A. Malison -- Stability : unstable -- Portability : unportable ----------------------------------------------------------------------------- module System.Taffybar.Widget.SNITray where import Control.Monad.Trans.Class import Control.Monad.Trans.Reader import qualified GI.Gtk import Graphics.UI.GIGtkStrut 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 getHost :: Bool -> TaffyIO H.Host getHost startWatcher = getStateDefault $ do pid <- lift 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 -- | Build a new StatusNotifierItem tray that will share a host with any other -- trays that are constructed automatically sniTrayNewFromHost :: H.Host -> TaffyIO GI.Gtk.Widget sniTrayNewFromHost host = do client <- asks sessionDBusClient lift $ do tray <- buildTray TrayParams { trayHost = host , trayClient = client , trayOrientation = GI.Gtk.OrientationHorizontal , trayImageSize = Expand , trayIconExpand = False , trayAlignment = End } _ <- widgetSetClassGI tray "sni-tray" GI.Gtk.widgetShowAll tray GI.Gtk.toWidget tray sniTrayNew :: TaffyIO GI.Gtk.Widget sniTrayNew = getHost False >>= sniTrayNewFromHost sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt :: TaffyIO GI.Gtk.Widget sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt = getHost True >>= sniTrayNewFromHost