summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Config.hs6
-rw-r--r--src/Localize.hsc83
-rw-r--r--src/Plugins/DateL.hs35
-rw-r--r--src/Plugins/DateZone.hs50
-rw-r--r--src/Plugins/DateZoneL.hs42
5 files changed, 76 insertions, 140 deletions
diff --git a/src/Config.hs b/src/Config.hs
index cc1692e..4405314 100644
--- a/src/Config.hs
+++ b/src/Config.hs
@@ -27,7 +27,6 @@ import Commands
import {-# SOURCE #-} Runnable
import Plugins.Monitors
import Plugins.Date
-import Plugins.DateL
import Plugins.PipeReader
import Plugins.CommandReader
import Plugins.StdinReader
@@ -42,7 +41,6 @@ import Plugins.MBox
#ifdef DATEZONE
import Plugins.DateZone
-import Plugins.DateZoneL
#endif
-- $config
@@ -115,12 +113,12 @@ infixr :*:
-- the 'Runnable.Runnable' Read instance. To install a plugin just add
-- the plugin's type to the list of types (separated by ':*:') appearing in
-- this function's type signature.
-runnableTypes :: Command :*: Monitors :*: Date :*: DateL :*: PipeReader :*: CommandReader :*: StdinReader :*: XMonadLog :*: EWMH :*: Kbd :*:
+runnableTypes :: Command :*: Monitors :*: Date :*: PipeReader :*: CommandReader :*: StdinReader :*: XMonadLog :*: EWMH :*: Kbd :*:
#ifdef INOTIFY
Mail :*: MBox :*:
#endif
#ifdef DATEZONE
- DateZone :*: DateZoneL :*:
+ DateZone :*:
#endif
()
runnableTypes = undefined
diff --git a/src/Localize.hsc b/src/Localize.hsc
index bfaa6f0..b302cd4 100644
--- a/src/Localize.hsc
+++ b/src/Localize.hsc
@@ -18,7 +18,6 @@ module Localize
getTimeLocale
) where
-import Foreign
import Foreign.C
import qualified System.Locale as L
@@ -36,27 +35,21 @@ foreign import ccall unsafe "langinfo.h nl_langinfo"
#{enum NlItem,
, AM_STR , PM_STR \
, D_T_FMT , D_FMT , T_FMT , T_FMT_AMPM \
- , ABDAY_1 , ABDAY_2 , ABDAY_3 , ABDAY_4 , ABDAY_5 , ABDAY_6 , ABDAY_7 \
- , DAY_1 , DAY_2 , DAY_3 , DAY_4 , DAY_5 , DAY_6 , DAY_7 \
- , ABMON_1 , ABMON_2 , ABMON_3 , ABMON_4 , ABMON_5 , ABMON_6 , ABMON_7 \
- , ABMON_8 , ABMON_9 , ABMON_10 , ABMON_11 , ABMON_12 \
- , MON_1 , MON_2 , MON_3 , MON_4 , MON_5 , MON_6 , MON_7 , MON_8 , MON_9 \
- , MON_10 , MON_11 , MON_12\
+ , ABDAY_1, ABDAY_7 \
+ , DAY_1, DAY_7 \
+ , ABMON_1, ABMON_12 \
+ , MON_1, MON_12\
}
-#let LIST_CTR fst,snd,idx = "( getLangInfo "fst""idx" , getLangInfo "snd""idx" )"
-
-getLangInfo :: NlItem -> String
+getLangInfo :: NlItem -> IO String
+getLangInfo item = do
+ itemStr <- nl_langinfo item
#ifdef UTF8
-getLangInfo item = decodeString $ unsafePerformIO $ getLangInfo' item
+ str <- peekCString itemStr
+ return $ decodeString str
#else
-getLangInfo item = unsafePerformIO $ getLangInfo' item
-#endif
-
-getLangInfo' :: NlItem -> IO String
-getLangInfo' item = do
- itemStr <- nl_langinfo item
peekCString itemStr
+#endif
#include <locale.h>
foreign import ccall unsafe "locale.h setlocale"
@@ -65,34 +58,28 @@ foreign import ccall unsafe "locale.h setlocale"
setupTimeLocale :: String -> IO ()
setupTimeLocale l = withCString l (setlocale #const LC_TIME) >> return ()
-getTimeLocale :: L.TimeLocale
-getTimeLocale = L.TimeLocale {
- L.wDays = [ #{LIST_CTR "day","abday","1"}
- , #{LIST_CTR "day","abday","2"}
- , #{LIST_CTR "day","abday","3"}
- , #{LIST_CTR "day","abday","4"}
- , #{LIST_CTR "day","abday","5"}
- , #{LIST_CTR "day","abday","6"}
- , #{LIST_CTR "day","abday","7"}
- ],
- L.months = [ #{LIST_CTR "mon","abmon","1"}
- , #{LIST_CTR "mon","abmon","2"}
- , #{LIST_CTR "mon","abmon","3"}
- , #{LIST_CTR "mon","abmon","4"}
- , #{LIST_CTR "mon","abmon","5"}
- , #{LIST_CTR "mon","abmon","6"}
- , #{LIST_CTR "mon","abmon","7"}
- , #{LIST_CTR "mon","abmon","8"}
- , #{LIST_CTR "mon","abmon","9"}
- , #{LIST_CTR "mon","abmon","10"}
- , #{LIST_CTR "mon","abmon","11"}
- , #{LIST_CTR "mon","abmon","12"}
- ],
- -- Intervals are not available from this interface
- L.intervals = L.intervals L.defaultTimeLocale,
- L.amPm = (getLangInfo amStr, getLangInfo pmStr),
- L.dateTimeFmt = getLangInfo dTFmt,
- L.dateFmt = getLangInfo dFmt,
- L.timeFmt = getLangInfo tFmt,
- L.time12Fmt = getLangInfo tFmtAmpm
- }
+getTimeLocale :: IO L.TimeLocale
+getTimeLocale = do
+ -- assumes that the defined values are increasing by exactly one.
+ -- as they are defined consecutive in an enum this is reasonable
+ days <- mapM getLangInfo [day1 .. day7]
+ abdays <- mapM getLangInfo [abday1 .. abday7]
+
+ mons <- mapM getLangInfo [mon1 .. mon12]
+ abmons <- mapM getLangInfo [abmon1 .. abmon12]
+
+ amstr <- getLangInfo amStr
+ pmstr <- getLangInfo pmStr
+ dtfmt <- getLangInfo dTFmt
+ dfmt <- getLangInfo dFmt
+ tfmt <- getLangInfo tFmt
+ tfmta <- getLangInfo tFmtAmpm
+
+ let t = L.defaultTimeLocale {L.wDays = zip days abdays
+ ,L.months = zip mons abmons
+ ,L.amPm = (amstr, pmstr)
+ ,L.dateTimeFmt = dtfmt
+ ,L.dateFmt = dfmt
+ ,L.timeFmt = tfmt
+ ,L.time12Fmt = tfmta}
+ return t
diff --git a/src/Plugins/DateL.hs b/src/Plugins/DateL.hs
deleted file mode 100644
index d8859ed..0000000
--- a/src/Plugins/DateL.hs
+++ /dev/null
@@ -1,35 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module : Plugins.DateL
--- Copyright : (c) Andrea Rossato
--- License : BSD-style (see LICENSE)
---
--- Maintainer : Martin Perner <martin@perner.cc>
--- Stability : unstable
--- Portability : unportable
---
--- A date plugin with localization for Xmobar
---
------------------------------------------------------------------------------
-
-module Plugins.DateL (DateL(..)) where
-
-import Plugins
-import Localize
-
-import System.Time
-
-data DateL = DateL String String String Int
- deriving (Read, Show)
-
-instance Exec DateL where
- alias (DateL _ _ a _) = a
- start (DateL f l _ r) cb = do
- setupTimeLocale l
- go
- where go = date f >>= cb >> tenthSeconds r >> go
-
-date :: String -> IO String
-date format = do
- t <- toCalendarTime =<< getClockTime
- return $ formatCalendarTime getTimeLocale format t
diff --git a/src/Plugins/DateZone.hs b/src/Plugins/DateZone.hs
index f6c4f7a..86114bb 100644
--- a/src/Plugins/DateZone.hs
+++ b/src/Plugins/DateZone.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DoAndIfThenElse #-}
-----------------------------------------------------------------------------
-- |
-- Module : Plugins.DateZone
@@ -8,13 +9,13 @@
-- Stability : unstable
-- Portability : unportable
--
--- A date plugin with location support for Xmobar
+-- A date plugin with localization and location support for Xmobar
--
-- Based on Plugins.Date
--
-- Usage example: in template put
--
--- > Run DateZone "%H:%M:%S" "utcDate" "UTC" 10
+-- > Run DateZone "%a %H:%M:%S" "de_DE.UTF-8" "UTC" "utcDate" 10
--
-----------------------------------------------------------------------------
@@ -22,23 +23,50 @@ module Plugins.DateZone (DateZone(..)) where
import Plugins
-import System.Locale
+import Localize
+
+import Control.Concurrent.STM
import Data.Time.LocalTime
import Data.Time.Format
import Data.Time.LocalTime.TimeZone.Olson
import Data.Time.LocalTime.TimeZone.Series
-data DateZone = DateZone String String String Int
+import System.IO.Unsafe
+import System.Locale (TimeLocale)
+import System.Time
+
+
+
+{-# NOINLINE localeLock #-}
+-- ensures that only one plugin instance sets the locale
+localeLock :: TMVar Bool
+localeLock = unsafePerformIO (newTMVarIO False)
+
+data DateZone = DateZone String String String String Int
deriving (Read, Show)
instance Exec DateZone where
- alias (DateZone _ a _ _) = a
- run (DateZone f _ z _) = date f z
- rate (DateZone _ _ _ r) = r
+ alias (DateZone _ _ _ a _) = a
+ start (DateZone f l z _ r) cb = do
+ lock <- atomically $ takeTMVar localeLock
+ setupTimeLocale l
+ locale <- getTimeLocale
+ atomically $ putTMVar localeLock lock
+ if z /= "" then do
+ timeZone <- getTimeZoneSeriesFromOlsonFile ("/usr/share/zoneinfo/" ++ z)
+ go (dateZone f locale timeZone)
+ else
+ go (date f locale)
+
+ where go func = func >>= cb >> tenthSeconds r >> go func
+
+date :: String -> TimeLocale -> IO String
+date format loc = do
+ t <- toCalendarTime =<< getClockTime
+ return $ formatCalendarTime loc format t
-date :: String -> String -> IO String
-date format zone = do
- timeZone <- getTimeZoneSeriesFromOlsonFile ("/usr/share/zoneinfo/" ++ zone)
+dateZone :: String -> TimeLocale -> TimeZoneSeries -> IO String
+dateZone format loc timeZone = do
zonedTime <- getZonedTime
- return $ formatTime defaultTimeLocale format $ utcToLocalTime' timeZone $ zonedTimeToUTC zonedTime
+ return $ formatTime loc format $ utcToLocalTime' timeZone $ zonedTimeToUTC zonedTime
diff --git a/src/Plugins/DateZoneL.hs b/src/Plugins/DateZoneL.hs
deleted file mode 100644
index 2b7c467..0000000
--- a/src/Plugins/DateZoneL.hs
+++ /dev/null
@@ -1,42 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module : Plugins.DateZoneL
--- Copyright : (c) Martin Perner
--- License : BSD-style (see LICENSE)
---
--- Maintainer : Martin Perner <martin@perner.cc>
--- Stability : unstable
--- Portability : unportable
---
--- A date plugin with localization and location support for Xmobar
---
--- Based on Plugins.DateZone
---
------------------------------------------------------------------------------
-
-module Plugins.DateZoneL (DateZoneL(..)) where
-
-import Plugins
-
-import Localize
-
-import Data.Time.LocalTime
-import Data.Time.Format
-import Data.Time.LocalTime.TimeZone.Olson
-import Data.Time.LocalTime.TimeZone.Series
-
-data DateZoneL = DateZoneL String String String String Int
- deriving (Read, Show)
-
-instance Exec DateZoneL where
- alias (DateZoneL _ _ a _ _) = a
- start (DateZoneL f l _ z r) cb = do
- setupTimeLocale l
- go
- where go = date f z >>= cb >> tenthSeconds r >> go
-
-date :: String -> String -> IO String
-date format zone = do
- timeZone <- getTimeZoneSeriesFromOlsonFile ("/usr/share/zoneinfo/" ++ zone)
- zonedTime <- getZonedTime
- return $ formatTime getTimeLocale format $ utcToLocalTime' timeZone $ zonedTimeToUTC zonedTime