packages feed

xmobar 0.29.5 → 0.30

raw patch · 11 files changed

+361/−44 lines, 11 files

Files

changelog.md view
@@ -1,3 +1,18 @@+## Version 0.30 (August, 2019)++_New features_++  - New monitor `MultiCoreTemp`, thanks to Felix Springer.+  - `DiskIO`: Additional template variables for absolute number of+    bytes rather than speeds (see [issue #390].+  - `WeatherX`: An extension to the `Weather` monitor allowing the+    spefication of custom strings or icons for sky conditions.+  - The battery monitors accept the new arguments `-a` and `-A` to+    specify a system command executed if battery left goes beyond a+    given threshold.++[issue #390]: https://github.com/jaor/xmobar/issues/390+ ## Version 0.29.5 (March, 2019)  _Bug fixes_
readme.md view
@@ -11,10 +11,15 @@ features, like dynamic color management, icons, output templates, and extensibility through plugins. -[This screenshot](doc/xmobar-sawfish.png) shows xmobar running under-[sawfish], and [this one](doc/xmobar-xmonad.png) is a desktop with-[xmonad] and two instances of xmobar.+These are two xmobar instances using the author's configuration: +![top](https://gitlab.com/jaor/xmobar-config/raw/master/img/xmobar-top.png)++![bottom](https://gitlab.com/jaor/xmobar-config/raw/master/img/xmobar-bottom.png)++and [this one](doc/xmobar-xmonad.png) is a full desktop with [xmonad]+and, again, two instances of xmobar.+ [xmonad]: http://xmonad.org [Ion3]: http://tuomov.iki.fi/software/ @@ -739,6 +744,39 @@ - Default template: `<station>: <tempC>C, rh <rh>% (<hour>)` - Retrieves weather information from http://tgftp.nws.noaa.gov. +### `WeatherX StationID SkyConditions Args RefreshRate`++- Works in the same way as `Weather`, but takes an additional+  argument, a list of pairs from sky conditions to their replacement+  (typically a unicode string or an icon specification).+- Use the variable `skyConditionS` to display the replacement of the+  corresponding sky condition.  All other `Weather` template variables+  are available as well.++For example:++```haskell+  WeatherX "LEBL"+           [ ("clear", "🌣")+           , ("sunny", "🌣")+           , ("mostly clear", "🌤")+           , ("mostly sunny", "🌤")+           , ("partly sunny", "⛅")+           , ("fair", "🌑")+           , ("cloudy","☁")+           , ("overcast","☁")+           , ("partly cloudy", "⛅")+           , ("mostly cloudy", "🌧")+           , ("considerable cloudiness", "⛈")]+           ["-t", "<fn=2><skyConditionS></fn> <tempC>° <rh>%  <windKmh> (<hour>)"+           , "-L","10", "-H", "25", "--normal", "black"+           , "--high", "lightgoldenrod4", "--low", "darkseagreen4"]+           18000+```++As mentioned, the replacement string can also be an icon+specification, such as `("clear", "<icon=weather-clear.xbm/>")`.+ ### `Network Interface Args RefreshRate`  - Aliases to the interface name: so `Network "eth0" []` can be used as@@ -865,6 +903,12 @@   - `-p`: color to display positive power (battery charging)   - `-f`: file in `/sys/class/power_supply` with AC info (default:     "AC/online")+  - `-A`: a number between 0 and 100, threshold below which the action+    given by `-a`, if any, is performed (default: 5)+  - `-a`: a string with a system command that is run when the+    percentage left in the battery is less or equal than the threshold+    given by the `-A` option.  If not present, no action is+    undertaken.   - `--on-icon-pattern`: dynamic string for current battery charge     when AC is "on" in `leftipat`.   - `--off-icon-pattern`: dynamic string for current battery charge@@ -883,14 +927,18 @@                        "-L", "10", "-H", "80", "-p", "3",                        "--", "-O", "<fc=green>On</fc> - ", "-i", "",                        "-L", "-15", "-H", "-5",-                       "-l", "red", "-m", "blue", "-h", "green"]+                       "-l", "red", "-m", "blue", "-h", "green"+                       "-a", "notify-send -u critical 'Battery running out!!'",+                       "-A", "3"]                       600    In the above example, the thresholds before the "--" separator   affect only the `<left>` and `<leftbar>` fields, while those after   the separator affect how `<watts>` is displayed. For this monitor,   neither the generic nor the specific options have any effect on-  `<timeleft>`.+  `<timeleft>`.  We are also telling the monitor to execute the unix+  command `notify-send` when the percentage left in the battery+  reaches 6%.    It is also possible to specify template variables in the `-O` and   `-o` switches, as in the following example:@@ -964,11 +1012,15 @@  - Aliases to `diskio` - Disks: list of pairs of the form (device or mount point, template),-  where the template can contain `<total>`, `<read>`, `<write>` for total,-  read and write speed, respectively. There are also bar versions of each:-  `<totalbar>`, `<totalvbar>`, `<totalipat>`,-  `<readbar>`, `<readvbar>`, `<readipat>`,-  `<writebar>`, `<writevbar>`, and `<writeipat>`.+  where the template can contain `<total>`, `<read>`, `<write>` for+  total, read and write speed, respectively, as well as `<totalb>`,+  `<readb>`, `<writeb>`, which report number of bytes during the last+  refresh period rather than speed. There are also bar versions of+  each: `<totalbar>`, `<totalvbar>`, `<totalipat>`, `<readbar>`,+  `<readvbar>`, `<readipat>`, `<writebar>`, `<writevbar>`, and+  `<writeipat>`; and their "bytes" counterparts: `<totalbbar>`,+  `<totalbvbar>`, `<totalbipat>`, `<readbbar>`, `<readbvbar>`,+  `<readbipat>`, `<writebbar>`, `<writebvbar>`, and `<writebipat>`. - Thresholds refer to speed in b/s - Args: default monitor arguments. `-t`/`--template` is ignored. Plus   - `--total-icon-pattern`: dynamic string for total disk I/O in `<totalipat>`.@@ -1042,6 +1094,34 @@                        "-L", "40", "-H", "60",                        "-l", "lightblue", "-n", "gray90", "-h", "red"] 50 +### `MultiCoreTemp Args RefreshRate`++- Aliases to `multicoretemp`+- Args: default monitor arguments, plus:+  - `--max-icon-pattern`: dynamic string for overall cpu load in `maxipat`.+  - `--avg-icon-pattern`: dynamic string for overall cpu load in `avgipat`.+  - `--mintemp`: temperature in degree Celsius, that sets the lower+    limit for percentage calculation.+  - `--maxtemp`: temperature in degree Celsius, that sets the upper+    limit for percentage calculation.+- Thresholds refer to temperature in degree Celsius+- Variables that can be used with the `-t`/`--template` argument:+            `max`, `maxpc`, `maxbar`, `maxvbar`, `maxipat`,+            `avg`, `avgpc`, `avgbar`, `avgvbar`, `avgipat`,+            `core0`, `core1`, ..., `coreN`++  The *pc, *bar, *vbar and *ipat variables are showing percentages on the scale+  defined by `--mintemp` and `--maxtemp`.+  The max* and avg* variables to the highest and the average core temperature.+- Default template: `Temp: <max>°C - <maxpc>%`+- This monitor requires coretemp module to be loaded in kernel+- Example:++         Run MultiCoreTemp ["-t", "Temp: <avg>°C | <avgpc>%",+                            "-L", "60", "-H", "80",+                            "-l", "green", "-n", "yellow", "-h", "red"+                            "--", "--mintemp", "20", "--maxtemp", "100"] 50+ ### `Volume Mixer Element Args RefreshRate`  - Aliases to the mixer name and element name separated by a colon. Thus,@@ -1467,15 +1547,15 @@  `start` must receive a callback to be used to display the `String` produced by the plugin. This method can be used for plugins that need-to perform asynchronous actions. See `Plugins/PipeReader.hs` for an-example.+to perform asynchronous actions. See+`src/Xmobar/Plugins/PipeReader.hs` for an example.  `run` can be used for simpler plugins. If you define only `run` the plugin will be run every second. To overwrite this default you just need to implement `rate`, which must return the number of tenth of-seconds between every successive runs. See `Plugins/HelloWorld.hs` for-an example of a plugin that runs just once, and `Plugins/Date.hs` for-one that implements `rate`.+seconds between every successive runs. See `examples/xmobar.hs` for an+example of a plugin that runs just once, and+`src/Xmobar/Plugins/Date.hs` for one that implements `rate`.  Notice that Date could be implemented as: @@ -1504,8 +1584,8 @@  To use your new plugin, you need to use a pure Haskell configuration for xmobar, and load your definitions there.  You can see an example-in [examples/xmobar.hs] showing you how to write a Haskell-configuration that uses a new plugin, all in one file.+in [examples/xmobar.hs](./examples/xmobar.hs) showing you how to write+a Haskell configuration that uses a new plugin, all in one file.  When xmobar runs with the full path to that Haskell file as its argument (or if you put it in `~/.config/xmobar/xmobar.hs`), and with@@ -1514,6 +1594,13 @@  That's it! +## Configurations written in pure Haskell++xmobar can be used as a pure Haskell program, that is compiled with+your specific configuration, expressed as Haskell source code.  For an+example, see [the author's+configuration](https://gitlab.com/jaor/xmobar-config/).+ # Authors and credits  Andrea Rossato originally designed and implemented xmobar up to@@ -1532,10 +1619,10 @@ Petersen, Alexander Polakov, Pavan Rikhi, Petr Rockai, Andrew Sackville-West, Markus Scherer, Daniel Schüssler, Olivier Schneider, Alexander Shabalin, Valentin Shirokov, Peter Simons, Alexander-Solovyov, Will Song, John Soros, Travis Staton, Artem Tarasov, Samuli-Thomasson, Edward Tjörnhammar, Sergei Trofimovich, Thomas Tuegel, Jan-Vornberger, Anton Vorontsov, Daniel Wagner, Zev Weiss, Phil Xiaojun-Hu, Edward Z. Yang and Norbert Zeh.+Solovyov, Will Song, John Soros, Felix Springer, Travis Staton, Artem+Tarasov, Samuli Thomasson, Edward Tjörnhammar, Sergei Trofimovich,+Thomas Tuegel, Jan Vornberger, Anton Vorontsov, Daniel Wagner, Zev+Weiss, Phil Xiaojun Hu, Edward Z. Yang and Norbert Zeh.  [jao]: http://jao.io [incorporates patches]: http://www.ohloh.net/p/xmobar/contributors@@ -1572,7 +1659,7 @@ This software is released under a BSD-style license. See [LICENSE] for more details. -Copyright &copy; 2010-2018 Jose Antonio Ortega Ruiz+Copyright &copy; 2010-2019 Jose Antonio Ortega Ruiz  Copyright &copy; 2007-2010 Andrea Rossato 
src/Xmobar/App/Opts.hs view
@@ -1,7 +1,7 @@ ------------------------------------------------------------------------------ -- | -- Module: Xmobar.App.Opts--- Copyright: (c) 2018 Jose Antonio Ortega Ruiz+-- Copyright: (c) 2018, 2019 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: jao@gnu.org@@ -105,7 +105,7 @@ info :: String info = "xmobar " ++ showVersion version         ++ "\n (C) 2007 - 2010 Andrea Rossato "-        ++ "\n (C) 2010 - 2018 Jose A Ortega Ruiz\n "+        ++ "\n (C) 2010 - 2019 Jose A Ortega Ruiz\n "         ++ mail ++ "\n" ++ license  mail :: String
src/Xmobar/Plugins/Monitors.hs view
@@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- -- | -- Module      :  Xmobar.Plugins.Monitors--- Copyright   :  (c) 2010, 2011, 2012, 2013, 2017, 2018 Jose Antonio Ortega Ruiz+-- Copyright   :  (c) 2010, 2011, 2012, 2013, 2017, 2018, 2019 Jose Antonio Ortega Ruiz --                (c) 2007-10 Andrea Rossato -- License     :  BSD-style (see LICENSE) --@@ -34,6 +34,7 @@ import Xmobar.Plugins.Monitors.ThermalZone import Xmobar.Plugins.Monitors.CpuFreq import Xmobar.Plugins.Monitors.CoreTemp+import Xmobar.Plugins.Monitors.MultiCoreTemp import Xmobar.Plugins.Monitors.Disk import Xmobar.Plugins.Monitors.Top import Xmobar.Plugins.Monitors.Uptime@@ -72,12 +73,14 @@               | Brightness   Args        Rate               | CpuFreq      Args        Rate               | CoreTemp     Args        Rate+              | MultiCoreTemp Args       Rate               | TopProc      Args        Rate               | TopMem       Args        Rate               | Uptime       Args        Rate               | CatInt       Int FilePath Args Rate #ifdef WEATHER               | Weather      Station     Args Rate+              | WeatherX     Station SkyConditions Args Rate #endif #ifdef UVMETER               | UVMeter      Station     Args Rate@@ -103,6 +106,7 @@ type Program   = String type Alias     = String type Station   = String+type SkyConditions = [(String, String)] type Zone      = String type ZoneNo    = Int type Interface = String@@ -112,6 +116,7 @@ instance Exec Monitors where #ifdef WEATHER     alias (Weather s _ _) = s+    alias (WeatherX s _ _ _) = s #endif     alias (Network i _ _) = i     alias (DynNetwork _ _) = "dynnetwork"@@ -129,6 +134,7 @@     alias (TopProc _ _) = "top"     alias (TopMem _ _) = "topmem"     alias (CoreTemp _ _) = "coretemp"+    alias (MultiCoreTemp _ _) = "multicoretemp"     alias DiskU {} = "disku"     alias DiskIO {} = "diskio"     alias (Uptime _ _) = "uptime"@@ -159,6 +165,7 @@     start (TopMem a r) = runM a topMemConfig runTopMem r #ifdef WEATHER     start (Weather s a r) = runMD (a ++ [s]) weatherConfig runWeather r weatherReady+    start (WeatherX s c a r) = runMD (a ++ [s]) weatherConfig (runWeather' c) r weatherReady #endif     start (Thermal z a r) = runM (a ++ [z]) thermalConfig runThermal r     start (ThermalZone z a r) =@@ -171,6 +178,7 @@     start (Brightness a r) = runM a brightConfig runBright r     start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r     start (CoreTemp a r) = runM a coreTempConfig runCoreTemp r+    start (MultiCoreTemp a r) = startMultiCoreTemp a r     start (DiskU s a r) = runM a diskUConfig (runDiskU s) r     start (DiskIO s a r) = startDiskIO s a r     start (Uptime a r) = runM a uptimeConfig runUptime r
src/Xmobar/Plugins/Monitors/Batt.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module      :  Plugins.Monitors.Batt--- Copyright   :  (c) 2010, 2011, 2012, 2013, 2015, 2016, 2018 Jose A Ortega+-- Copyright   :  (c) 2010, 2011, 2012, 2013, 2015, 2016, 2018, 2019 Jose A Ortega --                (c) 2010 Andrea Rossato, Petr Rockai -- License     :  BSD-style (see LICENSE) --@@ -15,6 +15,8 @@  module Xmobar.Plugins.Monitors.Batt ( battConfig, runBatt, runBatt' ) where +import System.Process (system)+import Control.Monad (void, unless) import Control.Exception (SomeException, handle) import Xmobar.Plugins.Monitors.Common import System.FilePath ((</>))@@ -36,6 +38,8 @@   , highWColor :: Maybe String   , lowThreshold :: Float   , highThreshold :: Float+  , onLowAction :: Maybe String+  , actionThreshold :: Float   , onlineFile :: FilePath   , scale :: Float   , onIconPattern :: Maybe IconPattern@@ -52,6 +56,8 @@   , lowWColor = Nothing   , mediumWColor = Nothing   , highWColor = Nothing+  , onLowAction = Nothing+  , actionThreshold = 6   , lowThreshold = 10   , highThreshold = 12   , onlineFile = "AC/online"@@ -74,6 +80,9 @@   , Option "H" ["hight"] (ReqArg (\x o -> o { highThreshold = read x }) "") ""   , Option "f" ["online"] (ReqArg (\x o -> o { onlineFile = x }) "") ""   , Option "s" ["scale"] (ReqArg (\x o -> o {scale = read x}) "") ""+  , Option "a" ["action"] (ReqArg (\x o -> o { onLowAction = Just x }) "") ""+  , Option "A" ["action-threshold"]+               (ReqArg (\x o -> o { actionThreshold = read x }) "") ""   , Option "" ["on-icon-pattern"] (ReqArg (\x o ->      o { onIconPattern = Just $ parseIconPattern x }) "") ""   , Option "" ["off-icon-pattern"] (ReqArg (\x o ->@@ -172,6 +181,13 @@ mostCommonDef :: Eq a => a -> [a] -> a mostCommonDef x xs = head $ last $ [x] : sortOn length (group xs) +maybeAlert :: BattOpts -> Float -> IO ()+maybeAlert opts left =+  case onLowAction opts of+    Nothing -> return ()+    Just x -> unless (isNaN left || actionThreshold opts < 100 * left)+                $ void $ system x+ readBatteries :: BattOpts -> [Files] -> IO Result readBatteries opts bfs =     do let bfs' = filter (/= NoFiles) bfs@@ -192,6 +208,7 @@                  | time == 0 = Idle                  | ac = Charging                  | otherwise = Discharging+       unless ac (maybeAlert opts left)        return $ if isNaN left then NA else Result left watts time racst  runBatt :: [String] -> Monitor String@@ -209,7 +226,8 @@       do l <- fmtPercent x          ws <- fmtWatts w opts suffix d          si <- getIconPattern opts s x-         parseTemplate (l ++ [fmtStatus opts s nas, fmtTime $ floor t, ws, si])+         st <- showWithColors' (fmtStatus opts s nas) (100 * x)+         parseTemplate (l ++ [st, fmtTime $ floor t, ws, si])     NA -> getConfigValue naString   where fmtPercent :: Float -> Monitor [String]         fmtPercent x = do
src/Xmobar/Plugins/Monitors/Disk.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module      :  Plugins.Monitors.Disk--- Copyright   :  (c) 2010, 2011, 2012, 2014, 2018 Jose A Ortega Ruiz+-- Copyright   :  (c) 2010, 2011, 2012, 2014, 2018, 2019 Jose A Ortega Ruiz -- License     :  BSD-style (see LICENSE) -- -- Maintainer  :  Jose A Ortega Ruiz <jao@gnu.org>@@ -54,9 +54,13 @@  diskIOConfig :: IO MConfig diskIOConfig = mkMConfig "" ["total", "read", "write"+                            ,"totalb", "readb", "writeb"                             ,"totalbar", "readbar", "writebar"+                            ,"totalbbar", "readbbar", "writebbar"                             ,"totalvbar", "readvbar", "writevbar"+                            ,"totalbvbar", "readbvbar", "writebvbar"                             ,"totalipat", "readipat", "writeipat"+                            ,"totalbipat", "readbipat", "writebipat"                             ]  data DiskUOpts = DiskUOpts@@ -148,11 +152,16 @@   case find ((==dev) . fst) dat of     Nothing -> (dev, [0, 0, 0])     Just (_, xs) ->-      let rSp = speed (xs !! 2) (xs !! 3)-          wSp = speed (xs !! 6) (xs !! 7)-          sp =  speed (xs !! 2 + xs !! 6) (xs !! 3 + xs !! 7)-          speed x t = if t == 0 then 0 else 500 * x / t-          dat' = if length xs > 6 then [sp, rSp, wSp] else [0, 0, 0]+      let r = xs !! 2+          w = xs !! 6+          t = r + w+          rSp = speed r (xs !! 3)+          wSp = speed w (xs !! 7)+          sp =  speed t (xs !! 3 + xs !! 7)+          speed x d = if d == 0 then 0 else 500 * x / d+          dat' = if length xs > 6+                 then [sp, rSp, wSp, t, r, w]+                 else [0, 0, 0, 0, 0, 0]       in (dev, dat')  speedToStr :: Float -> String@@ -184,7 +193,9 @@   b <- mapM (showLogBar 0.8) xs   vb <- mapM (showLogVBar 0.8) xs   ipat <- mapM (\(f,v) -> showLogIconPattern (f opts) 0.8 v)-        $ zip [totalIconPattern, readIconPattern, writeIconPattern] xs+        $ zip [totalIconPattern, readIconPattern, writeIconPattern+              , totalIconPattern, readIconPattern, writeIconPattern]+              xs   setConfigValue tmp template   parseTemplate $ s ++ b ++ vb ++ ipat 
src/Xmobar/Plugins/Monitors/Mpris.hs view
@@ -85,7 +85,7 @@ runMPRIS :: (MprisVersion a) => a -> String -> [String] -> Monitor String runMPRIS version playerName _ = do     metadata <- io $ getMetadata version dbusClient playerName-    if [] == metadata then+    if null metadata then       getConfigValue naString       else mapM showWithPadding (makeList version metadata) >>= parseTemplate 
+ src/Xmobar/Plugins/Monitors/MultiCoreTemp.hs view
@@ -0,0 +1,165 @@+-----------------------------------------------------------------------------+-- |+-- Module      :  Plugins.Monitors.MultiCoreTemp+-- Copyright   :  (c) 2019 Felix Springer+-- License     :  BSD-style (see LICENSE)+--+-- Maintainer  :  Felix Springer <felixspringer149@gmail.com>+-- Stability   :  unstable+-- Portability :  unportable+--+-- A core temperature monitor for Xmobar+--+-----------------------------------------------------------------------------++module Xmobar.Plugins.Monitors.MultiCoreTemp (startMultiCoreTemp) where++import Xmobar.Plugins.Monitors.Common+import Control.Monad (filterM)+import System.Console.GetOpt+import System.Directory ( doesDirectoryExist+                        , doesFileExist+                        )++-- | Declare Options.+data CTOpts = CTOpts { maxIconPattern :: Maybe IconPattern+                     , avgIconPattern :: Maybe IconPattern+                     , mintemp :: Float+                     , maxtemp :: Float+                     }++-- | Set default Options.+defaultOpts :: CTOpts+defaultOpts = CTOpts { maxIconPattern = Nothing+                     , avgIconPattern = Nothing+                     , mintemp = 0+                     , maxtemp = 100+                     }++-- | Apply configured Options.+options :: [OptDescr (CTOpts -> CTOpts)]+options = [ Option [] ["max-icon-pattern"]+              (ReqArg+                (\ arg opts -> opts { maxIconPattern = Just $ parseIconPattern arg })+                "")+              ""+          , Option [] ["avg-icon-pattern"]+              (ReqArg+                (\ arg opts -> opts { avgIconPattern = Just $ parseIconPattern arg })+                "")+              ""+          , Option [] ["mintemp"]+              (ReqArg+                (\ arg opts -> opts { mintemp = read arg })+                "")+              ""+          , Option [] ["maxtemp"]+              (ReqArg+                (\ arg opts -> opts { maxtemp = read arg })+                "")+              ""+          ]++-- | Parse Arguments and apply them to Options.+parseOpts :: [String] -> IO CTOpts+parseOpts argv = case getOpt Permute options argv of+                   (opts , _ , []  ) -> return $ foldr id defaultOpts opts+                   (_    , _ , errs) -> ioError . userError $ concat errs++-- | Generate Config with a default template and options.+cTConfig :: IO MConfig+cTConfig = mkMConfig cTTemplate cTOptions+  where cTTemplate = "Temp: <max>°C - <maxpc>%"+        cTOptions = [ "max" , "maxpc" , "maxbar" , "maxvbar" , "maxipat"+                    , "avg" , "avgpc" , "avgbar" , "avgvbar" , "avgipat"+                    ] ++ map (("core" ++) . show) [0 :: Int ..]++-- | Returns the first coretemp.N path found.+coretempPath :: IO String+coretempPath = do xs <- filterM doesDirectoryExist ps+                  let x = head xs+                  return x+  where ps = [ "/sys/bus/platform/devices/coretemp." ++ show (x :: Int) ++ "/" | x <- [0..9] ]++-- | Returns the first hwmonN path found.+hwmonPath :: IO String+hwmonPath = do p <- coretempPath+               xs <- filterM doesDirectoryExist [ p ++ "hwmon/hwmon" ++ show (x :: Int) ++ "/" | x <- [0..9] ]+               let x = head xs+               return x++-- | Checks Labels, if they refer to a core and returns Strings of core-+-- temperatures.+corePaths :: IO [String]+corePaths = do p <- hwmonPath+               ls <- filterM doesFileExist [ p ++ "temp" ++ show (x :: Int) ++ "_label" | x <- [0..9] ]+               cls <- filterM isLabelFromCore ls+               return $ map labelToCore cls++-- | Checks if Label refers to a core.+isLabelFromCore :: FilePath -> IO Bool+isLabelFromCore p = do a <- readFile p+                       return $ take 4 a == "Core"++-- | Transform a path to Label to a path to core-temperature.+labelToCore :: FilePath -> FilePath+labelToCore = (++ "input") . reverse . drop 5 . reverse++-- | Reads core-temperatures as data from the system.+cTData :: IO [Float]+cTData = do fps <- corePaths+            traverse readSingleFile fps+  where readSingleFile :: FilePath -> IO Float+        readSingleFile s = do a <- readFile s+                              return $ parseContent a+          where parseContent :: String -> Float+                parseContent = read . head . lines++-- | Transforms data of temperatures into temperatures of degree Celsius.+parseCT :: IO [Float]+parseCT = do rawCTs <- cTData+             let normalizedCTs = map (/ 1000) rawCTs :: [Float]+             return normalizedCTs++-- | Performs calculation for maximum and average.+-- Sets up Bars and Values to be printed.+formatCT :: CTOpts -> [Float] -> Monitor [String]+formatCT opts cTs = do let CTOpts { mintemp = minT+                                  , maxtemp = maxT } = opts+                           domainT = maxT - minT+                           maxCT = maximum cTs+                           avgCT = sum cTs / fromIntegral (length cTs)+                           calcPc t = (t - minT) / domainT+                           maxCTPc = calcPc maxCT+                           avgCTPc = calcPc avgCT++                       cs <- traverse showTempWithColors cTs++                       m <- showTempWithColors maxCT+                       mp <- showWithColors' (show (round (100*maxCTPc) :: Int)) maxCT+                       mb <- showPercentBar maxCT maxCTPc+                       mv <- showVerticalBar maxCT maxCTPc+                       mi <- showIconPattern (maxIconPattern opts) maxCTPc++                       a <- showTempWithColors avgCT+                       ap <- showWithColors' (show (round (100*avgCTPc) :: Int)) avgCT+                       ab <- showPercentBar avgCT avgCTPc+                       av <- showVerticalBar avgCT avgCTPc+                       ai <- showIconPattern (avgIconPattern opts) avgCTPc++                       let ms = [ m , mp , mb , mv , mi ]+                           as = [ a , ap , ab , av , ai ]++                       return (ms ++ as ++ cs)+  where showTempWithColors :: Float -> Monitor String+        showTempWithColors = showWithColors (show . (round :: Float -> Int))+++runCT :: [String] -> Monitor String+runCT argv = do cTs <- io parseCT+                opts <- io $ parseOpts argv+                l <- formatCT opts cTs+                parseTemplate l++startMultiCoreTemp :: [String] -> Int -> (String -> IO ()) -> IO ()+startMultiCoreTemp a = runM a cTConfig runCT
src/Xmobar/Plugins/Monitors/Weather.hs view
@@ -23,6 +23,7 @@ import Network.HTTP.Types.Status import Network.HTTP.Types.Method import qualified Data.ByteString.Lazy.Char8 as B+import Data.Char (toLower)  import Text.ParserCombinators.Parsec @@ -43,6 +44,7 @@        , "windMs"        , "visibility"        , "skyCondition"+       , "skyConditionS"        , "tempC"        , "tempF"        , "dewPointC"@@ -194,18 +196,28 @@     where errHandler :: CE.SomeException -> IO String           errHandler _ = return "<Could not retrieve data>" -formatWeather :: [WeatherInfo] -> Monitor String-formatWeather [WI st ss y m d h (WindInfo wc wa wm wk wkh wms) v sk tC tF dC dF r p] =+formatSk :: Eq p => [(p, p)] -> p -> p+formatSk ((a,b):sks) sk = if a == sk then b else formatSk sks sk+formatSk [] sk = sk++formatWeather :: [(String,String)] -> [WeatherInfo] -> Monitor String+formatWeather sks [WI st ss y m d h (WindInfo wc wa wm wk wkh wms) v sk tC tF dC dF r p] =     do cel <- showWithColors show tC        far <- showWithColors show tF-       parseTemplate [st, ss, y, m, d, h, wc, wa, wm, wk, wkh, wms, v, sk, cel, far, show dC, show dF, show r , show p ]-formatWeather _ = getConfigValue naString+       let sk' = formatSk sks (map toLower sk)+       parseTemplate [st, ss, y, m, d, h, wc, wa, wm, wk, wkh+                     , wms, v, sk, sk', cel, far+                     , show dC, show dF, show r , show p ]+formatWeather _ _ = getConfigValue naString  runWeather :: [String] -> Monitor String-runWeather str =-    do d <- io $ getData $ head str+runWeather = runWeather' []++runWeather' :: [(String, String)] -> [String] -> Monitor String+runWeather' sks args =+    do d <- io $ getData $ head args        i <- io $ runP parseData d-       formatWeather i+       formatWeather sks i  weatherReady :: [String] -> Monitor Bool weatherReady str = do
src/Xmobar/X11/Parsers.hs view
@@ -55,7 +55,7 @@                 -> Parser [[(Widget, ColorString, FontIndex, Maybe [Action])]] stringParser c f a = manyTill (allParsers c f a) eof --- | Parses a maximal string without color markup.+-- | Parses a maximal string without markup. textParser :: String -> FontIndex -> Maybe [Action]               -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] textParser c f a = do s <- many1 $
xmobar.cabal view
@@ -1,5 +1,5 @@ name:               xmobar-version:            0.29.5+version:            0.30 homepage:           http://xmobar.org synopsis:           A Minimalistic Text Based Status Bar description: 	    Xmobar is a minimalistic text based status bar.@@ -143,6 +143,7 @@                    Xmobar.Plugins.Monitors.Cpu,                    Xmobar.Plugins.Monitors.Disk,                    Xmobar.Plugins.Monitors.Mem,+                   Xmobar.Plugins.Monitors.MultiCoreTemp,                    Xmobar.Plugins.Monitors.MultiCpu,                    Xmobar.Plugins.Monitors.Net,                    Xmobar.Plugins.Monitors.Swap,