+updateBrightness :: State -> IO ()
+updateBrightness state = do
+ let brightness = (stVolume state)
+ writeStatus (stPowerMate state) $
+ statusInit { brightness=brightness }
+
+volumeUp :: State -> IO State
+volumeUp state = do
+ createProcess (proc "volume-up" [])
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(max 0 $ 1+(stVolume state)),
+ stPrevAction=(stPrevAction state),
+ stPrevDir=(stPrevDir state),
+ stPressed=(stPressed state),
+ stLastPress=(stLastPress state) }
+ state <- updatePrevAction state 1
+ return state
+
+volumeDown :: State -> IO State
+volumeDown state = do
+ createProcess (proc "volume-down" [])
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(max 0 $ (stVolume state)-1),
+ stPrevAction=(stPrevAction state),
+ stPrevDir=(stPrevDir state),
+ stPressed=(stPressed state),
+ stLastPress=(stLastPress state) }
+ state <- updatePrevAction state 0
+ return state
+
+updatePrevState :: State -> Int -> IO State
+updatePrevState state dir = do
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(stVolume state),
+ stPrevAction=(stPrevAction state),
+ stPrevDir=dir,
+ stPressed=(stPressed state),
+ stLastPress=(stLastPress state) }
+ return state
+
+updatePrevAction :: State -> Int -> IO State
+updatePrevAction state action = do
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(stVolume state),
+ stPrevAction=action,
+ stPrevDir=(stPrevDir state),
+ stPressed=(stPressed state),
+ stLastPress=(stLastPress state) }
+ return state
+
+updateButton :: State -> Bool -> IO State
+updateButton state button = do
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(stVolume state),
+ stPrevAction=(stPrevAction state),
+ stPrevDir=(stPrevDir state),
+ stPressed=button,
+ stLastPress=(stLastPress state) }
+ return state
+
+updateLastPress :: State -> UTCTime -> IO State
+updateLastPress state lastPress = do
+ state <- readState $ State {
+ stPowerMate=(stPowerMate state),
+ stVolume=(stVolume state),
+ stPrevAction=(stPrevAction state),
+ stPrevDir=(stPrevDir state),
+ stPressed=(stPressed state),
+ stLastPress=lastPress }
+ return state