X-Git-Url: https://disinclined.org/git/?a=blobdiff_plain;f=powermate.hs;h=8cf996cd31ab4d296ace6f5e28b19c35b9d656dd;hb=0fc9b3f435a2cc77ad9de503c9a6933aeb0aa397;hp=91e24cfced7b6502b9ef3ea58731299bed946d99;hpb=4bd7a3f471aa02515fb69d53e17bf1b99150c33c;p=powermate.git diff --git a/powermate.hs b/powermate.hs index 91e24cf..8cf996c 100755 --- a/powermate.hs +++ b/powermate.hs @@ -3,41 +3,53 @@ module Main where import PowerMate import System.IO import System.Process +import Control.Monad import Text.Regex.Posix +import Data.Time data State = State { stPowerMate :: Handle, stVolume :: Int, stPrevDir :: Int, - stPrevAction :: Int + stPrevAction :: Int, + stPressed :: Bool, + stLastPress :: UTCTime } processEvent :: State -> Event -> IO State processEvent state (Button True) = do - createProcess (proc "music-toggle" []) + time <- getCurrentTime + state <- updateLastPress state (time) + state <- updateButton state True return state processEvent state (Button False) = do + time <- getCurrentTime + if (diffUTCTime (time) (stLastPress state) > 0.8) + then ( do createProcess(proc "volume-toggle" []); return () ) + else ( do runCommand "music-toggle"; return () ) + state <- updateButton state False return state processEvent state (Rotate dir) = do - state <- (if dir < 2 + 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 + when ((stPressed state) == True && dir < 2) ( do runCommand "next"; return () ) + when ((stPressed state) == True && dir > 2) ( do runCommand "back"; return () ) state <- updatePrevState state (if dir < 2 then 1 else 0) updateBrightness state state <- updatePrevAction state (if (stPrevAction state) == 1 then 0 else 1) return state -processEvent state (StatusChange status) = do - return state - readState :: State -> IO State readState state = do return state @@ -61,7 +73,9 @@ volumeUp state = do stPowerMate=(stPowerMate state), stVolume=(max 0 $ 1+(stVolume state)), stPrevAction=(stPrevAction state), - stPrevDir=(stPrevDir state) } + stPrevDir=(stPrevDir state), + stPressed=(stPressed state), + stLastPress=(stLastPress state) } state <- updatePrevAction state 1 return state @@ -72,7 +86,9 @@ volumeDown state = do stPowerMate=(stPowerMate state), stVolume=(max 0 $ (stVolume state)-1), stPrevAction=(stPrevAction state), - stPrevDir=(stPrevDir state) } + stPrevDir=(stPrevDir state), + stPressed=(stPressed state), + stLastPress=(stLastPress state) } state <- updatePrevAction state 0 return state @@ -82,7 +98,9 @@ updatePrevState state dir = do stPowerMate=(stPowerMate state), stVolume=(stVolume state), stPrevAction=(stPrevAction state), - stPrevDir=dir } + stPrevDir=dir, + stPressed=(stPressed state), + stLastPress=(stLastPress state) } return state updatePrevAction :: State -> Int -> IO State @@ -91,7 +109,31 @@ updatePrevAction state action = do stPowerMate=(stPowerMate state), stVolume=(stVolume state), stPrevAction=action, - stPrevDir=(stPrevDir state) } + 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 loop :: FilePath -> IO () @@ -104,11 +146,14 @@ loop devname = do (take (subtract 2 (length alsaMaster)) alsaMaster)) :: Int + time <- getCurrentTime state <- readState $ State { stPowerMate=powermate, stVolume=volume, stPrevAction=0, - stPrevDir=0 } + stPrevDir=0, + stPressed=False, + stLastPress=time } updateBrightness state next state $ \call -> do