    {-# LANGUAGE OverloadedStrings #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      : System.Taffybar.Example
    -- Copyright   : (c) Ivan A. Malison
    -- License     : BSD3-style (see LICENSE)
    --
    -- Maintainer  : Ivan A. Malison
    -- Stability   : unstable
    -- Portability : unportable
    -----------------------------------------------------------------------------
    module System.Taffybar.Example where

    -- XXX: in an actual taffybar.hs configuration file, you will need the module
    -- name to be Main, and you would need to have a main function defined at the
    -- top level, e.g.
    --
    -- > main = dyreTaffybar exampleTaffybarConfig

    import Data.Default (def)
    import System.Taffybar.Context (TaffybarConfig(..))
    import System.Taffybar.Hooks
    import System.Taffybar.Information.CPU
    import System.Taffybar.Information.Memory
    import System.Taffybar.SimpleConfig
    import System.Taffybar.Widget
    import System.Taffybar.Widget.Generic.PollingGraph

    transparent, yellow1, yellow2, green1, green2, taffyBlue
      :: (Double, Double, Double, Double)
    transparent :: (Double, Double, Double, Double)
    transparent = (Double
    0.0, Double
    0.0, Double
    0.0, Double
    0.0)
    yellow1 :: (Double, Double, Double, Double)
    yellow1 = (Double
    0.9453125, Double
    0.63671875, Double
    0.2109375, Double
    1.0)
    yellow2 :: (Double, Double, Double, Double)
    yellow2 = (Double
    0.9921875, Double
    0.796875, Double
    0.32421875, Double
    1.0)
    green1 :: (Double, Double, Double, Double)
    green1 = (Double
    0, Double
    1, Double
    0, Double
    1)
    green2 :: (Double, Double, Double, Double)
    green2 = (Double
    1, Double
    0, Double
    1, Double
    0.5)
    taffyBlue :: (Double, Double, Double, Double)
    taffyBlue = (Double
    0.129, Double
    0.588, Double
    0.953, Double
    1)

    myGraphConfig, netCfg, memCfg, cpuCfg :: GraphConfig
    myGraphConfig :: GraphConfig
    myGraphConfig =
      GraphConfig
    forall a. Default a => a
    def
      { graphPadding = 0
      , graphBorderWidth = 0
      , graphWidth = 75
      , graphBackgroundColor = transparent
      }

    netCfg :: GraphConfig
    netCfg = GraphConfig
    myGraphConfig
      { graphDataColors = [yellow1, yellow2]
      , graphLabel = Just "net"
      }

    memCfg :: GraphConfig
    memCfg = GraphConfig
    myGraphConfig
      { graphDataColors = [taffyBlue]
      , graphLabel = Just "mem"
      }

    cpuCfg :: GraphConfig
    cpuCfg = GraphConfig
    myGraphConfig
      { graphDataColors = [green1, green2]
      , graphLabel = Just "cpu"
      }

    memCallback :: IO [Double]
    memCallback :: IO [Double]
    memCallback = do
      MemoryInfo
    mi <- IO MemoryInfo
    parseMeminfo
      [Double] -> IO [Double]
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return [MemoryInfo -> Double
    memoryUsedRatio MemoryInfo
    mi]

    cpuCallback :: IO [Double]
    cpuCallback :: IO [Double]
    cpuCallback = do
      (Double
    _, Double
    systemLoad, Double
    totalLoad) <- IO (Double, Double, Double)
    cpuLoad
      [Double] -> IO [Double]
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return [Double
    totalLoad, Double
    systemLoad]

    exampleTaffybarConfig :: TaffybarConfig
    exampleTaffybarConfig :: TaffybarConfig
    exampleTaffybarConfig =
      let myWorkspacesConfig :: WorkspacesConfig
    myWorkspacesConfig =
            WorkspacesConfig
    forall a. Default a => a
    def
            { minIcons = 1
            , widgetGap = 0
            , showWorkspaceFn = hideEmpty
            }
          workspaces :: TaffyIO Widget
    workspaces = WorkspacesConfig -> TaffyIO Widget
    workspacesNew WorkspacesConfig
    myWorkspacesConfig
          cpu :: TaffyIO Widget
    cpu = GraphConfig -> Double -> IO [Double] -> TaffyIO Widget
    forall (m :: * -> *).
    MonadIO m =>
    GraphConfig -> Double -> IO [Double] -> m Widget
    pollingGraphNew GraphConfig
    cpuCfg Double
    0.5 IO [Double]
    cpuCallback
          mem :: TaffyIO Widget
    mem = GraphConfig -> Double -> IO [Double] -> TaffyIO Widget
    forall (m :: * -> *).
    MonadIO m =>
    GraphConfig -> Double -> IO [Double] -> m Widget
    pollingGraphNew GraphConfig
    memCfg Double
    1 IO [Double]
    memCallback
          net :: TaffyIO Widget
    net = GraphConfig -> Maybe [String] -> TaffyIO Widget
    networkGraphNew GraphConfig
    netCfg Maybe [String]
    forall a. Maybe a
    Nothing
          clock :: TaffyIO Widget
    clock = ClockConfig -> TaffyIO Widget
    forall (m :: * -> *). MonadIO m => ClockConfig -> m Widget
    textClockNewWith ClockConfig
    forall a. Default a => a
    def
          layout :: TaffyIO Widget
    layout = LayoutConfig -> TaffyIO Widget
    layoutNew LayoutConfig
    forall a. Default a => a
    def
          windowsW :: TaffyIO Widget
    windowsW = WindowsConfig -> TaffyIO Widget
    windowsNew WindowsConfig
    forall a. Default a => a
    def
          -- See https://github.com/taffybar/gtk-sni-tray#statusnotifierwatcher
          -- for a better way to set up the sni tray
          tray :: TaffyIO Widget
    tray = TaffyIO Widget
    sniTrayThatStartsWatcherEvenThoughThisIsABadWayToDoIt
          myConfig :: SimpleTaffyConfig
    myConfig = SimpleTaffyConfig
    forall a. Default a => a
    def
            { startWidgets =
                workspaces : map (>>= buildContentsBox) [ layout, windowsW ]
            , endWidgets = map (>>= buildContentsBox)
              [ batteryIconNew
              , clock
              , tray
              , cpu
              , mem
              , net
              , mpris2New
              ]
            , barPosition = Top
            , barPadding = 10
            , barHeight = ExactSize 50
            , widgetSpacing = 0
            }
      in TaffybarConfig -> TaffybarConfig
    withBatteryRefresh (TaffybarConfig -> TaffybarConfig)
    -> TaffybarConfig -> TaffybarConfig
    forall a b. (a -> b) -> a -> b
    $ TaffybarConfig -> TaffybarConfig
    withLogServer (TaffybarConfig -> TaffybarConfig)
    -> TaffybarConfig -> TaffybarConfig
    forall a b. (a -> b) -> a -> b
    $
         TaffybarConfig -> TaffybarConfig
    withToggleServer (TaffybarConfig -> TaffybarConfig)
    -> TaffybarConfig -> TaffybarConfig
    forall a b. (a -> b) -> a -> b
    $ SimpleTaffyConfig -> TaffybarConfig
    toTaffyConfig SimpleTaffyConfig
    myConfig