diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Xmobar/Plugins/Date.hs | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/src/Xmobar/Plugins/Date.hs b/src/Xmobar/Plugins/Date.hs index 1cb0596..d7de2e9 100644 --- a/src/Xmobar/Plugins/Date.hs +++ b/src/Xmobar/Plugins/Date.hs @@ -17,22 +17,35 @@  --  ----------------------------------------------------------------------------- -module Xmobar.Plugins.Date (Date(..)) where +module Xmobar.Plugins.Date (Date(..), date) where  import Xmobar.Run.Exec  #if ! MIN_VERSION_time(1,5,0)  import System.Locale  #endif +import Data.IORef  import Data.Time +import Control.Concurrent.Async (concurrently_)  data Date = Date String String Int      deriving (Read, Show)  instance Exec Date where      alias (Date _ a _) = a -    run   (Date f _ _) = date f      rate  (Date _ _ r) = r +    start (Date f _ r) cb = +        -- refresh time zone once a minute to avoid wasting CPU cycles +        withRefreshingZone 600 $ \zone -> +            doEveryTenthSeconds r $ date zone f >>= cb -date :: String -> IO String -date format = fmap (formatTime defaultTimeLocale format) getZonedTime +date :: IORef TimeZone -> String -> IO String +date zoneRef format = do +    zone <- readIORef zoneRef +    fmap (formatTime defaultTimeLocale format . utcToZonedTime zone) getCurrentTime + +withRefreshingZone :: Int -> (IORef TimeZone -> IO ()) -> IO () +withRefreshingZone r action = do +    zone <- newIORef =<< getCurrentTimeZone +    let refresh = atomicWriteIORef zone =<< getCurrentTimeZone +    concurrently_ (doEveryTenthSeconds r refresh) (action zone) | 
