X-Git-Url: https://disinclined.org/git/?a=blobdiff_plain;f=powermate.hs;h=eff82d606658d77a5799c0b7c726cb256a80822d;hb=b8129145f11a5b7bfb9b95413c84401853d2e439;hp=cdb4bed024dee8b4b2c70c58b1551b44cab7a608;hpb=161cec25784853bc27b48bd12ce4928ca5ec21e1;p=powermate.git diff --git a/powermate.hs b/powermate.hs index cdb4bed..eff82d6 100755 --- a/powermate.hs +++ b/powermate.hs @@ -3,28 +3,43 @@ 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, - stDir :: Int + stPowerMate :: Handle, + stVolume :: Int, + stPrevDir :: Int, + stPrevAction :: Int, + stLastPress :: UTCTime } processEvent :: State -> Event -> IO State processEvent state (Button True) = do - createProcess (proc "music-toggle" []) + time <- getCurrentTime + state <- updateLastPress state (time) return state processEvent state (Button False) = do + time <- getCurrentTime + if (diffUTCTime (time) (stLastPress state) > 0.8) then + ( do runCommand "amixer set Master toggle"; return () ) + else ( do runCommand "music-toggle"; return () ) return state processEvent state (Rotate dir) = do - state <- (if dir < 2 then volumeUp else volumeDown) state + state <- (if dir < 2 + && (stPrevDir state) == 1 + && (stPrevAction state) == 1 + then volumeUp + else return) state + state <- (if dir > 2 + && (stPrevDir state) == 0 + && (stPrevAction state) == 0 + then volumeDown + else return) state + state <- updatePrevState state (if dir < 2 then 1 else 0) updateBrightness state - return state - -processEvent state (StatusChange status) = do + state <- updatePrevAction state (if (stPrevAction state) == 1 then 0 else 1) return state readState :: State -> IO State @@ -43,22 +58,58 @@ updateBrightness state = do writeStatus (stPowerMate state) $ statusInit { brightness=brightness } -volumeUp :: State -> IO State +volumeUp :: State -> IO State volumeUp state = do createProcess (proc "volume-up" []) state <- readState $ State { stPowerMate=(stPowerMate state), stVolume=(max 0 $ 1+(stVolume state)), - stDir=(stDir state) } + stPrevAction=(stPrevAction state), + stPrevDir=(stPrevDir state), + stLastPress=(stLastPress state) } + state <- updatePrevAction state 1 return state -volumeDown :: State -> IO State +volumeDown :: State -> IO State volumeDown state = do createProcess (proc "volume-down" []) state <- readState $ State { stPowerMate=(stPowerMate state), stVolume=(max 0 $ (stVolume state)-1), - stDir=(stDir state) } + stPrevAction=(stPrevAction state), + stPrevDir=(stPrevDir 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, + 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), + 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), + stLastPress=lastPress } return state loop :: FilePath -> IO () @@ -71,10 +122,13 @@ loop devname = do (take (subtract 2 (length alsaMaster)) alsaMaster)) :: Int + time <- getCurrentTime state <- readState $ State { stPowerMate=powermate, stVolume=volume, - stDir=1 } + stPrevAction=0, + stPrevDir=0, + stLastPress=time } updateBrightness state next state $ \call -> do