diff options
| author | Will Song <incertia9474@gmail.com> | 2016-07-16 16:15:33 -0500 | 
|---|---|---|
| committer | jao <jao@gnu.org> | 2016-07-27 01:00:06 +0200 | 
| commit | a93755b2d1e9efbd63723f5302ca7c8f43521aa8 (patch) | |
| tree | fd6478184be41063af8c618e2bb0932179ba18a5 | |
| parent | c98752cad2343932d42d2fef2229581f0c266800 (diff) | |
| download | xmobar-a93755b2d1e9efbd63723f5302ca7c8f43521aa8.tar.gz xmobar-a93755b2d1e9efbd63723f5302ca7c8f43521aa8.tar.bz2  | |
Add expandEnv function and use it in PipeReader family of monitors
expandEnv takes a string and expands the environment variables it can
find. variable substringing (e.g. ${VAR:1} to lop off the first
character) is not supported, but $VAR and ${VAR} formats are, with the
former being delimited by punctuation, but not underscores.
| -rw-r--r-- | readme.md | 4 | ||||
| -rw-r--r-- | src/Environment.hs | 48 | ||||
| -rw-r--r-- | src/Plugins/BufferedPipeReader.hs | 4 | ||||
| -rw-r--r-- | src/Plugins/MarqueePipeReader.hs | 3 | ||||
| -rw-r--r-- | src/Plugins/PipeReader.hs | 3 | ||||
| -rw-r--r-- | xmobar.cabal | 1 | 
6 files changed, 60 insertions, 3 deletions
@@ -1348,6 +1348,7 @@ can be used in the output template as `%mydate%`  - Reads its displayed output from the given pipe.  - Prefix an optional default text separated by a colon +- Expands environment variables in the first argument of syntax '${VAR}' or '$VAR'  <font size="+1">**`MarqueePipeReader "default text:/path/to/pipe" (length, rate, sep) Alias`**</font> @@ -1357,6 +1358,8 @@ can be used in the output template as `%mydate%`          Run MarqueePipeReader "/tmp/testpipe" (10, 7, "+") "mpipe" +- Expands environment variables in the first argument +  <font size="+1">  **`BufferedPipeReader Alias [(Timeout, Bool, "/path/to/pipe1"), ..]`**  </font> @@ -1386,6 +1389,7 @@ can be used in the output template as `%mydate%`    `"/tmp/xmobar_status"` will reveal xmonad for 1.5 seconds and    temporarily overwrite the window titles.  - Take a look at [samples/status.sh] +- Expands environment variables for the pipe path  [samples/status.sh]: http://github.com/jaor/xmobar/raw/master/samples/status.sh diff --git a/src/Environment.hs b/src/Environment.hs new file mode 100644 index 0000000..ebdf733 --- /dev/null +++ b/src/Environment.hs @@ -0,0 +1,48 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  XMobar.Environment +-- Copyright   :  (c) William Song +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Will Song <incertia@incertia.net> +-- Stability   :  stable +-- Portability :  portable +-- +-- A function to expand environment variables in strings +-- +----------------------------------------------------------------------------- +module Environment where + +import Data.Maybe           (fromMaybe) +import System.Environment   (lookupEnv) + +expandEnv :: String -> IO String +expandEnv "" = return "" +expandEnv (c:s) = case c of +  '$'       -> do +    envVar <- fromMaybe "" <$> lookupEnv e +    remainder <- expandEnv s' +    return $ envVar ++ remainder +    where (e, s') = getVar s +          getVar "" = ("", "") +          getVar ('{':s) = (takeUntil "}" s, drop 1 . dropUntil "}" $ s) +          getVar s = (takeUntil filterstr s, dropUntil filterstr s) +          filterstr = ",./? \t;:\"'~`!@#$%^&*()<>-+=\\|" +          takeUntil f = takeWhile (not . flip elem f) +          dropUntil f = dropWhile (not . flip elem f) + +  '\\' -> case s == "" of +    True  -> return "\\" +    False -> do +      remainder <- expandEnv $ drop 1 s +      return $ escString s ++ remainder +      where escString s = let (cc:ss) = s in +              case cc of +                't' -> "\t" +                'n' -> "\n" +                '$' -> "$" +                _   -> [cc] + +  _    -> do +    remainder <- expandEnv s +    return $ c : remainder diff --git a/src/Plugins/BufferedPipeReader.hs b/src/Plugins/BufferedPipeReader.hs index 9a7266e..b6cad9d 100644 --- a/src/Plugins/BufferedPipeReader.hs +++ b/src/Plugins/BufferedPipeReader.hs @@ -20,6 +20,7 @@ import Control.Concurrent.STM  import System.IO  import System.IO.Unsafe(unsafePerformIO) +import Environment  import Plugins  import Signal @@ -51,7 +52,8 @@ instance Exec BufferedPipeReader where          reader :: (Int, Bool, FilePath) -> TChan (Int, Bool, String) -> IO ()          reader p@(to, tg, fp) tc = do -            openFile fp ReadWriteMode >>= hGetLineSafe >>= \dt -> +            fp' <- expandEnv fp +            openFile fp' ReadWriteMode >>= hGetLineSafe >>= \dt ->                  atomically $ writeTChan tc (to, tg, dt)              reader p tc diff --git a/src/Plugins/MarqueePipeReader.hs b/src/Plugins/MarqueePipeReader.hs index 8120c84..0b3a710 100644 --- a/src/Plugins/MarqueePipeReader.hs +++ b/src/Plugins/MarqueePipeReader.hs @@ -15,6 +15,7 @@  module Plugins.MarqueePipeReader where  import System.IO (openFile, IOMode(ReadWriteMode), Handle) +import Environment  import Plugins (tenthSeconds, Exec(alias, start), hGetLineSafe)  import System.Posix.Files (getFileStatus, isNamedPipe)  import Control.Concurrent(forkIO, threadDelay) @@ -32,7 +33,7 @@ data MarqueePipeReader = MarqueePipeReader String (Length, Rate, Separator) Stri  instance Exec MarqueePipeReader where      alias (MarqueePipeReader _ _ a)    = a      start (MarqueePipeReader p (len, rate, sep) _) cb = do -        let (def, pipe) = split ':' p +        (def, pipe) <- split ':' <$> expandEnv p          unless (null def) (cb def)          checkPipe pipe          h <- openFile pipe ReadWriteMode diff --git a/src/Plugins/PipeReader.hs b/src/Plugins/PipeReader.hs index c3e491a..653a72d 100644 --- a/src/Plugins/PipeReader.hs +++ b/src/Plugins/PipeReader.hs @@ -16,6 +16,7 @@ module Plugins.PipeReader where  import System.IO  import Plugins +import Environment  import System.Posix.Files  import Control.Concurrent(threadDelay)  import Control.Exception @@ -27,7 +28,7 @@ data PipeReader = PipeReader String String  instance Exec PipeReader where      alias (PipeReader _ a)    = a      start (PipeReader p _) cb = do -        let (def, pipe) = split ':' p +        (def, pipe) <- split ':' <$> expandEnv p          unless (null def) (cb def)          checkPipe pipe          h <- openFile pipe ReadWriteMode diff --git a/xmobar.cabal b/xmobar.cabal index c0237a0..4a268fb 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -88,6 +88,7 @@ executable xmobar      other-modules:        Xmobar, Actions, Bitmap, Config, Parsers, Commands, Localize,        XUtil, XPMFile, StatFS, Runnable, ColorCache, Window, Signal, +      Environment,        Plugins, Plugins.BufferedPipeReader,        Plugins.CommandReader, Plugins.Date, Plugins.EWMH,        Plugins.PipeReader, Plugins.MarqueePipeReader,  | 
