xmobar 0.17 → 0.18
raw patch · 10 files changed
+150/−67 lines, 10 filesdep +regex-compat
Dependencies added: regex-compat
Files
- news.md +38/−20
- readme.md +23/−7
- src/Actions.hs +6/−1
- src/Parsers.hs +21/−10
- src/Plugins/Monitors/Batt.hs +11/−5
- src/Plugins/Monitors/Common.hs +19/−10
- src/Plugins/PipeReader.hs +15/−1
- src/Plugins/StdinReader.hs +10/−9
- src/Plugins/XMonadLog.hs +5/−3
- xmobar.cabal +2/−1
news.md view
@@ -1,5 +1,23 @@ % xmobar - Release notes +## Version 0.18 (June 5, 2013)++_New features_++ - All extra argument monitors taking a string (e.g. `-O` for+ `BatteryP`) accept now template variables (see [github #109] and+ [#110]). Thanks to Todd Lunter.++ - New battery monitor extra argument, `-i`, for the idle status.++_Bug fixes_++ - Safer standard input parsing, avoiding <action> injections.+++[github #109]: https://github.com/jaor/xmobar/issues/109+[#110]: https://github.com/jaor/xmobar/issues/110+ ## Version 0.17 (May 5, 2013) _New features_@@ -22,7 +40,7 @@ - Safer volume plugin (Dmitry Malikov). - Battery percentage capped at 100% (RJ Regenold). -[github #67]: https://github.com/jaor/xmobar/issues/77+[github #67]: https://github.com/jaor/xmobar/issues/67 [github #77]: https://github.com/jaor/xmobar/issues/77 [github #105]: https://github.com/jaor/xmobar/issues/105 @@ -97,10 +115,10 @@ _Bug fixes_ - Stricter build dependencies versioning in cabal file.- - [issue 56]: vertical alignment of text improved.- - [issue 64]: display of `watts` in `Batt` monitor fixed.- - [issue 69]: miscellaneous battery reporting issues.- - [issue 67]: compilation in DragonFly.+ - [issue 56] vertical alignment of text improved.+ - [issue 64] display of `watts` in `Batt` monitor fixed.+ - [issue 69] miscellaneous battery reporting issues.+ - [issue 67] compilation in DragonFly. - DiskIO works also when device path in mtab are symbolic links to the real device file. - Wireless monitor honours padding settings for ESSID names.@@ -111,7 +129,7 @@ [issue 64]: http://code.google.com/p/xmobar/issues/detail?id=64 [issue 67]: http://code.google.com/p/xmobar/issues/detail?id=67 [issue 69]: http://code.google.com/p/xmobar/issues/detail?id=69-[github #36]: https://github.com/jaor/xmobar/issues/38+[github #36]: https://github.com/jaor/xmobar/issues/36 [github #38]: https://github.com/jaor/xmobar/issues/38 ## Version 0.14 (Dec 10, 2011)@@ -131,10 +149,10 @@ _Bug fixes_ - - [issue 45]: Fix for crashes with AC status changes in battery monitor.- - [issue 48]: The <quality> field of Wireless behaves like a percentage.+ - [issue 45] Fix for crashes with AC status changes in battery monitor.+ - [issue 48] The <quality> field of Wireless behaves like a percentage. - [issue 50]/[issue 61]: `MPD` monitor now works with libmpd 0.6.- - [issue 60]: Fixes for crashes on power resume for battery monitor.+ - [issue 60] Fixes for crashes on power resume for battery monitor. - Template sections without fields are now correctly displayed. - Catch errors when reading battery status (Ben Boeckel). - Compilation issues with ghc 7.x (Sergei Trofimovich).@@ -178,17 +196,17 @@ _Bug fixes_ - - [issue 14]: `StdinReader` and other plugins accepting external+ - [issue 14] `StdinReader` and other plugins accepting external input don't get confused anymore when characters from `alignSep` appear in their input.- - [issue 27]: `BottomSize` placement now respects its width argument.- - [issue 28]: Compilation in Mac OS X fixed.- - [issue 30]: `Mail` plugin can be specified anywhere in commands list.- - [issue 36]: Battery monitor now supports non-standard locations of+ - [issue 27] `BottomSize` placement now respects its width argument.+ - [issue 28] Compilation in Mac OS X fixed.+ - [issue 30] `Mail` plugin can be specified anywhere in commands list.+ - [issue 36] Battery monitor now supports non-standard locations of the `/sys/class/power_supply/AC/online` file.- - [issue 40]: Battery monitor now supports the new power_now, that+ - [issue 40] Battery monitor now supports the new power_now, that replaces current_now in linux kernels for v. 2.36 and above.- - [issue 42]: More accurate net monitor rates.+ - [issue 42] More accurate net monitor rates. - DiskIO, Cpu and MultiCpu monitors are also more accurate now. - Text is now correctly centered vertically. - `FullBM` border spec fixed.@@ -247,10 +265,10 @@ _Bug fixes_ - - [issue 23]: Wireless monitor is now compatible with iwlib 29.- - [issue 24]: Swap monitor's used ratio display fixed.- - [issue 25]: Percentages only include `%` if requested using `-P`.- - [issue 31]: MPD monitor now respects `-W` argument.+ - [issue 23] Wireless monitor is now compatible with iwlib 29.+ - [issue 24] Swap monitor's used ratio display fixed.+ - [issue 25] Percentages only include `%` if requested using `-P`.+ - [issue 31] MPD monitor now respects `-W` argument. - Fixes in CPU frequency formatting, string alignment and colour boxes in monitors (Norbert Zeh). - TopMem and TopProc now use the `-L` and `-H` options correctly for
readme.md view
@@ -11,7 +11,7 @@ features, like dynamic color management, icons, output templates, and extensibility through plugins. -This page documents xmobar 0.17 (see [release notes]).+This page documents xmobar 0.18 (see [release notes]). [This screenshot] shows xmobar running under [sawfish], with antialiased fonts. And [this one] is my desktop with [xmonad] and two@@ -734,6 +734,7 @@ (these options, being specific to the monitor, are to be specified after a `--` in the argument list): - `-O`: string for AC "on" status (default: "On")+ - `-i`: string for AC "idle" status (default: "On") - `-o`: string for AC "off" status (default: "Off") - `-L`: low power (`watts`) threshold (default: -12) - `-H`: high power threshold (default: -10)@@ -753,7 +754,7 @@ Run BatteryP ["BAT0"] ["-t", "<acstatus><watts> (<left>%)", "-L", "10", "-H", "80", "-p", "3",- "--", "-O", "<fc=green>On</fc> - ", "-o", "",+ "--", "-O", "<fc=green>On</fc> - ", "-i", "", "-L", "-15", "-H", "-5", "-l", "red", "-m", "blue", "-h", "green"] 600@@ -764,6 +765,20 @@ neither the generic nor the specific options have any effect on `<timeleft>`. + It is also possible to specify template variables in the `-O` and+ `-o` switches, as in the following example:++ Run BatteryP ["BAT0"]+ ["-t", "<acstatus>"+ , "-L", "10", "-H", "80"+ , "-l", "red", "-h", "green"+ , "--", "-O", "Charging", "-o", "Battery: <left>%"+ ] 10++- The "idle" AC state is selected whenever the AC power entering the+ battery is zero.++ ### `TopProc Args RefreshRate` - Aliases to `top`@@ -1294,11 +1309,12 @@ In particular, xmobar [incorporates patches] by Ben Boeckel, Roman Cheplyaka, Patrick Chilton, John Goerzen, Reto Hablützel, Juraj Hercek, Tomas Janousek, Spencer Janssen, Jochen Keil, Lennart-Kolmodin, Krzysztof Kosciuszkiewicz, Dmitry Kurochkin, Dmitry Malikov,-Edward O'Callaghan, Svein Ove, Martin Perner, Jens Petersen, Alexander-Polakov, Petr Rockai, Peter Simons, Andrew Sackville-West, Alexander-Solovyov, John Soros, Artem Tarasov, Sergei Trofimovich, Thomas-Tuegel, Jan Vornberger, Daniel Wagner and Norbert Zeh.+Kolmodin, Krzysztof Kosciuszkiewicz, Dmitry Kurochkin, Todd Lunter,+Dmitry Malikov, Edward O'Callaghan, Svein Ove, Martin Perner, Jens+Petersen, Alexander Polakov, Petr Rockai, Peter Simons, Andrew+Sackville-West, Alexander Solovyov, John Soros, Artem Tarasov, Sergei+Trofimovich, Thomas Tuegel, Jan Vornberger, Daniel Wagner and Norbert+Zeh. [incorporates patches]: http://www.ohloh.net/p/xmobar/contributors
src/Actions.hs view
@@ -10,13 +10,18 @@ -- ----------------------------------------------------------------------------- -module Actions where+module Actions (Action(..), runAction, stripActions) where import System.Process (system) import Control.Monad (void)+import Text.Regex (subRegex, mkRegex) data Action = Spawn String deriving (Eq) runAction :: Action -> IO () runAction (Spawn s) = void $ system (s ++ "&")++stripActions :: String -> String+stripActions s = subRegex actionRegex s "[action=\1]\2[action]"+ where actionRegex = mkRegex "<action=([^>])*>(.+?)</action>"
src/Parsers.hs view
@@ -37,16 +37,20 @@ parseString :: Config -> String -> IO [(Widget, ColorString, Maybe Action)] parseString c s = case parse (stringParser (fgColor c) Nothing) "" s of- Left _ -> return [(Text $ "Could not parse string: " ++ s, fgColor c, Nothing)]+ Left _ -> return [(Text $ "Could not parse string: " ++ s+ , fgColor c+ , Nothing)] Right x -> return (concat x) -- | Gets the string and combines the needed parsers-stringParser :: String -> Maybe Action -> Parser [[(Widget, ColorString, Maybe Action)]]+stringParser :: String -> Maybe Action+ -> Parser [[(Widget, ColorString, Maybe Action)]] stringParser c a = manyTill (textParser c a <|> try (iconParser c a) <|> try (actionParser c) <|> colorParser a) eof -- | Parses a maximal string without color markup.-textParser :: String -> Maybe Action -> Parser [(Widget, ColorString, Maybe Action)]+textParser :: String -> Maybe Action+ -> Parser [(Widget, ColorString, Maybe Action)] textParser c a = do s <- many1 $ noneOf "<" <|> try (notFollowedBy' (char '<')@@ -66,7 +70,8 @@ notFollowedBy $ try (e >> return '*') return x -iconParser :: String -> Maybe Action -> Parser [(Widget, ColorString, Maybe Action)]+iconParser :: String -> Maybe Action+ -> Parser [(Widget, ColorString, Maybe Action)] iconParser c a = do string "<icon=" i <- manyTill (noneOf ">") (try (string "/>"))@@ -77,7 +82,8 @@ a <- between (string "<action=") (string ">") (many1 (noneOf ">")) let a' = Just (Spawn a) s <- manyTill (try (textParser c a') <|> try (iconParser c a') <|>- try (colorParser a') <|> actionParser c) (try $ string "</action>")+ try (colorParser a') <|> actionParser c)+ (try $ string "</action>") return (concat s) -- | Parsers a string wrapped in a color specification.@@ -122,7 +128,8 @@ -- | Given a finite "Map" and a parsed template produce the resulting -- output string.-combine :: Config -> Map.Map String Runnable -> [(String, String, String)] -> [(Runnable,String,String)]+combine :: Config -> Map.Map String Runnable+ -> [(String, String, String)] -> [(Runnable,String,String)] combine _ _ [] = [] combine c m ((ts,s,ss):xs) = (com, s, ss) : combine c m xs where com = Map.findWithDefault dflt ts m@@ -132,7 +139,8 @@ allTillSep = many . noneOf . sepChar stripComments :: String -> String-stripComments = unlines . map (drop 5 . strip False . (replicate 5 ' '++)) . lines+stripComments =+ unlines . map (drop 5 . strip False . (replicate 5 ' '++)) . lines where strip m ('-':'-':xs) = if m then "--" ++ strip m xs else "" strip m ('\\':xss) = case xss of '\\':xs -> '\\' : strip m xs@@ -197,7 +205,8 @@ ; notFollowedBy $ wrapSkip $ string "Run" ; return "," }- readCommands = manyTill anyChar (try commandsEnd) >>= read' commandsErr . flip (++) "]"+ readCommands = manyTill anyChar (try commandsEnd) >>=+ read' commandsErr . flip (++) "]" strField e n = field e n . between (strDel "start" n) (strDel "end" n) . many $ noneOf "\"\n\r"@@ -217,5 +226,7 @@ _ -> fail $ "error reading the " ++ d ++ " field: " ++ s commandsErr :: String-commandsErr = "commands: this usually means that a command could not be parsed.\n" ++- "The error could be located at the begining of the command which follows the offending one."+commandsErr = "commands: this usually means that a command could not" +++ "\nbe parsed." +++ "\nThe error could be located at the begining of the command" +++ "\nwhich follows the offending one."
src/Plugins/Monitors/Batt.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Batt--- Copyright : (c) 2010, 2011, 2012 Jose A Ortega+-- Copyright : (c) 2010, 2011, 2012, 2013 Jose A Ortega -- (c) 2010 Andrea Rossato, Petr Rockai -- License : BSD-style (see LICENSE) --@@ -25,6 +25,7 @@ data BattOpts = BattOpts { onString :: String , offString :: String+ , idleString :: String , posColor :: Maybe String , lowWColor :: Maybe String , mediumWColor :: Maybe String@@ -39,6 +40,7 @@ defaultOpts = BattOpts { onString = "On" , offString = "Off"+ , idleString = "On" , posColor = Nothing , lowWColor = Nothing , mediumWColor = Nothing@@ -53,6 +55,7 @@ options = [ Option "O" ["on"] (ReqArg (\x o -> o { onString = x }) "") "" , Option "o" ["off"] (ReqArg (\x o -> o { offString = x }) "") ""+ , Option "i" ["idle"] (ReqArg (\x o -> o { idleString = x }) "") "" , Option "p" ["positive"] (ReqArg (\x o -> o { posColor = Just x }) "") "" , Option "l" ["low"] (ReqArg (\x o -> o { lowWColor = Just x }) "") "" , Option "m" ["medium"] (ReqArg (\x o -> o { mediumWColor = Just x }) "") ""@@ -140,10 +143,12 @@ ft = sum (map full bats) left = if ft > 0 then sum (map now bats) / ft else 0 watts = sign * sum (map power bats)- time = if watts == 0 then 0 else sum $ map time' bats- mwatts = if watts == 0 then 1 else sign * watts+ idle = watts == 0+ time = if idle then 0 else sum $ map time' bats+ mwatts = if idle then 1 else sign * watts time' b = (if ac then full b - now b else now b) / mwatts- acstr = if ac then onString opts else offString opts+ acstr = if idle then idleString opts else+ if ac then onString opts else offString opts return $ if isNaN left then NA else Result left watts time acstr runBatt :: [String] -> Monitor String@@ -158,7 +163,8 @@ case c of Result x w t s -> do l <- fmtPercent x- parseTemplate (l ++ s:[fmtTime $ floor t, fmtWatts w opts suffix d])+ let ts = [fmtTime $ floor t, fmtWatts w opts suffix d]+ parseTemplate (l ++ s:ts) NA -> return "N/A" where fmtPercent :: Float -> Monitor [String] fmtPercent x = do
src/Plugins/Monitors/Common.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Common--- Copyright : (c) 2010, 2011 Jose Antonio Ortega Ruiz+-- Copyright : (c) 2010, 2011, 2013 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) --@@ -35,6 +35,7 @@ , getAfterString , skipTillString , parseTemplate+ , parseTemplate' -- ** String Manipulation -- $strings , padString@@ -301,19 +302,27 @@ parseTemplate :: [String] -> Monitor String parseTemplate l = do t <- getConfigValue template- s <- io $ runP templateParser t e <- getConfigValue export let m = Map.fromList . zip e $ l- return $ combine m s+ parseTemplate' t m --- | Given a finite "Map" and a parsed templatet produces the--- | resulting output string.-combine :: Map.Map String String -> [(String, String, String)] -> String-combine _ [] = []+-- | Parses the template given to it with a map of export values and combines+-- them+parseTemplate' :: String -> Map.Map String String -> Monitor String+parseTemplate' t m =+ do s <- io $ runP templateParser t+ combine m s++-- | Given a finite "Map" and a parsed template t produces the+-- | resulting output string as the output of the monitor.+combine :: Map.Map String String -> [(String, String, String)] -> Monitor String+combine _ [] = return [] combine m ((s,ts,ss):xs) =- s ++ str ++ ss ++ combine m xs- where str = Map.findWithDefault err ts m- err = "<" ++ ts ++ " not found!>"+ do next <- combine m xs+ let str = Map.findWithDefault err ts m+ err = "<" ++ ts ++ " not found!>"+ nstr <- parseTemplate' str m+ return $ s ++ (if null nstr then str else nstr) ++ ss ++ next -- $strings
src/Plugins/PipeReader.hs view
@@ -16,6 +16,10 @@ import System.IO import Plugins+import System.Posix.Files+import Control.Concurrent(threadDelay)+import Control.Exception+import Control.Monad(when) data PipeReader = PipeReader String String deriving (Read, Show)@@ -24,11 +28,21 @@ alias (PipeReader _ a) = a start (PipeReader p _) cb = do let (def, pipe) = split ':' p+ when (not $ null def) (cb def)+ checkPipe pipe h <- openFile pipe ReadWriteMode- cb def forever (hGetLineSafe h >>= cb) where forever a = a >> forever a split c xs | c `elem` xs = let (pre, post) = span ((/=) c) xs in (pre, dropWhile ((==) c) post) | otherwise = ([], xs)++checkPipe :: FilePath -> IO ()+checkPipe file = do+ handle (\(SomeException _) -> waitForPipe) $ do+ status <- getFileStatus file+ if isNamedPipe status+ then return ()+ else waitForPipe+ where waitForPipe = threadDelay 1000 >> checkPipe file
src/Plugins/StdinReader.hs view
@@ -20,15 +20,16 @@ import System.IO import Control.Exception (SomeException(..), handle) import Plugins+import Actions (stripActions) -data StdinReader = StdinReader- deriving (Read, Show)+data StdinReader = StdinReader deriving (Read, Show) instance Exec StdinReader where- start StdinReader cb = do- cb =<< handle (\(SomeException e) -> do hPrint stderr e; return "")- (hGetLineSafe stdin)- eof <- hIsEOF stdin- if eof- then exitImmediately ExitSuccess- else start StdinReader cb+ start StdinReader cb = do+ s <- handle (\(SomeException e) -> do hPrint stderr e; return "")+ (hGetLineSafe stdin)+ cb (stripActions s)+ eof <- hIsEOF stdin+ if eof+ then exitImmediately ExitSuccess+ else start StdinReader cb
src/Plugins/XMonadLog.hs view
@@ -28,9 +28,11 @@ #endif import Foreign.C (CChar) import XUtil (nextEvent')-+import Actions (stripActions) -data XMonadLog = XMonadLog | XPropertyLog String | NamedXPropertyLog String String+data XMonadLog = XMonadLog+ | XPropertyLog String+ | NamedXPropertyLog String String deriving (Read, Show) instance Exec XMonadLog where@@ -51,7 +53,7 @@ let update = do mwp <- getWindowProperty8 d xlog root- maybe (return ()) (cb . decodeCChar) mwp+ maybe (return ()) (cb . stripActions. decodeCChar) mwp update
xmobar.cabal view
@@ -1,5 +1,5 @@ name: xmobar-version: 0.17+version: 0.18 homepage: http://projects.haskell.org/xmobar/ bug-reports: http://code.google.com/p/xmobar/issues synopsis: A Minimalistic Text Based Status Bar@@ -97,6 +97,7 @@ build-depends: base == 4.*, containers,+ regex-compat, process, old-locale, bytestring,