taffybar-2.0.0: src/System/Taffybar/Widget/Generic/PollingBar.hs
-- | Like the vertical bar, but this widget automatically updates
-- itself with a callback at fixed intervals.
module System.Taffybar.Widget.Generic.PollingBar (
-- * Types
VerticalBarHandle,
BarConfig(..),
BarDirection(..),
-- * Constructors and accessors
pollingBarNew,
verticalBarFromCallback,
defaultBarConfig
) where
import Control.Concurrent
import Control.Exception.Enclosed ( tryAny )
import Graphics.UI.Gtk
import System.Taffybar.Widget.Util ( backgroundLoop, drawOn )
import System.Taffybar.Widget.Generic.VerticalBar
verticalBarFromCallback :: BarConfig -> IO Double -> IO Widget
verticalBarFromCallback cfg action = do
(drawArea, h) <- verticalBarNew cfg
drawOn drawArea $
backgroundLoop $ do
esample <- tryAny action
traverse (verticalBarSetPercent h) esample
pollingBarNew :: BarConfig -> Double -> IO Double -> IO Widget
pollingBarNew cfg pollSeconds action =
verticalBarFromCallback cfg $ action <* delay
where delay = threadDelay $ floor (pollSeconds * 1000000)