summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Xmobar/Plugins/Date.hs21
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)