X-Git-Url: https://disinclined.org/git/?a=blobdiff_plain;f=powermate.hs;h=ad177897d224764c236c768d23a5c65c72f347a9;hb=HEAD;hp=04ae85d273b44cbdfdc4937cf01386c8b1b16c65;hpb=f36e77c114f8ab55e94f15fe8a4c6d1cede439e5;p=powermate.git diff --git a/powermate.hs b/powermate.hs old mode 100755 new mode 100644 index 04ae85d..ad17789 --- a/powermate.hs +++ b/powermate.hs @@ -7,36 +7,52 @@ import Text.Regex.Posix import Data.Time data State = State { - stPowerMate :: Handle, - stVolume :: Int, - stPrevDir :: Int, - stPrevAction :: Int, - stLastPress :: UTCTime + stPowerMate :: Handle, + stVolume :: Int, + stPrevDir :: Int, + stPrevAction :: Int, + stPressed :: Bool, + stIndeterminate :: Bool, + stLastPress :: UTCTime } processEvent :: State -> Event -> IO State processEvent state (Button True) = do time <- getCurrentTime state <- updateLastPress state (time) + state <- updateButton state True + state <- updateIndeterminate state True return state processEvent state (Button False) = do time <- getCurrentTime - if (diffUTCTime (time) (stLastPress state) > 0.8) then - ( do c <- runCommand "amixer set Master toggle"; return () ) - else ( do c <- runCommand "music-toggle"; return () ) + if (stIndeterminate state) + then do + if (diffUTCTime (time) (stLastPress state) > 0.8) + then do createProcess(proc "volume-toggle" []); return () + else do runCommand "music-toggle"; return () + else return () + state <- updateButton state False return state processEvent state (Rotate dir) = do - state <- (if dir < 2 + state <- updateIndeterminate state False + state <- (if (stPressed state) == False + && dir < 2 && (stPrevDir state) == 1 && (stPrevAction state) == 1 then volumeUp else return) state - state <- (if dir > 2 + state <- (if (stPressed state) == False + && dir > 2 && (stPrevDir state) == 0 && (stPrevAction state) == 0 then volumeDown else return) state + if stPressed state + then do + if dir < 2 then do runCommand "next"; return () + else do runCommand "back"; return () + else return () state <- updatePrevState state (if dir < 2 then 1 else 0) updateBrightness state state <- updatePrevAction state (if (stPrevAction state) == 1 then 0 else 1) @@ -58,6 +74,18 @@ updateBrightness state = do writeStatus (stPowerMate state) $ statusInit { brightness=brightness } +updateIndeterminate :: State -> Bool -> IO State +updateIndeterminate state value = do + state <- readState $ State { + stPowerMate=(stPowerMate state), + stVolume=(stVolume state), + stPrevAction=(stPrevAction state), + stPrevDir=(stPrevDir state), + stPressed=(stPressed state), + stLastPress=(stLastPress state), + stIndeterminate=value } + return state + volumeUp :: State -> IO State volumeUp state = do createProcess (proc "volume-up" []) @@ -66,7 +94,9 @@ volumeUp state = do stVolume=(max 0 $ 1+(stVolume state)), stPrevAction=(stPrevAction state), stPrevDir=(stPrevDir state), - stLastPress=(stLastPress state) } + stPressed=(stPressed state), + stLastPress=(stLastPress state), + stIndeterminate=(stIndeterminate state) } state <- updatePrevAction state 1 return state @@ -78,7 +108,9 @@ volumeDown state = do stVolume=(max 0 $ (stVolume state)-1), stPrevAction=(stPrevAction state), stPrevDir=(stPrevDir state), - stLastPress=(stLastPress state) } + stPressed=(stPressed state), + stLastPress=(stLastPress state), + stIndeterminate=(stIndeterminate state) } state <- updatePrevAction state 0 return state @@ -89,7 +121,9 @@ updatePrevState state dir = do stVolume=(stVolume state), stPrevAction=(stPrevAction state), stPrevDir=dir, - stLastPress=(stLastPress state) } + stPressed=(stPressed state), + stLastPress=(stLastPress state), + stIndeterminate=(stIndeterminate state) } return state updatePrevAction :: State -> Int -> IO State @@ -99,7 +133,21 @@ updatePrevAction state action = do stVolume=(stVolume state), stPrevAction=action, stPrevDir=(stPrevDir state), - stLastPress=(stLastPress state) } + stPressed=(stPressed state), + stLastPress=(stLastPress state), + stIndeterminate=(stIndeterminate 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), + stIndeterminate=(stIndeterminate state) } return state updateLastPress :: State -> UTCTime -> IO State @@ -109,7 +157,9 @@ updateLastPress state lastPress = do stVolume=(stVolume state), stPrevAction=(stPrevAction state), stPrevDir=(stPrevDir state), - stLastPress=lastPress } + stPressed=(stPressed state), + stLastPress=lastPress, + stIndeterminate=(stIndeterminate state) } return state loop :: FilePath -> IO () @@ -128,7 +178,9 @@ loop devname = do stVolume=volume, stPrevAction=0, stPrevDir=0, - stLastPress=time } + stPressed=False, + stLastPress=time, + stIndeterminate=False } updateBrightness state next state $ \call -> do