{-#LANGUAGE CPP #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.Monitors.Mem
-- Copyright   :  (c) Andrea Rossato
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
-- Stability   :  unstable
-- Portability :  unportable
--
-- A memory monitor for Xmobar
--
-----------------------------------------------------------------------------

module Xmobar.Plugins.Monitors.Mem (memConfig, runMem) 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
  , MemOpts -> Float
scale :: Float
  }

defaultOpts :: MemOpts
defaultOpts :: MemOpts
defaultOpts = 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
  , scale :: Float
scale = Float
1.0
  }

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 = Just $ parseIconPattern 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 = Just $ parseIconPattern 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 = Just $ parseIconPattern x }) [Char]
"") [Char]
""
  , [Char]
-> [[Char]]
-> ArgDescr (MemOpts -> MemOpts)
-> [Char]
-> OptDescr (MemOpts -> MemOpts)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"scale"] (([Char] -> MemOpts -> MemOpts)
-> [Char] -> ArgDescr (MemOpts -> MemOpts)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg (\[Char]
x MemOpts
o -> MemOpts
o { scale = read 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"]

formatMem :: MemOpts -> [Float] -> Monitor [String]
formatMem :: MemOpts -> [Float] -> Monitor [[Char]]
formatMem MemOpts
opts (Float
r:Float
fr:Float
ar:[Float]
xs) =
    do d <- Selector Int -> Monitor Int
forall a. Selector a -> Monitor a
getConfigValue Selector Int
decDigits
       let f = Int -> Float -> [Char]
forall a. RealFloat a => Int -> a -> [Char]
showDigits Int
d
           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]
       sequence $ mon (usedIconPattern opts) r
           ++ mon (freeIconPattern opts) fr
           ++ mon (availableIconPattern opts) ar
           ++ map showPercentWithColors [r, fr, ar]
           ++ map (showWithColors f . (/ scale opts)) xs
formatMem MemOpts
_ [Float]
_ = Int -> [Char] -> [[Char]]
forall a. Int -> a -> [a]
replicate Int
10 ([Char] -> [[Char]]) -> Monitor [Char] -> Monitor [[Char]]
forall a b.
(a -> b) -> ReaderT MConfig IO a -> ReaderT MConfig IO b
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 m <- IO [Float] -> Monitor [Float]
forall a. IO a -> Monitor a
io IO [Float]
MM.parseMEM
       opts <- io $ parseOptsWith options defaultOpts argv
       l <- formatMem opts m
       parseTemplate l