summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README18
-rw-r--r--src/Plugins/Monitors.hs4
-rw-r--r--src/Plugins/Monitors/Bright.hs118
-rw-r--r--xmobar.cabal3
4 files changed, 142 insertions, 1 deletions
diff --git a/README b/README
index 925c1aa..9294586 100644
--- a/README
+++ b/README
@@ -677,6 +677,24 @@ Monitors have default aliases.
distribution can be used to set the given property from the output
of any other program or script.
+`Brightness Args RefreshRate`
+
+- Aliases to `bright`
+- Args: default monitor arguments (see below), plus the following specif ones:
+ - `-D`: directory in `/sys/class/backlight/` with files in it
+ (default: "acpi_video0")
+ - `-C`: file with the current brightness (default:
+ actual_brightness)
+ - `-M`: file with the maximum brightness (default:
+ max_brigtness)
+- Variables that can be used with the `-t`/`--template` argument:
+ `hbar`, `percent`, `bar`
+- Default template: `<percent>%`
+- Example:
+
+ Run Brightness ["-t", "<bar>"] 60
+
+
[samples/xmonadpropwrite.hs script]: https://github.com/jaor/xmobar/raw/master/samples/xmonadpropwrite.hs
## Monitor Plugins Commands Arguments
diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs
index c4688a7..5e1cb62 100644
--- a/src/Plugins/Monitors.hs
+++ b/src/Plugins/Monitors.hs
@@ -27,6 +27,7 @@ import Plugins.Monitors.Swap
import Plugins.Monitors.Cpu
import Plugins.Monitors.MultiCpu
import Plugins.Monitors.Batt
+import Plugins.Monitors.Bright
import Plugins.Monitors.Thermal
import Plugins.Monitors.ThermalZone
import Plugins.Monitors.CpuFreq
@@ -56,6 +57,7 @@ data Monitors = Weather Station Args Rate
| Cpu Args Rate
| MultiCpu Args Rate
| Battery Args Rate
+ | Brightness Args Rate
| CpuFreq Args Rate
| CoreTemp Args Rate
| TopProc Args Rate
@@ -93,6 +95,7 @@ instance Exec Monitors where
alias (MultiCpu _ _) = "multicpu"
alias (Battery _ _) = "battery"
alias (BatteryP _ _ _)= "battery"
+ alias (Brightness _ _) = "bright"
alias (CpuFreq _ _) = "cpufreq"
alias (TopProc _ _) = "top"
alias (TopMem _ _) = "topmem"
@@ -122,6 +125,7 @@ instance Exec Monitors where
start (Swap a r) = runM a swapConfig runSwap r
start (Battery a r) = runM a battConfig runBatt r
start (BatteryP s a r) = runM a battConfig (runBatt' s) r
+ start (Brightness a r) = runM a brightConfig runBright r
start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r
start (CoreTemp a r) = runM a coreTempConfig runCoreTemp r
start (DiskU s a r) = runM a diskUConfig (runDiskU s) r
diff --git a/src/Plugins/Monitors/Bright.hs b/src/Plugins/Monitors/Bright.hs
new file mode 100644
index 0000000..36009a6
--- /dev/null
+++ b/src/Plugins/Monitors/Bright.hs
@@ -0,0 +1,118 @@
+-----------------------------------------------------------------------------
+---- |
+---- Module : Plugins.Monitors.Birght
+---- Copyright : (c) Martin Perner
+---- License : BSD-style (see LICENSE)
+----
+---- Maintainer : Martin Perner <martin@perner.cc>
+---- Stability : unstable
+---- Portability : unportable
+----
+---- A screen brightness monitor for Xmobar
+----
+-------------------------------------------------------------------------------
+
+module Plugins.Monitors.Bright (brightConfig, runBright) where
+
+import Plugins.Monitors.Common
+import qualified Data.ByteString.Lazy.Char8 as B
+import Data.Char
+import System.FilePath ((</>))
+import System.Posix.Files (fileExist)
+import System.Console.GetOpt
+
+data BrightOpts = BrightOpts
+ { subDir :: String
+ , currBright :: String
+ , maxBright :: String
+ }
+
+defaultOpts :: BrightOpts
+defaultOpts = BrightOpts
+ { subDir = "acpi_video0"
+ , currBright = "actual_brightness"
+ , maxBright = "max_brightness"
+ }
+
+options :: [OptDescr (BrightOpts -> BrightOpts)]
+options =
+ [ Option "D" ["device"] (ReqArg (\x o -> o { subDir = x }) "") ""
+ , Option "C" ["curr"] (ReqArg (\x o -> o { currBright = x }) "") ""
+ , Option "M" ["max"] (ReqArg (\x o -> o { maxBright = x }) "") ""
+ ]
+
+-- from Batt.hs
+parseOpts :: [String] -> IO BrightOpts
+parseOpts argv =
+ case getOpt Permute options argv of
+ (o, _, []) -> return $ foldr id defaultOpts o
+ (_, _, errs) -> ioError . userError $ concat errs
+
+sysDir :: FilePath
+sysDir = "/sys/class/backlight/"
+
+brightConfig :: IO MConfig
+brightConfig = mkMConfig
+ "<percent>%" -- template
+ ["hbar", "percent", "bar"] -- replacements
+
+data Files = Files
+ { fCurr :: String
+ , fMax :: String
+ } | NoFiles
+
+brightFiles :: BrightOpts -> IO Files
+brightFiles opts =
+ do
+ is_curr <- fileExist $ (fCurr files)
+ is_max <- fileExist $ (fCurr files)
+ if is_curr && is_max
+ then return files
+ else return NoFiles
+ where
+ prefix = sysDir </> (subDir opts)
+ files = Files { fCurr = prefix </> (currBright opts)
+ , fMax = prefix </> (maxBright opts)
+ }
+
+
+runBright :: [String] -> Monitor String
+runBright args = do
+ opts <- io $ parseOpts args
+ f <- io $ brightFiles opts
+ c <- io $ readBright f
+ case f of
+ NoFiles -> return "hurz"
+ _ -> do x <- fmtPercent c
+ parseTemplate (x)
+ where
+ fmtPercent :: Float -> Monitor [String]
+ fmtPercent c = do
+ r <- showHorizontalBar (100 * c)
+ s <- showPercentWithColors c
+ t <- showPercentBar (100 * c) c
+ return [r,s,t]
+
+readBright :: Files -> IO Float
+readBright NoFiles = return 0
+readBright files =
+ do
+ currVal<- grab $ (fCurr files)
+ maxVal <- grab $ (fMax files)
+ return $ (currVal / maxVal)
+ where
+ grab = fmap (read . B.unpack) . B.readFile
+
+
+showHorizontalBar :: Float -> Monitor String
+showHorizontalBar x = do
+ return $ [convert x]
+ where
+ convert :: Float -> Char
+ convert val
+ | t <= 9600 = ' '
+ | t > 9608 = chr 9608
+ | otherwise = chr t
+ where
+ -- we scale from 0 to 100, we have 8 slots (9 elements), 100/8 = 12
+ t = 9600 + ((round val) `div` 12)
diff --git a/xmobar.cabal b/xmobar.cabal
index 5484eb5..cc9e016 100644
--- a/xmobar.cabal
+++ b/xmobar.cabal
@@ -71,7 +71,8 @@ executable xmobar
Plugins.Monitors.MultiCpu, Plugins.Monitors.Net,
Plugins.Monitors.Swap, Plugins.Monitors.Thermal,
Plugins.Monitors.ThermalZone, Plugins.Monitors.Top,
- Plugins.Monitors.Uptime, Plugins.Monitors.Weather
+ Plugins.Monitors.Uptime, Plugins.Monitors.Weather,
+ Plugins.Monitors.Bright
ghc-prof-options: -prof -auto-all