diff options
Diffstat (limited to 'src/Xmobar/Plugins/Monitors/Cpu.hs')
-rw-r--r-- | src/Xmobar/Plugins/Monitors/Cpu.hs | 78 |
1 files changed, 58 insertions, 20 deletions
diff --git a/src/Xmobar/Plugins/Monitors/Cpu.hs b/src/Xmobar/Plugins/Monitors/Cpu.hs index 3d18da3..10881b6 100644 --- a/src/Xmobar/Plugins/Monitors/Cpu.hs +++ b/src/Xmobar/Plugins/Monitors/Cpu.hs @@ -1,3 +1,5 @@ +{-#LANGUAGE RecordWildCards#-} + ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Cpu @@ -13,12 +15,23 @@ -- ----------------------------------------------------------------------------- -module Xmobar.Plugins.Monitors.Cpu (startCpu, runCpu, cpuConfig, CpuDataRef, parseCpu) where +module Xmobar.Plugins.Monitors.Cpu + ( startCpu + , runCpu + , cpuConfig + , CpuDataRef + , CpuOpts + , CpuArguments + , parseCpu + , getArguments + ) where import Xmobar.Plugins.Monitors.Common -import qualified Data.ByteString.Lazy.Char8 as B +import qualified Data.ByteString.Char8 as B import Data.IORef (IORef, newIORef, readIORef, writeIORef) import System.Console.GetOpt +import Xmobar.App.Timer (doEveryTenthSeconds) +import Control.Monad (void) newtype CpuOpts = CpuOpts { loadIconPattern :: Maybe IconPattern @@ -63,25 +76,50 @@ parseCpu cref = percent = map ((/ tot) . fromIntegral) dif return percent -formatCpu :: CpuOpts -> [Float] -> Monitor [String] -formatCpu _ [] = return $ replicate 8 "" -formatCpu opts xs = do +formatCpu :: CpuOpts -> [Float] -> PureConfig -> IO [String] +formatCpu _ [] _ = return $ replicate 8 "" +formatCpu opts xs p = do let t = sum $ take 3 xs - b <- showPercentBar (100 * t) t - v <- showVerticalBar (100 * t) t - d <- showIconPattern (loadIconPattern opts) t - ps <- showPercentsWithColors (t:xs) - return (b:v:d:ps) - -runCpu :: CpuDataRef -> [String] -> Monitor String -runCpu cref argv = - do c <- io (parseCpu cref) - opts <- io $ parseOptsWith options defaultOpts argv - l <- formatCpu opts c - parseTemplate l + b <- pShowPercentBar p (100 * t) t + v <- pShowVerticalBar p (100 * t) t + d <- pShowIconPattern (loadIconPattern opts) t + ps <- pShowPercentsWithColors p (t:xs) + return $ (b:v:d:ps) + +data CpuArguments = CpuArguments { + cpuDataRef :: !CpuDataRef, + cpuParams :: !PureConfig, + cpuArgs :: ![String], + cpuOpts :: !CpuOpts, + cpuInputTemplate :: ![(String, String, String)], -- [("Cpu: ","total","% "),("","user","%")] + cpuAllTemplate :: ![(String, [(String, String, String)])] -- [("bar",[]),("vbar",[]),("ipat",[]),("total",[]),...] + } + +getArguments :: [String] -> IO CpuArguments +getArguments cpuArgs = do + cpuDataRef <- newIORef [] + cpuParams <- computePureConfig cpuArgs cpuConfig + cpuInputTemplate <- runTemplateParser cpuParams + cpuAllTemplate <- runExportParser (pExport cpuParams) + nonOptions <- case getOpt Permute commonOptions cpuArgs of + (_, n, []) -> pure n + (_,_,errs) -> error $ "getArguments: " <> show errs + cpuOpts <- case getOpt Permute options nonOptions of + (o, _, []) -> pure $ foldr id defaultOpts o + (_,_,errs) -> error $ "getArguments options: " <> show errs + pure CpuArguments{..} + + +runCpu :: CpuArguments -> IO String +runCpu CpuArguments{..} = do + cpuValue <- parseCpu cpuDataRef + temMonitorValues <- formatCpu cpuOpts cpuValue cpuParams + let templateInput = TemplateInput { temInputTemplate = cpuInputTemplate, temAllTemplate = cpuAllTemplate, ..} + pureParseTemplate cpuParams templateInput startCpu :: [String] -> Int -> (String -> IO ()) -> IO () -startCpu a r cb = do +startCpu args refreshRate cb = do cref <- newIORef [] - _ <- parseCpu cref - runM a cpuConfig (runCpu cref) r cb + void $ parseCpu cref + cpuArgs <- getArguments args + doEveryTenthSeconds refreshRate (runCpu cpuArgs >>= cb) |