xmobar 0.23.1 → 0.24
raw patch · 20 files changed
+517/−132 lines, 20 filesdep +http-conduitdep +http-typesdep ~alsa-mixer
Dependencies added: http-conduit, http-types
Dependency ranges changed: alsa-mixer
Files
- news.md +37/−0
- readme.md +55/−22
- samples/xmobar.config +2/−2
- src/Environment.hs +48/−0
- src/Main.hs +11/−0
- src/Plugins/BufferedPipeReader.hs +3/−1
- src/Plugins/Kbd.hsc +9/−9
- src/Plugins/MarqueePipeReader.hs +2/−1
- src/Plugins/Monitors.hs +12/−0
- src/Plugins/Monitors/Batt.hs +34/−18
- src/Plugins/Monitors/Common.hs +31/−23
- src/Plugins/Monitors/MPD.hs +3/−3
- src/Plugins/Monitors/Mpris.hs +13/−8
- src/Plugins/Monitors/UVMeter.hs +150/−0
- src/Plugins/Monitors/Volume.hs +7/−5
- src/Plugins/Monitors/Weather.hs +65/−29
- src/Plugins/PipeReader.hs +3/−2
- src/XUtil.hsc +10/−4
- src/Xmobar.hs +1/−1
- xmobar.cabal +21/−4
news.md view
@@ -1,5 +1,42 @@ % xmobar - Release notes +## Version 0.24++_New features_++ - Use the new compilation flag `with_conduit` to compile an+ implemetation of the `Weather` plugin that will work behind+ proxies, by Dragos Boca.+ - New command line argument (`-p`) to specify xmobar's position, by+ Valentin Shirokov.+ - Wind speed in Km/h and m/s for the `Weather` plugin, by Michael+ Knabe.+ - `UVMeter`, a new optional plugin showing UV data for Australian+ users, by Roman Joost.+ - New template parameter `<date>` for the `MPD` plugin (by Bruno+ Heridet)+ - New monitor argument `-T` to specify the maximum total width of+ the monitor text.+ - New $VAR parameter syntax for using env vars in pipe monitors, by+ Will Song (see [issue #268]).++_Bug fixes_++ - The `Volume` plugin now supports capture devices (Antoine Eiche).+ - The `MPD` plugin will now automatically update on options changes+ (Ben Boeckel).+ - The `Battery` plugin does now a better job at tracking AC status+ and times (see [issue #231]).+ - `PipeReader` was polling too often (thanks to zlbruce).+ - The `MPris` monitor now honours field width and padding optons+ (-M, -w, etc.).+ - `Batt`: sensible thresholds for high/low power consumption (see+ [issue #265]).++[issue #231]: https://github.com/jaor/xmobar/issues/225+[issue #265]: https://github.com/jaor/xmobar/issues/225+[issue #268]: https://github.com/jaor/xmobar/issues/268+ ## Version 0.23.1 (Apr 14, 2015) _Bug fixes_
readme.md view
@@ -10,7 +10,7 @@ features, like dynamic color management, icons, output templates, and extensibility through plugins. -This page documents xmobar 0.23.1 (see [release notes]).+This page documents xmobar 0.24 (see [release notes]). [This screenshot] shows xmobar running under [sawfish], with antialiased fonts. And [this one] is my desktop with [xmonad] and two@@ -57,7 +57,7 @@ - From [Github]. You can also obtain a tarball in [Github's downloads page]. You'll find there links to each tagged release. - From the bleeding edge repo. If you prefer to live dangerously,- just get the latest and greatest (and buggiest, i guess) using+ just get the latest and greatest (and buggiest, I guess) using git: git clone git://github.com/jaor/xmobar@@ -157,6 +157,13 @@ : Support for xpm image file format. This will allow loading .xpm files in `<icon>`. Requires the [libXpm] C library. +`with_uvmeter`+: Enables UVMeter plugin. The plugin shows UV data for Australia.++`with_conduit`+: Use http-conduit for getting weather data enabling support for http proxies.+ Requires [http-conduit] and [http-types].+ `all_extensions` : Enables all the extensions above. @@ -180,7 +187,7 @@ - After receiving SIGUSR1 xmobar moves its position to the next screen. -- After receiving SIGUSR2 xmobar repositions it self on the current screen.+- After receiving SIGUSR2 xmobar repositions itself on the current screen. # Configuration @@ -387,6 +394,7 @@ -A alpha --alpha=alpha The transparency: 0 is transparent, 255 (the default) is opaque -o --top Place xmobar at the top of the screen -b --bottom Place xmobar at the bottom of the screen+ -p --position=position Specify position, same as in config file -d --dock Try to start xmobar as a dock -a alignsep --alignsep=alignsep Separators for left, center and right text alignment. Default: '}{'@@ -579,7 +587,7 @@ ### Icon patterns Some monitors allow usage of strings that depend on some integer value-from 0 to 8 by replacing all occurences of `"%%"` with it+from 0 to 8 by replacing all occurrences of `"%%"` with it (i.e. `"<icon=/path/to/icon_%%.xpm/>"` will be interpreted as `"<icon=/path/to/icon_3.xpm/>"` when the value is `3`, also `"%"` is interpreted as `"%"`, `"%%"` as `"3"`, `"%%%"` as `"3%"`, `"%%%%"` as `"33"` and so on). Essentially@@ -674,6 +682,10 @@ needed. - Long option: `--width` - Default: 0 (variable width)+- `-T` _number_ Maximum total width+ - Maximum total width of the text.+ - Long option: `--maxtwidth`+ - Default: 0 (no limit) - `-c` _string_ - Characters used for padding. The characters of _string_ are used cyclically. E.g., with `-P +- -w 6`, a field with value "foo"@@ -735,7 +747,7 @@ - Args: default monitor arguments - Variables that can be used with the `-t`/`--template` argument: `station`, `stationState`, `year`, `month`, `day`, `hour`,- `windCardinal`, `windAzimuth`, `windMph`, `windKnots`,+ `windCardinal`, `windAzimuth`, `windMph`, `windKnots`, `windMs`, `windKmh` `visibility`, `skyCondition`, `tempC`, `tempF`, `dewPointC`, `dewPointF`, `rh`, `pressure` - Default template: `<station>: <tempC>C, rh <rh>% (<hour>)`@@ -854,8 +866,8 @@ - `-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)+ - `-L`: low power (`watts`) threshold (default: 10)+ - `-H`: high power threshold (default: 12) - `-l`: color to display power lower than the `-L` threshold - `-m`: color to display power lower than the `-H` threshold - `-h`: color to display power higher than the `-H` threshold@@ -1089,7 +1101,7 @@ `plength` (playlist length), `ppos` (playlist position), `flags` (ncmpcpp-style playback mode), `name`, `artist`, `composer`, `performer`,- `album`, `title`, `track`, `file`, `genre`+ `album`, `title`, `track`, `file`, `genre`, `date` - Default template: `MPD: <state>` - Example (note that you need "--" to separate regular monitor options from MPD's specific ones):@@ -1243,6 +1255,20 @@ Run CatInt 0 "/sys/devices/platform/thinkpad_hwmon/fan1_input" [] 50 +### `UVMeter`++- Aliases to "uv " + station id. For example: `%uv brisbane%` or `%uv+ alice springs%`+- Args: default monitor arguments.++- *Reminder:* Keep the refresh rate high, to avoid making unnecessary+ requests every time the plug-in is run.+- Station IDs can be found here:+ http://www.arpansa.gov.au/uvindex/realtime/xml/uvvalues.xml+- Example:++ Run UVMeter "brisbane" ["-H", "3", "-L", "3", "--low", "green", "--high", "red"] 900+ ## Executing External Commands In order to execute an external command you can either write the@@ -1322,6 +1348,7 @@ - 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> @@ -1331,6 +1358,8 @@ 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>@@ -1360,6 +1389,7 @@ `"/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 @@ -1517,19 +1547,20 @@ version 0.11.1. Since then, it is maintained and developed by [jao], with the help of the greater xmobar and Haskell communities. -In particular, xmobar [incorporates patches] by Axel Angel, Ben-Boeckel, Duncan Burke, Roman Cheplyaka, Patrick Chilton, Nathaniel-Wesley Filardo, John Goerzen, Reto Hablützel, Juraj Hercek, Tomas-Janousek, Spencer Janssen, Jochen Keil, Lennart Kolmodin, Krzysztof-Kosciuszkiewicz, Dmitry Kurochkin, Todd Lunter, Robert J. Macomber,-Dmitry Malikov, David McLean, Marcin Mikołajczyk, Dino Morelli, Tony-Morris, Eric Mrak, Thiago Negri, Edward O'Callaghan, Svein Ove, Martin-Perner, Jens Petersen, Alexander Polakov, Petr Rockai, Andrew-Sackville-West, Markus Scherer, Alexander Shabalin, Peter Simons,-Alexander Solovyov, John Soros, Travis Staton, Artem Tarasov, Samuli-Thomasson, Edward Tjörnhammar, Sergei Trofimovich, Thomas Tuegel, Jan-Vornberger, Anton Vorontsov, Daniel Wagner, Phil Xiaojun Hu, Edward-Z. Yang and Norbert Zeh.+In particular, xmobar [incorporates patches] by Axel Angel, Dragos+Boca, Ben Boeckel, Duncan Burke, Roman Cheplyaka, Patrick Chilton,+Antoine Eiche, Nathaniel Wesley Filardo, John Goerzen, Reto Hablützel,+Juraj Hercek, Tomas Janousek, Spencer Janssen, Roman Joost, Jochen+Keil, Lennart Kolmodin, Krzysztof Kosciuszkiewicz, Dmitry Kurochkin,+Todd Lunter, Robert J. Macomber, Dmitry Malikov, David McLean, Marcin+Mikołajczyk, Dino Morelli, Tony Morris, Eric Mrak, Thiago Negri,+Edward O'Callaghan, Svein Ove, Martin Perner, Jens Petersen, Alexander+Polakov, Petr Rockai, Andrew Sackville-West, Markus Scherer, 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, Phil Xiaojun Hu, Edward Z. Yang and+Norbert Zeh. [jao]: http://jao.io [incorporates patches]: http://www.ohloh.net/p/xmobar/contributors@@ -1578,7 +1609,7 @@ [Github]: http://github.com/jaor/xmobar/ [Github page]: http://github.com/jaor/xmobar [Hackage]: http://hackage.haskell.org/package/xmobar/-[LICENSE]: https://github.com/jaor/xmobar/raw/master/LICENSE+[LICENSE]: https://github.com/jaor/xmobar/raw/master/license [Mailing list]: http://projects.haskell.org/cgi-bin/mailman/listinfo/xmobar [MPD]: http://mpd.wikia.com/ [X11-xft]: http://hackage.haskell.org/package/X11-xft/@@ -1597,3 +1628,5 @@ [timezone-olson]: http://hackage.haskell.org/package/timezone-olson [timezone-series]: http://hackage.haskell.org/package/timezone-series [libXpm]: http://cgit.freedesktop.org/xorg/lib/libXpm+[http-conduit]: http://hackage.haskell.org/package/http-conduit+[http-types]: http://hackage.haskell.org/package/http-types
samples/xmobar.config view
@@ -1,5 +1,5 @@ Config { font = "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"- , addtionalFonts = []+ , additionalFonts = [] , borderColor = "black" , border = TopB , bgColor = "black"@@ -29,7 +29,7 @@ , Run Memory ["-t","Mem: <usedratio>%"] 10 , Run Swap [] 10 , Run Com "uname" ["-s","-r"] "" 36000- , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10+ , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10 ] , sepChar = "%" , alignSep = "}{"
+ src/Environment.hs view
@@ -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
src/Main.hs view
@@ -38,6 +38,7 @@ import System.FilePath ((</>)) import System.Posix.Files import Control.Monad (unless, liftM)+import Text.Read (readMaybe) import Signal (setupSignalHandler) @@ -133,6 +134,7 @@ | Template String | OnScr String | IconRoot String+ | Position String deriving Show options :: [OptDescr Opts]@@ -166,6 +168,8 @@ "Add to the list of commands to be executed" , Option "x" ["screen"] (ReqArg OnScr "screen") "On which X screen number to start"+ , Option "p" ["position"] (ReqArg Position "position")+ "Specify position of xmobar. Same syntax as in config file" ] getOpts :: [String] -> IO ([Opts], [String])@@ -219,6 +223,7 @@ AddCommand s -> case readCom 'C' s of Right x -> doOpts' (conf {commands = commands conf ++ x}) Left e -> putStr (e ++ usage) >> exitWith (ExitFailure 1)+ Position s -> readPosition s where readCom c str = case readStr str of [x] -> Right x@@ -226,3 +231,9 @@ "specified with the -" ++ c:" option\n") readStr str = [x | (x,t) <- reads str, ("","") <- lex t] doOpts' opts = doOpts opts oo+ readPosition string = + case readMaybe string of+ Just x -> doOpts' (conf { position = x })+ Nothing -> do+ putStrLn "Can't parse position option, ignoring"+ doOpts' conf
src/Plugins/BufferedPipeReader.hs view
@@ -20,6 +20,7 @@ import System.IO import System.IO.Unsafe(unsafePerformIO) +import Environment import Plugins import Signal @@ -51,7 +52,8 @@ 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
src/Plugins/Kbd.hsc view
@@ -101,15 +101,15 @@ -- data XkbKeyNameRec = XkbKeyNameRec {- name :: Ptr CChar -- array+ name :: Ptr CChar -- array } -- -- the t_ before alias is just because of name collisions -- data XkbKeyAliasRec = XkbKeyAliasRec {- real :: Ptr CChar, -- array- t_alias :: Ptr CChar -- array+ real :: Ptr CChar, -- array+ t_alias :: Ptr CChar -- array } --@@ -146,7 +146,7 @@ server :: Ptr CChar, -- XkbServerMapPtr ; dont' care t_map :: Ptr CChar, --XkbClientMapPtr ; dont' care t_indicators :: Ptr CChar, -- XkbIndicatorPtr ; dont' care- names :: Ptr XkbNamesRec, -- array+ names :: Ptr XkbNamesRec, -- array t_compat :: Ptr CChar, -- XkbCompatMap ; dont' care geom :: Ptr CChar -- XkbGeometryPtr ; dont' care @@ -264,10 +264,10 @@ xkbFreeKeyboard :: (Ptr XkbDescRec) -> CUInt -> CInt -> IO () foreign import ccall unsafe "X11/XKBlib.h XkbSelectEventDetails"- xkbSelectEventDetails :: Display -> CUInt -> CUInt -> CULong -> CULong -> IO CUInt+ xkbSelectEventDetails :: Display -> CUInt -> CUInt -> CULong -> CULong -> IO CUInt foreign import ccall unsafe "X11/XKBlib.h XkbSelectEvents"- xkbSelectEvents :: Display -> CUInt -> CUInt -> CUInt -> IO CUInt+ xkbSelectEvents :: Display -> CUInt -> CUInt -> CUInt -> IO CUInt xkbUseCoreKbd :: CUInt@@ -371,11 +371,11 @@ data Kbd = Kbd [(String, String)]- deriving (Read, Show)+ deriving (Read, Show) instance Exec Kbd where- alias (Kbd _) = "kbd"- start (Kbd opts) cb = do+ alias (Kbd _) = "kbd"+ start (Kbd opts) cb = do dpy <- openDisplay ""
src/Plugins/MarqueePipeReader.hs view
@@ -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 @@ 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
src/Plugins/Monitors.hs view
@@ -36,6 +36,9 @@ import Plugins.Monitors.Top import Plugins.Monitors.Uptime import Plugins.Monitors.CatInt+#ifdef UVMETER+import Plugins.Monitors.UVMeter+#endif #ifdef IWLIB import Plugins.Monitors.Wireless #endif@@ -71,6 +74,9 @@ | TopMem Args Rate | Uptime Args Rate | CatInt Int FilePath Args Rate+#ifdef UVMETER+ | UVMeter Station Args Rate+#endif #ifdef IWLIB | Wireless Interface Args Rate #endif@@ -119,6 +125,9 @@ alias (DiskIO {}) = "diskio" alias (Uptime _ _) = "uptime" alias (CatInt n _ _ _) = "cat" ++ show n+#ifdef UVMETER+ alias (UVMeter s _ _) = "uv " ++ s+#endif #ifdef IWLIB alias (Wireless i _ _) = i ++ "wi" #endif@@ -155,6 +164,9 @@ start (DiskIO s a r) = startDiskIO s a r start (Uptime a r) = runM a uptimeConfig runUptime r start (CatInt _ s a r) = runM a catIntConfig (runCatInt s) r+#ifdef UVMETER+ start (UVMeter s a r) = runM (a ++ [s]) uvConfig runUVMeter r+#endif #ifdef IWLIB start (Wireless i a r) = runM a wirelessConfig (runWireless i) r #endif
src/Plugins/Monitors/Batt.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Batt--- Copyright : (c) 2010, 2011, 2012, 2013 Jose A Ortega+-- Copyright : (c) 2010, 2011, 2012, 2013, 2015, 2016 Jose A Ortega -- (c) 2010 Andrea Rossato, Petr Rockai -- License : BSD-style (see LICENSE) --@@ -21,6 +21,9 @@ import System.IO (IOMode(ReadMode), hGetLine, withFile) import System.Posix.Files (fileExist) import System.Console.GetOpt+import Data.List (sort, sortOn, group)+import Data.Maybe (fromMaybe)+import Text.Read (readMaybe) data BattOpts = BattOpts { onString :: String@@ -48,8 +51,8 @@ , lowWColor = Nothing , mediumWColor = Nothing , highWColor = Nothing- , lowThreshold = -12- , highThreshold = -10+ , lowThreshold = 10+ , highThreshold = 12 , onlineFile = "AC/online" , scale = 1e6 , onIconPattern = Nothing@@ -84,7 +87,7 @@ (o, _, []) -> return $ foldr id defaultOpts o (_, _, errs) -> ioError . userError $ concat errs -data Status = Charging | Discharging | Idle+data Status = Charging | Discharging | Full | Idle | Unknown deriving (Read, Eq) data Result = Result Float Float Float Status | NA @@ -101,6 +104,7 @@ , fNow :: String , fVoltage :: String , fCurrent :: String+ , fStatus :: String , isCurrent :: Bool } | NoFiles @@ -108,6 +112,7 @@ { full :: !Float , now :: !Float , power :: !Float+ , status :: !String } safeFileExist :: String -> String -> IO Bool@@ -132,6 +137,7 @@ , fNow = prefix </> ch ++ "_now" , fCurrent = prefix </> cf , fVoltage = prefix </> "voltage_now"+ , fStatus = prefix </> "status" , isCurrent = not ip} haveAc :: FilePath -> IO Bool@@ -140,17 +146,22 @@ where onError = const (return False) :: SomeException -> IO Bool readBattery :: Float -> Files -> IO Battery-readBattery _ NoFiles = return $ Battery 0 0 0+readBattery _ NoFiles = return $ Battery 0 0 0 "Idle" readBattery sc files = do a <- grab $ fFull files b <- grab $ fNow files d <- grab $ fCurrent files+ s <- grabs $ fStatus files let sc' = if isCurrent files then sc / 10 else sc- return $ Battery (3600 * a / sc') -- wattseconds+ a' = max a b -- sometimes the reported max charge is lower than+ return $ Battery (3600 * a' / sc') -- wattseconds (3600 * b / sc') -- wattseconds (d / sc') -- watts+ s -- string: Discharging/Charging/Full where grab f = handle onError $ withFile f ReadMode (fmap read . hGetLine) onError = const (return (-1)) :: SomeException -> IO Float+ grabs f = handle onError' $ withFile f ReadMode hGetLine+ onError' = const (return "Idle") :: SomeException -> IO String readBatteries :: BattOpts -> [Files] -> IO Result readBatteries opts bfs =@@ -160,13 +171,13 @@ ft = sum (map full bats) left = if ft > 0 then sum (map now bats) / ft else 0 watts = sign * sum (map power bats)- idle = watts == 0- time = if idle then 0 else sum $ map time' bats- mwatts = if idle then 1 else sign * watts+ time = if watts == 0 then 0 else max 0 (sum $ map time' bats)+ mwatts = if watts == 0 then 1 else sign * watts time' b = (if ac then full b - now b else now b) / mwatts- acst | idle = Idle- | ac = Charging- | otherwise = Discharging+ statuses :: [Status]+ statuses = map (fromMaybe Unknown . readMaybe)+ (sort (map status bats))+ acst = head $ last $ sortOn length (group statuses) return $ if isNaN left then NA else Result left watts time acst runBatt :: [String] -> Monitor String@@ -178,12 +189,13 @@ c <- io $ readBatteries opts =<< mapM batteryFiles bfs suffix <- getConfigValue useSuffix d <- getConfigValue decDigits+ nas <- getConfigValue naString case c of Result x w t s -> do l <- fmtPercent x ws <- fmtWatts w opts suffix d si <- getIconPattern opts s x- parseTemplate (l ++ [fmtStatus opts s, fmtTime $ floor t, ws, si])+ parseTemplate (l ++ [fmtStatus opts s nas, fmtTime $ floor t, ws, si]) NA -> getConfigValue naString where fmtPercent :: Float -> Monitor [String] fmtPercent x = do@@ -200,18 +212,22 @@ then minutes else '0' : minutes where hours = show (x `div` 3600) minutes = show ((x `mod` 3600) `div` 60)- fmtStatus opts Idle = idleString opts- fmtStatus opts Charging = onString opts- fmtStatus opts Discharging = offString opts+ fmtStatus opts Idle _ = idleString opts+ fmtStatus _ Unknown na = na+ fmtStatus opts Full _ = idleString opts+ fmtStatus opts Charging _ = onString opts+ fmtStatus opts Discharging _ = offString opts maybeColor Nothing str = str maybeColor (Just c) str = "<fc=" ++ c ++ ">" ++ str ++ "</fc>" color x o | x >= 0 = maybeColor (posColor o) | -x >= highThreshold o = maybeColor (highWColor o) | -x >= lowThreshold o = maybeColor (mediumWColor o) | otherwise = maybeColor (lowWColor o)- getIconPattern opts status x = do+ getIconPattern opts st x = do let x' = minimum [1, x]- case status of+ case st of+ Unknown -> showIconPattern (offIconPattern opts) x' Idle -> showIconPattern (idleIconPattern opts) x'+ Full -> showIconPattern (idleIconPattern opts) x' Charging -> showIconPattern (onIconPattern opts) x' Discharging -> showIconPattern (offIconPattern opts) x'
src/Plugins/Monitors/Common.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Common--- Copyright : (c) 2010, 2011, 2013 Jose Antonio Ortega Ruiz+-- Copyright : (c) 2010, 2011, 2013, 2016 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) --@@ -83,23 +83,24 @@ data MConfig = MC { normalColor :: IORef (Maybe String)- , low :: IORef Int- , lowColor :: IORef (Maybe String)- , high :: IORef Int- , highColor :: IORef (Maybe String)- , template :: IORef String- , export :: IORef [String]- , ppad :: IORef Int- , decDigits :: IORef Int- , minWidth :: IORef Int- , maxWidth :: IORef Int- , padChars :: IORef String- , padRight :: IORef Bool- , barBack :: IORef String- , barFore :: IORef String- , barWidth :: IORef Int- , useSuffix :: IORef Bool- , naString :: IORef String+ , low :: IORef Int+ , lowColor :: IORef (Maybe String)+ , high :: IORef Int+ , highColor :: IORef (Maybe String)+ , template :: IORef String+ , export :: IORef [String]+ , ppad :: IORef Int+ , decDigits :: IORef Int+ , minWidth :: IORef Int+ , maxWidth :: IORef Int+ , padChars :: IORef String+ , padRight :: IORef Bool+ , barBack :: IORef String+ , barFore :: IORef String+ , barWidth :: IORef Int+ , useSuffix :: IORef Bool+ , naString :: IORef String+ , maxTotalWidth :: IORef Int } -- | from 'http:\/\/www.haskell.org\/hawiki\/MonadState'@@ -144,7 +145,8 @@ bw <- newIORef 10 up <- newIORef False na <- newIORef "N/A"- return $ MC nc l lc h hc t e p d mn mx pc pr bb bf bw up na+ mt <- newIORef 0+ return $ MC nc l lc h hc t e p d mn mx pc pr bb bf bw up na mt data Opts = HighColor String | NormalColor String@@ -164,6 +166,7 @@ | BarWidth String | UseSuffix String | NAString String+ | MaxTotalWidth String options :: [OptDescr Opts] options =@@ -186,6 +189,7 @@ , Option "f" ["bfore"] (ReqArg BarFore "bar foreground") "Characters used to draw bar foregrounds" , Option "W" ["bwidth"] (ReqArg BarWidth "bar width") "Bar width" , Option "x" ["nastring"] (ReqArg NAString "N/A string") "String used when the monitor is not available"+ , Option "T" ["maxtwidth"] (ReqArg MaxTotalWidth "Maximum total width") "Maximum total width" ] doArgs :: [String] -> ([String] -> Monitor String) -> ([String] -> Monitor Bool) -> Monitor String@@ -223,7 +227,8 @@ BarFore s -> setConfigValue s barFore BarWidth w -> setConfigValue (nz w) barWidth UseSuffix u -> setConfigValue (bool u) useSuffix- NAString s -> setConfigValue s naString) >> next+ NAString s -> setConfigValue s naString+ MaxTotalWidth w -> setConfigValue (nz w) maxTotalWidth) >> next runM :: [String] -> IO MConfig -> ([String] -> Monitor String) -> Int -> (String -> IO ()) -> IO ()@@ -324,13 +329,16 @@ -- | Takes a list of strings that represent the values of the exported -- keys. The strings are joined with the exported keys to form a map -- to be combined with 'combine' to the parsed template. Returns the--- final output of the monitor.+-- final output of the monitor, trimmed to MaxTotalWidth if that+-- configuration value is positive. parseTemplate :: [String] -> Monitor String parseTemplate l = do t <- getConfigValue template e <- getConfigValue export+ w <- getConfigValue maxTotalWidth let m = Map.fromList . zip e $ l- parseTemplate' t m+ s <- parseTemplate' t m+ return $ if w > 0 && length s > w then take w s else s -- | Parses the template given to it with a map of export values and combines -- them@@ -488,7 +496,7 @@ where t = 9600 + (round val `div` 12) showLogBar :: Float -> Float -> Monitor String-showLogBar f v = +showLogBar f v = let intConfig c = fromIntegral `fmap` getConfigValue c in do h <- intConfig high
src/Plugins/Monitors/MPD.hs view
@@ -26,7 +26,7 @@ [ "bar", "vbar", "ipat", "state", "statei", "volume", "length" , "lapsed", "remaining", "plength", "ppos", "flags", "file" , "name", "artist", "composer", "performer"- , "album", "title", "track", "genre"+ , "album", "title", "track", "genre", "date" ] data MOpts = MOpts@@ -63,7 +63,7 @@ mpdWait :: IO () mpdWait = do- status <- M.withMPD $ M.idle [M.PlayerS, M.MixerS]+ status <- M.withMPD $ M.idle [M.PlayerS, M.MixerS, M.OptionsS] case status of Left _ -> threadDelay 10000000 _ -> return ()@@ -126,7 +126,7 @@ parseSong (Right (Just s)) = let str sel = maybe "" (intercalate ", " . map M.toString) (M.sgGetTag sel s) sels = [ M.Name, M.Artist, M.Composer, M.Performer- , M.Album, M.Title, M.Track, M.Genre ]+ , M.Album, M.Title, M.Track, M.Genre, M.Date ] fields = M.toString (M.sgFilePath s) : map str sels in mapM showWithPadding fields
src/Plugins/Monitors/Mpris.hs view
@@ -84,7 +84,7 @@ runMPRIS :: (MprisVersion a) => a -> String -> [String] -> Monitor String runMPRIS version playerName _ = do metadata <- io $ getMetadata version dbusClient playerName- parseTemplate $ makeList version metadata+ mapM showWithPadding (makeList version metadata) >>= parseTemplate runMPRIS1 :: String -> [String] -> Monitor String runMPRIS1 = runMPRIS MprisVersion1@@ -99,12 +99,15 @@ unpackMetadata :: [Variant] -> [(String, Variant)] unpackMetadata [] = []-unpackMetadata xs = (map (fromVar *** fromVar) . unpack . head) xs where- unpack v = case variantType v of- TypeDictionary _ _ -> dictionaryItems $ fromVar v- TypeVariant -> unpack $ fromVar v- TypeStructure _ -> unpack $ head $ structureItems $ fromVar v- _ -> []+unpackMetadata xs =+ (map (fromVar *** fromVar) . unpack . head) xs where+ unpack v = case variantType v of+ TypeDictionary _ _ -> dictionaryItems $ fromVar v+ TypeVariant -> unpack $ fromVar v+ TypeStructure _ ->+ let x = structureItems (fromVar v) in+ if x == [] then [] else unpack (head x)+ _ -> [] getMetadata :: (MprisVersion a) => a -> DC.Client -> String -> IO [(String, Variant)] getMetadata version client player = do@@ -136,5 +139,7 @@ case str of "mpris:length" -> formatTime (num `div` 1000000) _ -> (show::Int64 -> String) num- TypeArray TypeString -> fromVar $ head $ arrayItems $ fromVar v+ TypeArray TypeString ->+ let x = arrayItems (fromVar v) in+ if x == [] then "" else fromVar (head x) _ -> ""
+ src/Plugins/Monitors/UVMeter.hs view
@@ -0,0 +1,150 @@+{-# LANGUAGE OverloadedStrings #-}+-----------------------------------------------------------------------------+-- |+-- Module : Plugins.Monitors.UVMeter+-- Copyright : (c) Róman Joost+-- License : BSD-style (see LICENSE)+--+-- Maintainer : Róman Joost+-- Stability : unstable+-- Portability : unportable+--+-- An australian uv monitor for Xmobar+--+-----------------------------------------------------------------------------++module Plugins.Monitors.UVMeter where++import Plugins.Monitors.Common++import qualified Control.Exception as CE+import Control.Applicative hiding ((<|>),many)+import Network.HTTP+import Text.Read (readMaybe)+import Text.Parsec+import Text.Parsec.String+++uvConfig :: IO MConfig+uvConfig = mkMConfig+ "<station>" -- template+ ["station" -- available replacements+ ]++data UvInfo = UV { index :: String }+ deriving (Show)++uvURL :: String+uvURL = "http://www.arpansa.gov.au/uvindex/realtime/xml/uvvalues.xml"++getData :: IO String+getData = do+ let request = getRequest uvURL+ CE.catch (simpleHTTP request >>= getResponseBody) errHandler+ where errHandler :: CE.IOException -> IO String+ errHandler _ = return "<Could not retrieve data>"++textToXMLDocument :: String -> Either ParseError [XML]+textToXMLDocument = parse document ""++formatUVRating :: Maybe Float -> Monitor String+formatUVRating Nothing = getConfigValue naString+formatUVRating (Just x) = do+ uv <- showWithColors show x+ parseTemplate [uv]++getUVRating :: String -> [XML] -> Maybe Float+getUVRating locID (Element "stations" _ y:_) = getUVRating locID y+getUVRating locID (Element "location" [Attribute attr] ys:xs)+ | locID == snd attr = getUVRating locID ys+ | otherwise = getUVRating locID xs+getUVRating _ (Element "index" [] [Body rate]:_) = readMaybe rate+getUVRating locID (_:xs) = getUVRating locID xs+getUVRating _ [] = Nothing+++runUVMeter :: [String] -> Monitor String+runUVMeter [] = return "N.A."+runUVMeter (s:_) = do+ resp <- io getData+ case textToXMLDocument resp of+ Right doc -> formatUVRating (getUVRating s doc)+ Left _ -> getConfigValue naString++-- | XML Parsing code comes here.+-- This is a very simple XML parser to just deal with the uvvalues.xml+-- provided by ARPANSA. If you work on a new plugin which needs an XML+-- parser perhaps consider using a real XML parser and refactor this+-- plug-in to us it as well.+--+-- Note: This parser can not deal with short tags.+--+-- Kudos to: Charlie Harvey for his article about writing an XML Parser+-- with Parsec.+--++type AttrName = String+type AttrValue = String++data Attribute = Attribute (AttrName, AttrValue)+ deriving (Show)++data XML = Element String [Attribute] [XML]+ | Decl String+ | Body String+ deriving (Show)++-- | parse the document+--+document :: Parser [XML]+document = do+ spaces+ y <- try xmlDecl <|> tag+ spaces+ x <- many tag+ spaces+ return (y : x)++-- | parse any tags+--+tag :: Parser XML+tag = do+ char '<'+ spaces+ name <- many (letter <|> digit)+ spaces+ attr <- many attribute+ spaces+ string ">"+ eBody <- many elementBody+ endTag name+ spaces+ return (Element name attr eBody)++xmlDecl :: Parser XML+xmlDecl = do+ string "<?xml"+ decl <- many (noneOf "?>")+ string "?>"+ return (Decl decl)++elementBody :: Parser XML+elementBody = spaces *> try tag <|> text++endTag :: String -> Parser String+endTag str = string "</" *> string str <* char '>'++text :: Parser XML+text = Body <$> many1 (noneOf "><")++attribute :: Parser Attribute+attribute = do+ name <- many (noneOf "= />")+ spaces+ char '='+ spaces+ char '"'+ value <- many (noneOf "\"")+ char '"'+ spaces+ return (Attribute (name, value))
src/Plugins/Monitors/Volume.hs view
@@ -15,7 +15,7 @@ module Plugins.Monitors.Volume (runVolume, volumeConfig) where import Control.Applicative ((<$>))-import Control.Monad ( join, liftM2, liftM3, mplus )+import Control.Monad ( liftM2, liftM3, mplus ) import Data.Traversable (sequenceA) import Plugins.Monitors.Common import Sound.ALSA.Mixer@@ -144,12 +144,14 @@ (const $ return (Nothing, Nothing, Nothing, Nothing, Nothing)) volumeControl :: Maybe Control -> Maybe Volume- volumeControl c = join $- (playback . volume <$> c) `mplus` (common . volume <$> c)+ volumeControl c = (playback . volume =<< c)+ `mplus` (capture . volume =<< c)+ `mplus` (common . volume =<< c) switchControl :: Maybe Control -> Maybe Switch- switchControl c = join $- (playback . switch <$> c) `mplus` (common . switch <$> c)+ switchControl c = (playback . switch =<< c)+ `mplus` (capture . switch =<< c)+ `mplus` (common . switch =<< c) liftMaybe :: Maybe (IO (a,b)) -> IO (Maybe a, Maybe b) liftMaybe = fmap (liftM2 (,) (fmap fst) (fmap snd)) . sequenceA
src/Plugins/Monitors/Weather.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Weather@@ -18,7 +19,14 @@ import qualified Control.Exception as CE +#ifdef HTTP_CONDUIT+import Network.HTTP.Conduit+import Network.HTTP.Types.Status+import Network.HTTP.Types.Method+import qualified Data.ByteString.Lazy.Char8 as B+#else import Network.HTTP+#endif import Text.ParserCombinators.Parsec @@ -35,6 +43,8 @@ , "windAzimuth" , "windMph" , "windKnots"+ , "windKmh"+ , "windMs" , "visibility" , "skyCondition" , "tempC"@@ -45,6 +55,16 @@ , "pressure" ] +data WindInfo =+ WindInfo {+ windCardinal :: String -- cardinal direction+ , windAzimuth :: String -- azimuth direction+ , windMph :: String -- speed (MPH)+ , windKnots :: String -- speed (knot)+ , windKmh :: String -- speed (km/h)+ , windMs :: String -- speed (m/s)+ } deriving (Show)+ data WeatherInfo = WI { stationPlace :: String , stationState :: String@@ -52,10 +72,7 @@ , month :: String , day :: String , hour :: String- , windCardinal :: String- , windAzimuth :: String- , windMph :: String- , windKnots :: String+ , windInfo :: WindInfo , visibility :: String , skyCondition :: String , tempC :: Int@@ -77,34 +94,26 @@ char ' ' return (y, m, d ,h:hh:":"++mi:mimi) --- Occasionally there is no wind and a METAR report gives simply, "Wind: Calm:0"-pWind0 ::- (- String -- cardinal direction- , String -- azimuth direction- , String -- speed (MPH)- , String -- speed (knot)- ) -pWind0 =- ("μ", "μ", "0", "0")+noWind :: WindInfo+noWind = WindInfo "μ" "μ" "0" "0" "0" "0" -pWind ::- Parser (- String -- cardinal direction- , String -- azimuth direction- , String -- speed (MPH)- , String -- speed (knot)- ) +pWind :: Parser WindInfo pWind = let tospace = manyTill anyChar (char ' ')+ toKmh knots = knots $* 1.852+ toMs knots = knots $* 0.514+ ($*) :: String -> Double -> String+ op1 $* op2 = show (round ((read op1::Double) * op2)::Integer)++ -- Occasionally there is no wind and a METAR report gives simply, "Wind: Calm:0" wind0 = do manyTill skipRestOfLine (string "Wind: Calm:0")- return pWind0+ return noWind windVar = do manyTill skipRestOfLine (string "Wind: Variable at ") mph <- tospace string "MPH (" knot <- tospace manyTill anyChar newline- return ("μ", "μ", mph, knot)+ return $ WindInfo "μ" "μ" mph knot (toKmh knot) (toMs knot) wind = do manyTill skipRestOfLine (string "Wind: from the ") cardinal <- tospace char '('@@ -114,8 +123,8 @@ string "MPH (" knot <- tospace manyTill anyChar newline- return (cardinal, azimuth, mph, knot)- in try wind0 <|> try windVar <|> wind+ return $ WindInfo cardinal azimuth mph knot (toKmh knot) (toMs knot)+ in try wind0 <|> try windVar <|> try wind <|> return noWind pTemp :: Parser (Int, Int) pTemp = do let num = digit <|> char '-' <|> char '.'@@ -159,7 +168,7 @@ ) skipRestOfLine >> getAllBut "/" (y,m,d,h) <- pTime- (wc, wa, wm, wk) <- pWind+ w <- pWind v <- getAfterString "Visibility: " sk <- getAfterString "Sky conditions: " skipTillString "Temperature: "@@ -171,7 +180,7 @@ skipTillString "Pressure (altimeter): " p <- pPressure manyTill skipRestOfLine eof- return [WI st ss y m d h wc wa wm wk v sk tC tF dC dF rh p]+ return [WI st ss y m d h w v sk tC tF dC dF rh p] defUrl :: String defUrl = "http://weather.noaa.gov/pub/data/observations/metar/decoded/"@@ -180,17 +189,28 @@ stationUrl station = defUrl ++ station ++ ".TXT" getData :: String -> IO String+#ifdef HTTP_CONDUIT+getData station = CE.catch (do+ manager <- newManager tlsManagerSettings + request <- parseUrl $ stationUrl station+ res <- httpLbs request manager+ return $ B.unpack $ responseBody res+ ) errHandler+ where errHandler :: CE.SomeException -> IO String+ errHandler _ = return "<Could not retrieve data>"+#else getData station = do let request = getRequest (stationUrl station) CE.catch (simpleHTTP request >>= getResponseBody) errHandler where errHandler :: CE.IOException -> IO String errHandler _ = return "<Could not retrieve data>"+#endif formatWeather :: [WeatherInfo] -> Monitor String-formatWeather [WI st ss y m d h wc wa wm wk v sk tC tF dC dF r p] =+formatWeather [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, v, sk, cel, far, show dC, show dF, show r , show p ]+ 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 runWeather :: [String] -> Monitor String@@ -200,7 +220,22 @@ formatWeather i weatherReady :: [String] -> Monitor Bool+#ifdef HTTP_CONDUIT weatherReady str = do+ initRequest <- parseUrl $ stationUrl $ head str+ let request = initRequest{method = methodHead}+ io $ CE.catch ( do+ manager <- newManager tlsManagerSettings+ res <- httpLbs request manager+ return $ checkResult $responseStatus res ) errHandler+ where errHandler :: CE.SomeException -> IO Bool+ errHandler _ = return False+ checkResult status+ | statusIsServerError status = False+ | statusIsClientError status = False+ | otherwise = True+#else+weatherReady str = do let station = head str request = headRequest (stationUrl station) io $ CE.catch (simpleHTTP request >>= checkResult) errHandler@@ -216,3 +251,4 @@ (4, _, _) -> return False (5, _, _) -> return False (_, _, _) -> return True+#endif
src/Plugins/PipeReader.hs view
@@ -16,6 +16,7 @@ import System.IO import Plugins+import Environment import System.Posix.Files import Control.Concurrent(threadDelay) import Control.Exception@@ -27,7 +28,7 @@ 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@@ -42,4 +43,4 @@ handle (\(SomeException _) -> waitForPipe) $ do status <- getFileStatus file unless (isNamedPipe status) waitForPipe- where waitForPipe = threadDelay 1000 >> checkPipe file+ where waitForPipe = threadDelay 1000000 >> checkPipe file
src/XUtil.hsc view
@@ -33,6 +33,7 @@ import Control.Monad (when) import Control.Monad.Trans import Control.Exception (SomeException, handle)+import Data.List import Foreign import Graphics.X11.Xlib hiding (textExtents, textWidth) import qualified Graphics.X11.Xlib as Xlib (textExtents, textWidth)@@ -49,7 +50,6 @@ # endif #endif #if defined XFT-import Data.List import MinXft import Graphics.X11.Xrender #endif@@ -81,12 +81,18 @@ -- to the Xft backend Example: 'xft:Sans-10' initFont :: Display ->String -> IO XFont initFont d s =-#ifdef XFT let xftPrefix = "xft:" in if xftPrefix `isPrefixOf` s then+#ifdef XFT fmap Xft $ initXftFont d s- else+#else+ do+ hPutStrLn stderr $ "Warning: Xmobar must be built with "+ ++ "the with_xft flag to support font '" ++ s+ ++ ".' Falling back on default."+ initFont d miscFixedFont #endif+ else #if defined UTF8 || __GLASGOW_HASKELL__ >= 612 fmap Utf8 $ initUtf8Font d s #else@@ -184,7 +190,7 @@ when (al == 255) $ do (a,d) <- textExtents fs s gi <- xftTxtExtents' dpy fonts s- drawXftRect draw bc' x (y - a + 1) (xglyphinfo_xOff gi) (a + d + 1)+ drawXftRect draw bc' x (y - a) (1 + xglyphinfo_xOff gi) (a + d + 2) drawXftString' draw fc' fonts (toInteger x) (toInteger y) s #endif
src/Xmobar.hs view
@@ -347,7 +347,7 @@ (fc,bc) = case break (==',') c of (f,',':b) -> (f, b ) (f, _) -> (f, bgColor conf)- valign <- verticalOffset ht s fontst conf+ valign <- verticalOffset ht s (head fontlist) conf case s of (Text t) -> io $ printString d dr fontst gc fc bc offset valign t alph (Icon p) -> io $ maybe (return ())
xmobar.cabal view
@@ -1,5 +1,5 @@ name: xmobar-version: 0.23.1+version: 0.24 homepage: http://xmobar.org synopsis: A Minimalistic Text Based Status Bar description: Xmobar is a minimalistic text based status bar.@@ -74,12 +74,21 @@ description: Use threaded runtime. default: False +flag with_uvmeter+ description: UVMeter only useful to australians.+ default: False++flag with_conduit+ description: Use http-conduits for getting weather data+ default: False+ executable xmobar hs-source-dirs: src main-is: Main.hs 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,@@ -93,9 +102,9 @@ Plugins.Monitors.Swap, Plugins.Monitors.Thermal, Plugins.Monitors.ThermalZone, Plugins.Monitors.Top, Plugins.Monitors.Uptime, Plugins.Monitors.Weather,- Plugins.Monitors.Bright, Plugins.Monitors.CatInt+ Plugins.Monitors.Bright, Plugins.Monitors.CatInt,+ Plugins.Monitors.UVMeter - ghc-prof-options: -prof -auto-all ghc-options: -funbox-strict-fields -Wall -fno-warn-unused-do-bind extra-libraries: Xrandr Xrender @@ -117,6 +126,11 @@ HTTP >= 4000.2.4, stm >= 2.3 && < 2.5 + if flag(with_conduit)+ -- use http-conduit instead of simple-http+ build-depends: http-conduit, http-types+ cpp-options: -DHTTP_CONDUIT+ if flag(with_threaded) -- -threaded is a workaround for 100% CPU busy loop -- (http://hackage.haskell.org/trac/ghc/ticket/4934).@@ -152,7 +166,7 @@ cpp-options: -DLIBMPD if flag(with_alsa) || flag(all_extensions)- build-depends: alsa-mixer == 0.2.*+ build-depends: alsa-mixer > 0.2.0.2 build-depends: alsa-core == 0.5.* other-modules: Plugins.Monitors.Volume cpp-options: -DALSA@@ -176,3 +190,6 @@ extra-libraries: Xpm other-modules: XPMFile cpp-options: -DXPM++ if flag(with_uvmeter)+ cpp-options: -DUVMETER