summaryrefslogtreecommitdiffhomepage
path: root/src/Plugins/Monitors/Bright.hs
blob: 499e5bc4d852d95172bd8ab0e011aeb0422d165a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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 f = catch (fmap (read . B.unpack) $ B.readFile f)(\_ -> return 0)


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)