summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@gmail.com>2011-01-13 12:57:24 -0600
committerThomas Tuegel <ttuegel@gmail.com>2011-01-13 12:57:24 -0600
commitd444ebca849d77eec58243f800f0f675e1469dc8 (patch)
tree8b68f3478e71a1ba94dfceb15995e20dbd2513e3
parent24fe3c3aef1dd1cb61c83677d49a3a50330962b7 (diff)
downloadxmobar-d444ebca849d77eec58243f800f0f675e1469dc8.tar.gz
xmobar-d444ebca849d77eec58243f800f0f675e1469dc8.tar.bz2
Improved volume monitor.
Featuring: configurable status strings, status colors, and dB thresholds.
-rw-r--r--src/Plugins/Monitors/Volume.hs88
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 ]