{-#LANGUAGE CPP #-}
module Xmobar.Plugins.Monitors.Mem (memConfig, runMem, totalMem, usedMem) where
import Xmobar.Plugins.Monitors.Common
import System.Console.GetOpt
#if defined(freebsd_HOST_OS)
import qualified Xmobar.Plugins.Monitors.Mem.FreeBSD as MM
#else
import qualified Xmobar.Plugins.Monitors.Mem.Linux as MM
#endif
data MemOpts = MemOpts
{ MemOpts -> Maybe IconPattern
usedIconPattern :: Maybe IconPattern
, MemOpts -> Maybe IconPattern
freeIconPattern :: Maybe IconPattern
, MemOpts -> Maybe IconPattern
availableIconPattern :: Maybe IconPattern
}
defaultOpts :: MemOpts
defaultOpts :: MemOpts
defaultOpts = MemOpts :: Maybe IconPattern
-> Maybe IconPattern -> Maybe IconPattern -> MemOpts
MemOpts
{ usedIconPattern :: Maybe IconPattern
usedIconPattern = Maybe IconPattern
forall a. Maybe a
Nothing
, freeIconPattern :: Maybe IconPattern
freeIconPattern = Maybe IconPattern
forall a. Maybe a
Nothing
, availableIconPattern :: Maybe IconPattern
availableIconPattern = Maybe IconPattern
forall a. Maybe a
Nothing
}
options :: [OptDescr (MemOpts -> MemOpts)]
options :: [OptDescr (MemOpts -> MemOpts)]
options =
[ [Char]
-> [[Char]]
-> ArgDescr (MemOpts -> MemOpts)
-> [Char]
-> OptDescr (MemOpts -> MemOpts)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"used-icon-pattern"] (([Char] -> MemOpts -> MemOpts)
-> [Char] -> ArgDescr (MemOpts -> MemOpts)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg (\[Char]
x MemOpts
o ->
MemOpts
o { usedIconPattern :: Maybe IconPattern
usedIconPattern = IconPattern -> Maybe IconPattern
forall a. a -> Maybe a
Just (IconPattern -> Maybe IconPattern)
-> IconPattern -> Maybe IconPattern
forall a b. (a -> b) -> a -> b
$ [Char] -> IconPattern
parseIconPattern [Char]
x }) [Char]
"") [Char]
""
, [Char]
-> [[Char]]
-> ArgDescr (MemOpts -> MemOpts)
-> [Char]
-> OptDescr (MemOpts -> MemOpts)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"free-icon-pattern"] (([Char] -> MemOpts -> MemOpts)
-> [Char] -> ArgDescr (MemOpts -> MemOpts)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg (\[Char]
x MemOpts
o ->
MemOpts
o { freeIconPattern :: Maybe IconPattern
freeIconPattern = IconPattern -> Maybe IconPattern
forall a. a -> Maybe a
Just (IconPattern -> Maybe IconPattern)
-> IconPattern -> Maybe IconPattern
forall a b. (a -> b) -> a -> b
$ [Char] -> IconPattern
parseIconPattern [Char]
x }) [Char]
"") [Char]
""
, [Char]
-> [[Char]]
-> ArgDescr (MemOpts -> MemOpts)
-> [Char]
-> OptDescr (MemOpts -> MemOpts)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"available-icon-pattern"] (([Char] -> MemOpts -> MemOpts)
-> [Char] -> ArgDescr (MemOpts -> MemOpts)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg (\[Char]
x MemOpts
o ->
MemOpts
o { availableIconPattern :: Maybe IconPattern
availableIconPattern = IconPattern -> Maybe IconPattern
forall a. a -> Maybe a
Just (IconPattern -> Maybe IconPattern)
-> IconPattern -> Maybe IconPattern
forall a b. (a -> b) -> a -> b
$ [Char] -> IconPattern
parseIconPattern [Char]
x }) [Char]
"") [Char]
""
]
memConfig :: IO MConfig
memConfig :: IO MConfig
memConfig = [Char] -> [[Char]] -> IO MConfig
mkMConfig
[Char]
"Mem: <usedratio>% (<cache>M)"
[[Char]
"usedbar", [Char]
"usedvbar", [Char]
"usedipat", [Char]
"freebar", [Char]
"freevbar", [Char]
"freeipat",
[Char]
"availablebar", [Char]
"availablevbar", [Char]
"availableipat",
[Char]
"usedratio", [Char]
"freeratio", [Char]
"availableratio",
[Char]
"total", [Char]
"free", [Char]
"buffer", [Char]
"cache", [Char]
"available", [Char]
"used"]
totalMem :: IO Float
totalMem :: IO Float
totalMem = ([Float] -> Float) -> IO [Float] -> IO Float
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Float -> Float -> Float
forall a. Num a => a -> a -> a
*Float
1024) (Float -> Float) -> ([Float] -> Float) -> [Float] -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Float] -> Int -> Float
forall a. [a] -> Int -> a
!!Int
1)) IO [Float]
MM.parseMEM
usedMem :: IO Float
usedMem :: IO Float
usedMem = ([Float] -> Float) -> IO [Float] -> IO Float
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Float -> Float -> Float
forall a. Num a => a -> a -> a
*Float
1024) (Float -> Float) -> ([Float] -> Float) -> [Float] -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Float] -> Int -> Float
forall a. [a] -> Int -> a
!!Int
6)) IO [Float]
MM.parseMEM
formatMem :: MemOpts -> [Float] -> Monitor [String]
formatMem :: MemOpts -> [Float] -> Monitor [[Char]]
formatMem MemOpts
opts (Float
r:Float
fr:Float
ar:[Float]
xs) =
do let f :: Float -> [Char]
f = Int -> Float -> [Char]
forall a. RealFloat a => Int -> a -> [Char]
showDigits Int
0
mon :: Maybe IconPattern -> Float -> [Monitor [Char]]
mon Maybe IconPattern
i Float
x = [Float -> Float -> Monitor [Char]
showPercentBar (Float
100 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x) Float
x, Float -> Float -> Monitor [Char]
showVerticalBar (Float
100 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x) Float
x, Maybe IconPattern -> Float -> Monitor [Char]
showIconPattern Maybe IconPattern
i Float
x]
[Monitor [Char]] -> Monitor [[Char]]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([Monitor [Char]] -> Monitor [[Char]])
-> [Monitor [Char]] -> Monitor [[Char]]
forall a b. (a -> b) -> a -> b
$ Maybe IconPattern -> Float -> [Monitor [Char]]
mon (MemOpts -> Maybe IconPattern
usedIconPattern MemOpts
opts) Float
r
[Monitor [Char]] -> [Monitor [Char]] -> [Monitor [Char]]
forall a. [a] -> [a] -> [a]
++ Maybe IconPattern -> Float -> [Monitor [Char]]
mon (MemOpts -> Maybe IconPattern
freeIconPattern MemOpts
opts) Float
fr
[Monitor [Char]] -> [Monitor [Char]] -> [Monitor [Char]]
forall a. [a] -> [a] -> [a]
++ Maybe IconPattern -> Float -> [Monitor [Char]]
mon (MemOpts -> Maybe IconPattern
availableIconPattern MemOpts
opts) Float
ar
[Monitor [Char]] -> [Monitor [Char]] -> [Monitor [Char]]
forall a. [a] -> [a] -> [a]
++ (Float -> Monitor [Char]) -> [Float] -> [Monitor [Char]]
forall a b. (a -> b) -> [a] -> [b]
map Float -> Monitor [Char]
showPercentWithColors [Float
r, Float
fr, Float
ar]
[Monitor [Char]] -> [Monitor [Char]] -> [Monitor [Char]]
forall a. [a] -> [a] -> [a]
++ (Float -> Monitor [Char]) -> [Float] -> [Monitor [Char]]
forall a b. (a -> b) -> [a] -> [b]
map ((Float -> [Char]) -> Float -> Monitor [Char]
forall a. (Num a, Ord a) => (a -> [Char]) -> a -> Monitor [Char]
showWithColors Float -> [Char]
f) [Float]
xs
formatMem MemOpts
_ [Float]
_ = Int -> [Char] -> [[Char]]
forall a. Int -> a -> [a]
replicate Int
10 ([Char] -> [[Char]]) -> Monitor [Char] -> Monitor [[Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Selector [Char] -> Monitor [Char]
forall a. Selector a -> Monitor a
getConfigValue Selector [Char]
naString
runMem :: [String] -> Monitor String
runMem :: [[Char]] -> Monitor [Char]
runMem [[Char]]
argv =
do [Float]
m <- IO [Float] -> Monitor [Float]
forall a. IO a -> Monitor a
io IO [Float]
MM.parseMEM
MemOpts
opts <- IO MemOpts -> Monitor MemOpts
forall a. IO a -> Monitor a
io (IO MemOpts -> Monitor MemOpts) -> IO MemOpts -> Monitor MemOpts
forall a b. (a -> b) -> a -> b
$ [OptDescr (MemOpts -> MemOpts)]
-> MemOpts -> [[Char]] -> IO MemOpts
forall opts.
[OptDescr (opts -> opts)] -> opts -> [[Char]] -> IO opts
parseOptsWith [OptDescr (MemOpts -> MemOpts)]
options MemOpts
defaultOpts [[Char]]
argv
[[Char]]
l <- MemOpts -> [Float] -> Monitor [[Char]]
formatMem MemOpts
opts [Float]
m
[[Char]] -> Monitor [Char]
parseTemplate [[Char]]
l