module System.Taffybar.NetMonitor (
netMonitorNew,
netMonitorNewWith,
defaultNetFormat
) where
import Data.IORef
import Graphics.UI.Gtk
import System.Information.Network (getNetInfo)
import System.Taffybar.Widgets.PollingLabel
import Text.Printf (printf)
import Text.StringTemplate
defaultNetFormat :: String
defaultNetFormat = "▼ $inKB$kb/s ▲ $outKB$kb/s"
netMonitorNew :: Double
-> String
-> IO Widget
netMonitorNew interval interface =
netMonitorNewWith interval interface 2 defaultNetFormat
netMonitorNewWith :: Double
-> String
-> Integer
-> String
-> IO Widget
netMonitorNewWith interval interface prec template = do
sample <- newIORef [0, 0]
label <- pollingLabelNew "" interval $ showInfo sample interval interface template prec
widgetShowAll label
return $ toWidget label
showInfo :: IORef [Integer] -> Double -> String -> String -> Integer -> IO String
showInfo sample interval interface template prec = do
maybeThisSample <- getNetInfo interface
case maybeThisSample of
Nothing -> return ""
Just thisSample -> do
lastSample <- readIORef sample
writeIORef sample thisSample
let deltas = map (max 0 . fromIntegral) $ zipWith () thisSample lastSample
speed@[incomingb, outgoingb] = map (/(interval)) deltas
[incomingkb, outgoingkb] = map (setDigits prec . (/1024)) speed
[incomingmb, outgoingmb] = map (setDigits prec . (/square 1024)) speed
attribs = [ ("inB", show incomingb)
, ("inKB", incomingkb)
, ("inMB", incomingmb)
, ("outB", show outgoingb)
, ("outKB", outgoingkb)
, ("outMB", outgoingmb)
]
return . render . setManyAttrib attribs $ newSTMP template
square :: Double -> Double
square x = x ^ (2 :: Int)
setDigits :: Integer -> Double -> String
setDigits dig a = printf format a
where format = "%." ++ show dig ++ "f"