diff options
| author | Thomas Tuegel <ttuegel@gmail.com> | 2011-01-13 12:57:24 -0600 | 
|---|---|---|
| committer | Thomas Tuegel <ttuegel@gmail.com> | 2011-01-13 12:57:24 -0600 | 
| commit | d444ebca849d77eec58243f800f0f675e1469dc8 (patch) | |
| tree | 8b68f3478e71a1ba94dfceb15995e20dbd2513e3 /src/Plugins/Monitors | |
| parent | 24fe3c3aef1dd1cb61c83677d49a3a50330962b7 (diff) | |
| download | xmobar-d444ebca849d77eec58243f800f0f675e1469dc8.tar.gz xmobar-d444ebca849d77eec58243f800f0f675e1469dc8.tar.bz2  | |
Improved volume monitor.
Featuring: configurable status strings, status colors, and dB
thresholds.
Diffstat (limited to 'src/Plugins/Monitors')
| -rw-r--r-- | src/Plugins/Monitors/Volume.hs | 88 | 
1 files changed, 77 insertions, 11 deletions
diff --git a/src/Plugins/Monitors/Volume.hs b/src/Plugins/Monitors/Volume.hs index c7814a8..960b5e4 100644 --- a/src/Plugins/Monitors/Volume.hs +++ b/src/Plugins/Monitors/Volume.hs @@ -4,6 +4,42 @@ import Control.Monad ( liftM )  import Data.Maybe  import Plugins.Monitors.Common  import Sound.ALSA.Mixer +import System.Console.GetOpt + +data VolumeOpts = VolumeOpts +    { onString :: String +    , offString :: String +    , onColor :: Maybe String +    , offColor :: Maybe String +    , highDbThresh :: Float +    , lowDbThresh :: Float +    } + +defaultOpts :: VolumeOpts +defaultOpts = VolumeOpts +    { onString = "[on] " +    , offString = "[off]" +    , onColor = Just "green" +    , offColor = Just "red" +    , highDbThresh = -5.0 +    , lowDbThresh = -30.0 +    } + +options :: [OptDescr (VolumeOpts -> VolumeOpts)] +options = +    [ Option "O" ["on"] (ReqArg (\x o -> o { onString = x }) "") "" +    , Option "o" ["off"] (ReqArg (\x o -> o { offString = x }) "") "" +    , Option "" ["lowd"] (ReqArg (\x o -> o { lowDbThresh = read x }) "") "" +    , Option "" ["highd"] (ReqArg (\x o -> o { highDbThresh = read x }) "") "" +    , Option "C" ["onc"] (ReqArg (\x o -> o { onColor = Just x }) "") "" +    , Option "c" ["offc"] (ReqArg (\x o -> o { offColor = Just x }) "") "" +    ] + +parseOpts :: [String] -> IO VolumeOpts +parseOpts argv = +    case getOpt Permute options argv of +        (o, _, []) -> return $ foldr id defaultOpts o +        (_, _, errs) -> ioError . userError $ concat errs  percent :: Integer -> Integer -> Integer -> Float  percent v' lo' hi' = (v - lo) / (hi - lo) @@ -12,11 +48,45 @@ percent v' lo' hi' = (v - lo) / (hi - lo)          hi = fromIntegral hi'  volumeConfig :: IO MConfig -volumeConfig = mkMConfig "Vol: <volume>% <fc=green><on></fc><fc=red><off></fc>" -                         ["volume","dB","on","off"] +volumeConfig = mkMConfig "Vol: <volume>% <status>" +                         ["volume","dB","status"] + +formatVol :: Integer -> Integer -> Integer -> Monitor String +formatVol v lo hi = +    showPercentWithColors $ percent v lo hi + +switchHelper :: VolumeOpts +             -> (VolumeOpts -> Maybe String) +             -> (VolumeOpts -> String) +             -> Monitor String +switchHelper opts cHelp strHelp = return $ +    (colorHelper $ cHelp opts) +    ++ strHelp opts +    ++ (maybe "" (const "</fc>") $ cHelp opts) + +formatSwitch :: VolumeOpts -> Bool -> Monitor String +formatSwitch opts True = switchHelper opts onColor onString +formatSwitch opts False = switchHelper opts offColor offString + +colorHelper :: Maybe String -> String +colorHelper = maybe "" (\c -> "<fc=" ++ c ++ ">") + +formatDb :: VolumeOpts -> Float -> Monitor String +formatDb opts db = do +    h <- getConfigValue highColor +    m <- getConfigValue normalColor +    l <- getConfigValue lowColor +    let digits = showDigits 0 db +        startColor | db >= highDbThresh opts = colorHelper h +                   | db < lowDbThresh opts = colorHelper l +                   | otherwise = colorHelper m +        stopColor | null startColor = "" +                  | otherwise = "</fc>" +    return $ startColor ++ digits ++ stopColor  runVolume :: String -> String -> [String] -> Monitor String -runVolume mixerName controlName _ = do +runVolume mixerName controlName argv = do +    opts <- io $ parseOpts argv      control <- liftM fromJust $ io $ getControlByName mixerName controlName      let volumeControl = fromJust $ maybe (playback $ volume control) Just                                           (common $ volume control) @@ -26,11 +96,7 @@ runVolume mixerName controlName _ = do      val <- liftM fromJust $ io $ getChannel FrontLeft $ value volumeControl      db <- liftM fromJust $ io $ getChannel FrontLeft $ dB volumeControl      sw <- liftM fromJust $ io $ getChannel FrontLeft $ switchControl -    p <- showPercentsWithColors [ percent val lo hi ] -    let d :: Double -        d = fromIntegral db / 100.0 -        dStr = showDigits 2 d -    parseTemplate $ p ++ [ dStr ] -                      ++ [ if sw then "[on] " else "" -                         , if sw then "" else "[off]" -                         ] +    p <- formatVol val lo hi +    d <- formatDb opts $ fromIntegral db / 100.0 +    s <- formatSwitch opts sw +    parseTemplate $ [ p, d, s ]   | 
