Hello community, here is the log from the commit of package xmobar for openSUSE:Factory checked in at 2020-06-19 17:22:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xmobar (Old) and /work/SRC/openSUSE:Factory/.xmobar.new.3606 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xmobar" Fri Jun 19 17:22:17 2020 rev:14 rq:815232 version:0.34 Changes: -------- --- /work/SRC/openSUSE:Factory/xmobar/xmobar.changes 2020-05-11 13:37:20.648613266 +0200 +++ /work/SRC/openSUSE:Factory/.xmobar.new.3606/xmobar.changes 2020-06-19 17:22:21.803713337 +0200 @@ -1,0 +2,22 @@ +Sun Jun 14 18:00:06 UTC 2020 - psim...@suse.com + +- Update xmobar to version 0.34. + ## Version 0.34 (June, 2020) + + _New features_ + + - New plugin `HandleReader` for reading data from a Haskell `Handle`. This is + useful if you are running xmobar from within a Haskell program. + - Build with ghc 8.10 allowed. + - Optimize date plugin by avoiding calling getTimeZone for each of + the time the date has to be updated. Instead, it's computed once + at the start and re-used for each invocation. + - Optimize Weather and UVMeter plugin by using global Manager instead of + creating for each http request when useManager is explicitly configured as False. + +------------------------------------------------------------------- +Fri May 29 07:06:33 UTC 2020 - Peter Trommler <ptromm...@icloud.com> + +- increase disk space on ppc64, ppc64le + +------------------------------------------------------------------- Old: ---- xmobar-0.33.tar.gz New: ---- _constraints xmobar-0.34.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xmobar.spec ++++++ --- /var/tmp/diff_new_pack.cqzb5b/_old 2020-06-19 17:22:22.375715002 +0200 +++ /var/tmp/diff_new_pack.cqzb5b/_new 2020-06-19 17:22:22.379715013 +0200 @@ -1,7 +1,7 @@ # # spec file for package xmobar # -# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %global pkg_name xmobar %bcond_with tests Name: %{pkg_name} -Version: 0.33 +Version: 0.34 Release: 0 Summary: A Minimalistic Text Based Status Bar License: BSD-3-Clause @@ -29,18 +29,23 @@ BuildRequires: ghc-Cabal-devel BuildRequires: ghc-X11-devel BuildRequires: ghc-X11-xft-devel +BuildRequires: ghc-alsa-core-devel +BuildRequires: ghc-alsa-mixer-devel BuildRequires: ghc-async-devel BuildRequires: ghc-bytestring-devel +BuildRequires: ghc-cereal-devel BuildRequires: ghc-containers-devel BuildRequires: ghc-dbus-devel BuildRequires: ghc-directory-devel BuildRequires: ghc-extensible-exceptions-devel BuildRequires: ghc-filepath-devel BuildRequires: ghc-hinotify-devel +BuildRequires: ghc-http-client-tls-devel BuildRequires: ghc-http-conduit-devel BuildRequires: ghc-http-types-devel -BuildRequires: ghc-iwlib-devel +BuildRequires: ghc-libmpd-devel BuildRequires: ghc-mtl-devel +BuildRequires: ghc-netlink-devel BuildRequires: ghc-old-locale-devel BuildRequires: ghc-parsec-devel BuildRequires: ghc-parsec-numbers-devel @@ -57,7 +62,6 @@ BuildRequires: libXpm-devel BuildRequires: libXrandr-devel BuildRequires: libXrender-devel -BuildRequires: libiw-devel %if %{with tests} BuildRequires: ghc-hspec-devel BuildRequires: ghc-temporary-devel @@ -82,7 +86,6 @@ Requires: libXpm-devel Requires: libXrandr-devel Requires: libXrender-devel -Requires: libiw-devel Requires(post): ghc-compiler = %{ghc_version} Requires(postun): ghc-compiler = %{ghc_version} @@ -91,10 +94,10 @@ %prep %setup -q -cabal-tweak-dep-ver base '< 4.14' '< 5' +cabal-tweak-dep-ver timezone-olson '== 0.1.*' '< 1' %build -%define cabal_configure_options -fwith_datezone -fwith_dbus -fwith_inotify -fwith_iwlib -fwith_mpris -fwith_thread -fwith_utf8 -fwith_xft -fwith_xpm +%define cabal_configure_options -fall_extensions %ghc_lib_build %install ++++++ _constraints ++++++ <constraints> <overwrite> <conditions> <arch>ppc64</arch> <arch>ppc64le</arch> </conditions> <hardware> <disk> <size unit="G">5</size> </disk> </hardware> </overwrite> </constraints> ++++++ xmobar-0.33.tar.gz -> xmobar-0.34.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/changelog.md new/xmobar-0.34/changelog.md --- old/xmobar-0.33/changelog.md 2020-02-26 21:09:39.000000000 +0100 +++ new/xmobar-0.34/changelog.md 2001-09-09 03:46:40.000000000 +0200 @@ -1,3 +1,16 @@ +## Version 0.34 (June, 2020) + +_New features_ + + - New plugin `HandleReader` for reading data from a Haskell `Handle`. This is + useful if you are running xmobar from within a Haskell program. + - Build with ghc 8.10 allowed. + - Optimize date plugin by avoiding calling getTimeZone for each of + the time the date has to be updated. Instead, it's computed once + at the start and re-used for each invocation. + - Optimize Weather and UVMeter plugin by using global Manager instead of + creating for each http request when useManager is explicitly configured as False. + ## Version 0.33 (February, 2020) _New features_ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/readme.md new/xmobar-0.34/readme.md --- old/xmobar-0.33/readme.md 2020-02-26 21:02:17.000000000 +0100 +++ new/xmobar-0.34/readme.md 2001-09-09 03:46:40.000000000 +0200 @@ -798,11 +798,14 @@ - Args: default monitor arguments, plus: - `--rx-icon-pattern`: dynamic string for reception rate in `rxipat`. - `--tx-icon-pattern`: dynamic string for transmission rate in `txipat`. + - `--up`: string used for the `up` variable value when the + interface is up. - Variables that can be used with the `-t`/`--template` argument: `dev`, `rx`, `tx`, `rxbar`, `rxvbar`, `rxipat`, `txbar`, `txvbar`, - `txipat`. Reception and transmission rates (`rx` and `tx`) are displayed - by default as Kb/s, without any suffixes, but you can set the `-S` to - "True" to make them displayed with adaptive units (Kb/s, Mb/s, etc.). + `txipat`, `up`. Reception and transmission rates (`rx` and `tx`) are + displayed by default as Kb/s, without any suffixes, but you can set + the `-S` to "True" to make them displayed with adaptive units (Kb/s, + Mb/s, etc.). - Default template: `<dev>: <rx>KB|<tx>KB` ### `DynNetwork Args RefreshRate` @@ -1147,7 +1150,7 @@ Run MultiCoreTemp ["-t", "Temp: <avg>°C | <avgpc>%", "-L", "60", "-H", "80", - "-l", "green", "-n", "yellow", "-h", "red" + "-l", "green", "-n", "yellow", "-h", "red", "--", "--mintemp", "20", "--maxtemp", "100"] 50 ### `Volume Mixer Element Args RefreshRate` @@ -1610,6 +1613,23 @@ logHook = dynamicLogString myPP >>= xmonadPropLog } +### `HandleReader Handle Alias` + +- Display data from a Haskell `Handle` +- This plugin is only useful if you are running xmobar from another Haskell + program like XMonad. +- You can use `System.Process.createPipe` to create a pair of `read` & `write` + Handles. Pass the `read` Handle to HandleReader and write your output to the + `write` Handle: + + (readHandle, writeHandle) <- createPipe + xmobarProcess <- forkProcess $ xmobar myConfig + { commands = + Run (HandleReader readHandle "handle") : commands myConfig + } + hPutStr writeHandle "Hello World" + + # Plugins ## Writing a Plugin @@ -1697,14 +1717,14 @@ Kurochkin, Todd Lunter, Vanessa McHale, 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, Pavan Rikhi, Petr Rockai, Andrew -Emmanuel Rosa, Sackville-West, Markus Scherer, Daniel Schüssler, -Olivier Schneider, Alexander Shabalin, Valentin Shirokov, Peter -Simons, Alexander Solovyov, Will Song, John Soros, Felix Springer, -Travis Staton, Artem Tarasov, Samuli Thomasson, Edward Tjörnhammar, -Sergei Trofimovich, Thomas Tuegel, John Tyree, Jan Vornberger, Anton -Vorontsov, Daniel Wagner, Zev Weiss, Phil Xiaojun Hu, Edward Z. Yang -and Norbert Zeh. +Jens Petersen, Alexander Polakov, Sibi Prabakaran, Pavan Rikhi, Petr +Rockai, Andrew Emmanuel Rosa, Sackville-West, Markus Scherer, Daniel +Schüssler, Olivier Schneider, Alexander Shabalin, Valentin Shirokov, +Peter Simons, Alexander Solovyov, Will Song, John Soros, Felix +Springer, Travis Staton, Artem Tarasov, Samuli Thomasson, Edward +Tjörnhammar, Sergei Trofimovich, Thomas Tuegel, John Tyree, 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 @@ -1741,7 +1761,7 @@ This software is released under a BSD-style license. See [LICENSE] for more details. -Copyright © 2010-2019 Jose Antonio Ortega Ruiz +Copyright © 2010-2020 Jose Antonio Ortega Ruiz Copyright © 2007-2010 Andrea Rossato diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/App/EventLoop.hs new/xmobar-0.34/src/Xmobar/App/EventLoop.hs --- old/xmobar-0.33/src/Xmobar/App/EventLoop.hs 2020-02-24 12:46:54.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/App/EventLoop.hs 2001-09-09 03:46:40.000000000 +0200 @@ -40,6 +40,7 @@ import Data.Bits import Data.Map hiding (foldr, map, filter) import Data.Maybe (fromJust, isJust) +import qualified Data.List.NonEmpty as NE import Xmobar.System.Signal import Xmobar.Config.Types @@ -52,6 +53,7 @@ import Xmobar.X11.Draw import Xmobar.X11.Bitmap as Bitmap import Xmobar.X11.Types +import Xmobar.System.Utils (safeIndex) #ifndef THREADED_RUNTIME import Xmobar.X11.Events(nextEvent') @@ -208,7 +210,7 @@ eventLoop tv xc as signal reposWindow rcfg = do - r' <- repositionWin d w (head fs) rcfg + r' <- repositionWin d w (NE.head fs) rcfg eventLoop tv (XConf d r' w fs vos is rcfg) as signal updateConfigPosition ocfg = @@ -262,7 +264,7 @@ strLn :: [(Widget, String, Int, Maybe [Action])] -> IO [(Maybe [Action], Position, Position)] strLn = liftIO . mapM getCoords iconW i = maybe 0 Bitmap.width (lookup i $ iconS conf) - getCoords (Text s,_,i,a) = textWidth d (fs!!i) s >>= \tw -> return (a, 0, fi tw) + getCoords (Text s,_,i,a) = textWidth d (safeIndex fs i) s >>= \tw -> return (a, 0, fi tw) getCoords (Icon s,_,_,a) = return (a, 0, fi $ iconW s) partCoord off xs = map (\(a, x, x') -> (fromJust a, x, x')) $ filter (\(a, _,_) -> isJust a) $ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/App/Main.hs new/xmobar-0.34/src/Xmobar/App/Main.hs --- old/xmobar-0.33/src/Xmobar/App/Main.hs 2020-02-24 12:46:54.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/App/Main.hs 2001-09-09 03:46:40.000000000 +0200 @@ -29,6 +29,7 @@ import System.FilePath import System.FilePath.Posix (takeBaseName, takeDirectory) import Text.Parsec.Error (ParseError) +import Data.List.NonEmpty (NonEmpty(..)) import Graphics.X11.Xlib @@ -63,7 +64,7 @@ let ic = Map.empty to = textOffset conf ts = textOffsets conf ++ replicate (length fl) (-1) - startLoop (XConf d r w (fs:fl) (to:ts) ic conf) sig refLock vars + startLoop (XConf d r w (fs :| fl) (to:ts) ic conf) sig refLock vars configFromArgs :: Config -> IO Config configFromArgs cfg = getArgs >>= getOpts >>= doOpts cfg . fst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/App/Opts.hs new/xmobar-0.34/src/Xmobar/App/Opts.hs --- old/xmobar-0.33/src/Xmobar/App/Opts.hs 2019-03-17 01:10:55.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/App/Opts.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,7 +1,7 @@ ------------------------------------------------------------------------------ -- | -- Module: Xmobar.App.Opts --- Copyright: (c) 2018, 2019 Jose Antonio Ortega Ruiz +-- Copyright: (c) 2018, 2019, 2020 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: j...@gnu.org @@ -104,9 +104,9 @@ info :: String info = "xmobar " ++ showVersion version - ++ "\n (C) 2007 - 2010 Andrea Rossato " - ++ "\n (C) 2010 - 2019 Jose A Ortega Ruiz\n " - ++ mail ++ "\n" ++ license + ++ "\n (C) 2010 - 2020 Jose A Ortega Ruiz" + ++ "\n (C) 2007 - 2010 Andrea Rossato\n " + ++ mail ++ "\n" ++ license ++ "\n" mail :: String mail = "<m...@jao.io>" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/BufferedPipeReader.hs new/xmobar-0.34/src/Xmobar/Plugins/BufferedPipeReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/BufferedPipeReader.hs 2018-12-08 04:31:03.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/BufferedPipeReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -23,7 +23,6 @@ import Xmobar.Run.Exec import Xmobar.System.Signal import Xmobar.System.Environment -import Xmobar.System.Utils(hGetLineSafe) data BufferedPipeReader = BufferedPipeReader String [(Int, Bool, String)] deriving (Read, Show) @@ -55,7 +54,7 @@ reader :: (Int, Bool, FilePath) -> TChan (Int, Bool, String) -> IO () reader p@(to, tg, fp) tc = do fp' <- expandEnv fp - openFile fp' ReadWriteMode >>= hGetLineSafe >>= \dt -> + openFile fp' ReadWriteMode >>= hGetLine >>= \dt -> atomically $ writeTChan tc (to, tg, dt) reader p tc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/CommandReader.hs new/xmobar-0.34/src/Xmobar/Plugins/CommandReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/CommandReader.hs 2018-12-02 06:34:23.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/CommandReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -17,7 +17,6 @@ import System.IO import Xmobar.Run.Exec -import Xmobar.System.Utils (hGetLineSafe) import System.Process(runInteractiveCommand, getProcessExitCode) data CommandReader = CommandReader String String @@ -31,7 +30,7 @@ hClose hstderr hSetBinaryMode hstdout False hSetBuffering hstdout LineBuffering - forever ph (hGetLineSafe hstdout >>= cb) + forever ph (hGetLine hstdout >>= cb) where forever ph a = do a ec <- getProcessExitCode ph diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Date.hs new/xmobar-0.34/src/Xmobar/Plugins/Date.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Date.hs 2018-12-02 06:34:34.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Date.hs 2001-09-09 03:46:40.000000000 +0200 @@ -31,8 +31,16 @@ instance Exec Date where alias (Date _ a _) = a - run (Date f _ _) = date f rate (Date _ _ r) = r + start (Date f _ r) cb = do + t <- getCurrentTime + zone <- getTimeZone t + go zone + where + go zone = doEveryTenthSeconds r $ date zone f >>= cb -date :: String -> IO String -date format = fmap (formatTime defaultTimeLocale format) getZonedTime +date :: TimeZone -> String -> IO String +date timezone format = do + time <- getCurrentTime + let zonedTime = utcToZonedTime timezone time + pure $ formatTime defaultTimeLocale format zonedTime diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/HandleReader.hs new/xmobar-0.34/src/Xmobar/Plugins/HandleReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/HandleReader.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/HandleReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -0,0 +1,70 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.HandleReader +-- Copyright : (c) Pavan Rikhi +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Pavan Rikhi <pavan.ri...@gmail.com> +-- Stability : unstable +-- Portability : portable +-- +-- A plugin for reading from 'Handle's +-- +----------------------------------------------------------------------------- + +module Xmobar.Plugins.HandleReader + ( HandleReader(..) + ) +where + +import System.IO ( Handle + , hIsEOF + , hGetLine + ) + +import Xmobar.Run.Exec ( Exec(..) ) + + +-- | A HandleReader displays any text received from a Handle. +-- +-- This is only useful if you are running @xmobar@ from other Haskell code. +-- You can create a pair of @(read, write)@ 'Handle's using +-- 'System.Process.createPipe'. Pass the @read@ 'Handle' to HandleReader +-- and write your desired output to the @write@ 'Handle'. +-- +-- @ +-- (readHandle, writeHandle) <- 'System.Process.createPipe' +-- xmobarProcess <- 'System.Posix.Process.forkProcess' $ 'Xmobar.xmobar' myConfig +-- { commands = +-- 'Xmobar.Run' ('HandleReader' readHandle "handle") : 'Xmobar.commands' myConfig +-- } +-- 'System.IO.hPutStr' writeHandle "Hello World" +-- @ +data HandleReader + = HandleReader + Handle + -- ^ The Handle to read from. + String + -- ^ Alias for the HandleReader + deriving (Show) + +-- | WARNING: This Read instance will throw an exception if used! It is +-- only implemented because it is required to use HandleReader with +-- 'Xmobar.Run' in 'Xmobar.commands'. +instance Read HandleReader where + -- | Throws an 'error'! + readsPrec = error "HandleReader: Read instance is stub" + +-- | Asynchronously read from the 'Handle'. +instance Exec HandleReader where + -- | Read from the 'Handle' until it is closed. + start (HandleReader handle _) cb = + untilM (hIsEOF handle) $ hGetLine handle >>= cb + -- | Use the 2nd argument to HandleReader as its alias. + alias (HandleReader _ a) = a + +-- Loop the action until predicateM returns True. +untilM :: Monad m => m Bool -> m () -> m () +untilM predicateM action = do + predicate <- predicateM + if predicate then return () else action >> untilM predicateM action diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/MarqueePipeReader.hs new/xmobar-0.34/src/Xmobar/Plugins/MarqueePipeReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/MarqueePipeReader.hs 2019-02-23 12:14:56.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/MarqueePipeReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -14,10 +14,9 @@ module Xmobar.Plugins.MarqueePipeReader(MarqueePipeReader(..)) where -import System.IO (openFile, IOMode(ReadWriteMode), Handle) +import System.IO (openFile, IOMode(ReadWriteMode), Handle, hGetLine) import Xmobar.System.Environment import Xmobar.Run.Exec(Exec(alias, start), tenthSeconds) -import Xmobar.System.Utils(hGetLineSafe) import System.Posix.Files (getFileStatus, isNamedPipe) import Control.Concurrent(forkIO, threadDelay) import Control.Concurrent.STM (TChan, atomically, writeTChan, tryReadTChan, newTChan) @@ -39,7 +38,7 @@ unless (null def) (cb def) checkPipe pipe h <- openFile pipe ReadWriteMode - line <- hGetLineSafe h + line <- hGetLine h chan <- atomically newTChan forkIO $ writer (toInfTxt line sep) sep len rate chan cb forever $ pipeToChan h chan @@ -50,7 +49,7 @@ pipeToChan :: Handle -> TChan String -> IO () pipeToChan h chan = do - line <- hGetLineSafe h + line <- hGetLine h atomically $ writeTChan chan line writer :: String -> Separator -> Length -> Rate -> TChan String -> (String -> IO ()) -> IO () diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/MPD.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/MPD.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/MPD.hs 2020-02-05 00:01:10.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/MPD.hs 2001-09-09 03:46:40.000000000 +0200 @@ -20,14 +20,17 @@ import System.Console.GetOpt import qualified Network.MPD as M import Control.Concurrent (threadDelay) +import Control.Monad.Except (catchError) + +templateVars :: [String] +templateVars = [ "bar", "vbar", "ipat", "state", "statei", "volume", "length" + , "lapsed", "remaining", "plength", "ppos", "flags", "file" + , "name", "artist", "composer", "performer" + , "album", "title", "track", "genre", "date" + ] mpdConfig :: IO MConfig -mpdConfig = mkMConfig "MPD: <state>" - [ "bar", "vbar", "ipat", "state", "statei", "volume", "length" - , "lapsed", "remaining", "plength", "ppos", "flags", "file" - , "name", "artist", "composer", "performer" - , "album", "title", "track", "genre", "date" - ] +mpdConfig = mkMConfig "MPD: <state>" templateVars data MOpts = MOpts { mPlaying :: String @@ -60,7 +63,8 @@ ] withMPD :: MOpts -> M.MPD a -> IO (M.Response a) -withMPD opts = M.withMPD_ (mHost opts) (mPort opts) +withMPD opts a = + M.withMPD_ (mHost opts) (mPort opts) a `catchError` (\_ -> return (Left M.NoMPD)) runMPD :: [String] -> Monitor String runMPD args = do @@ -74,7 +78,7 @@ mpdWait = do status <- M.withMPD $ M.idle [M.PlayerS, M.MixerS, M.OptionsS] case status of - Left _ -> threadDelay 10000000 + Left _ -> threadDelay 5000 _ -> return () mpdReady :: [String] -> Monitor Bool @@ -91,19 +95,21 @@ parseMPD :: M.Response M.Status -> M.Response (Maybe M.Song) -> MOpts -> Monitor [String] -parseMPD (Left e) _ _ = return $ show e:replicate 19 "" +parseMPD (Left _) _ _ = return $ "N/A": repeat "" parseMPD (Right st) song opts = do songData <- parseSong song bar <- showPercentBar (100 * b) b vbar <- showVerticalBar (100 * b) b ipat <- showIconPattern (mLapsedIconPattern opts) b - return $ [bar, vbar, ipat, ss, si, vol, len, lap, remain, plen, ppos, flags] ++ songData + return $ [bar, vbar, ipat, ss, si, vol, len, lap, remain, plen, ppos, flags] + ++ songData where s = M.stState st ss = show s si = stateGlyph s opts vol = int2str $ fromMaybe 0 (M.stVolume st) (p, t) = fromMaybe (0, 0) (M.stTime st) - [lap, len, remain] = map showTime [floor p, floor t, max 0 (floor t - floor p)] + [lap, len, remain] = map showTime + [floor p, floor t, max 0 (floor t - floor p)] b = if t > 0 then realToFrac $ p / t else 0 plen = int2str $ M.stPlaylistLength st ppos = maybe "" (int2str . (+1)) $ M.stSongPos st diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Net.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Net.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Net.hs 2020-02-04 23:54:48.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Net.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Net --- Copyright : (c) 2011, 2012, 2013, 2014, 2017 Jose Antonio Ortega Ruiz +-- Copyright : (c) 2011, 2012, 2013, 2014, 2017, 2020 Jose Antonio Ortega Ruiz -- (c) 2007-2010 Andrea Rossato -- License : BSD-style (see LICENSE) -- @@ -49,6 +49,7 @@ { rxIconPattern :: Maybe IconPattern , txIconPattern :: Maybe IconPattern , onlyDevList :: Maybe DevList + , upIndicator :: String } defaultOpts :: NetOpts @@ -56,6 +57,7 @@ { rxIconPattern = Nothing , txIconPattern = Nothing , onlyDevList = Nothing + , upIndicator = "+" } options :: [OptDescr (NetOpts -> NetOpts)] @@ -64,6 +66,7 @@ o { rxIconPattern = Just $ parseIconPattern x }) "") "" , Option "" ["tx-icon-pattern"] (ReqArg (\x o -> o { txIconPattern = Just $ parseIconPattern x }) "") "" + , Option "" ["up"] (ReqArg (\x o -> o { upIndicator = x }) "") "" , Option "" ["devices"] (ReqArg (\x o -> o { onlyDevList = Just $ parseDevList x }) "") "" ] @@ -103,7 +106,7 @@ netConfig :: IO MConfig netConfig = mkMConfig "<dev>: <rx>KB|<tx>KB" -- template - ["dev", "rx", "tx", "rxbar", "rxvbar", "rxipat", "txbar", "txvbar", "txipat"] -- available replacements + ["dev", "rx", "tx", "rxbar", "rxvbar", "rxipat", "txbar", "txvbar", "txipat", "up"] -- available replacements operstateDir :: String -> FilePath operstateDir d = "/sys/class/net" </> d </> "operstate" @@ -160,7 +163,7 @@ N d (ND r t) -> do (rx, rb, rvb, ripat) <- formatNet (rxIconPattern opts) r (tx, tb, tvb, tipat) <- formatNet (txIconPattern opts) t - parseTemplate [d,rx,tx,rb,rvb,ripat,tb,tvb,tipat] + parseTemplate [d,rx,tx,rb,rvb,ripat,tb,tvb,tipat, upIndicator opts] N _ NI -> return "" NA -> getConfigValue naString diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/UVMeter.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/UVMeter.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/UVMeter.hs 2020-02-05 15:55:33.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/UVMeter.hs 2001-09-09 03:46:40.000000000 +0200 @@ -21,14 +21,11 @@ import Network.HTTP.Conduit ( Manager , httpLbs - , managerConnCount - , newManager , parseRequest , responseBody - , tlsManagerSettings ) +import Network.HTTP.Client.TLS (getGlobalManager) import Data.ByteString.Lazy.Char8 as B -import Data.Maybe (fromMaybe) import System.Console.GetOpt (ArgDescr(ReqArg), OptDescr(Option)) import Text.Read (readMaybe) import Text.Parsec @@ -66,12 +63,9 @@ uvURL = "https://uvdata.arpansa.gov.au/xml/uvvalues.xml" -- | Get the UV data from the given url. -getData :: Maybe Manager -> IO String -getData uvMan = CE.catch - (do man <- flip fromMaybe uvMan <$> mkManager - -- Create a new manager if none was present or the user does not want to - -- use one, otherwise use the provided manager. - request <- parseRequest uvURL +getData ::Manager -> IO String +getData man = CE.catch + (do request <- parseRequest uvURL res <- httpLbs request man return $ B.unpack $ responseBody res) errHandler @@ -105,15 +99,13 @@ -> Int -- ^ Update rate -> (String -> IO ()) -> IO () -startUVMeter station args rate cb = do - opts <- parseOptsWith options defaultOpts (getArgvs args) - uvMan <- tryMakeManager opts - runM (station : args) uvConfig (runUVMeter uvMan) rate cb - -runUVMeter :: Maybe Manager -> [String] -> Monitor String -runUVMeter _ [] = return "N.A." -runUVMeter uvMan (s:_) = do - resp <- io $ getData uvMan +startUVMeter station args = runM (station : args) uvConfig runUVMeter + +runUVMeter :: [String] -> Monitor String +runUVMeter [] = return "N.A." +runUVMeter (s:_) = do + man <- io getGlobalManager + resp <- io $ getData man case textToXMLDocument resp of Right doc -> formatUVRating (getUVRating s doc) Left _ -> getConfigValue naString @@ -195,15 +187,3 @@ char '"' spaces return (Attribute (name, value)) - --- | Possibly create a new 'Manager', based upon the users preference. If one --- is created, this 'Manager' will be used throughout the monitor. -tryMakeManager :: UVMeterOpts -> IO (Maybe Manager) -tryMakeManager opts = - if useManager opts - then Just <$> mkManager - else pure Nothing - --- | Create a new 'Manager' for managing network connections. -mkManager :: IO Manager -mkManager = newManager $ tlsManagerSettings {managerConnCount = 1} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Volume.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Volume.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Volume.hs 2020-02-04 23:54:48.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Volume.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Volume --- Copyright : (c) 2011, 2013, 2015, 2018 Thomas Tuegel +-- Copyright : (c) 2011, 2013, 2015, 2018, 2020 Thomas Tuegel -- License : BSD-style (see LICENSE) -- -- Maintainer : Jose A. Ortega Ruiz <j...@gnu.org> @@ -23,7 +23,6 @@ import Control.Applicative ( (<$>), liftA3 ) import Control.Monad ( liftM2, liftM3, mplus ) -import Data.Maybe (fromMaybe) import Data.Traversable (sequenceA) import Xmobar.Plugins.Monitors.Common import Sound.ALSA.Mixer @@ -257,6 +256,5 @@ -- | Determine whether the volume is off based on the value of 'sw' from -- 'runVolumeWith'. - isVolOff = not . fromMaybe False - + isVolOff = (Just True /=) unavailable = getConfigValue naString diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Weather.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Weather.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Weather.hs 2020-02-05 15:55:33.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Weather.hs 2001-09-09 03:46:40.000000000 +0200 @@ -21,33 +21,30 @@ import qualified Data.ByteString.Lazy.Char8 as B import Data.Char (toLower) -import Data.Maybe (fromMaybe) import Network.HTTP.Conduit import Network.HTTP.Types.Status import Network.HTTP.Types.Method +import Network.HTTP.Client.TLS (getGlobalManager) import Text.ParserCombinators.Parsec import System.Console.GetOpt (ArgDescr(ReqArg), OptDescr(Option)) -- | Options the user may specify. -data WeatherOpts = WeatherOpts +newtype WeatherOpts = WeatherOpts { weatherString :: String - , useManager :: Bool } -- | Default values for options. defaultOpts :: WeatherOpts defaultOpts = WeatherOpts { weatherString = "" - , useManager = True } -- | Apply options. options :: [OptDescr (WeatherOpts -> WeatherOpts)] options = [ Option "w" ["weathers" ] (ReqArg (\s o -> o { weatherString = s }) "") "" - , Option "m" ["useManager"] (ReqArg (\b o -> o { useManager = read b }) "") "" ] weatherConfig :: IO MConfig @@ -213,12 +210,10 @@ stationUrl station = defUrl ++ station ++ ".TXT" -- | Get the decoded weather data from the given station. -getData :: Maybe Manager -> String -> IO String -getData weMan station = CE.catch - (do man <- flip fromMaybe weMan <$> mkManager - -- Create a new manager if none was present or the user does not want to - -- use one. - request <- parseUrlThrow $ stationUrl station +getData :: String -> IO String +getData station = CE.catch + (do request <- parseUrlThrow $ stationUrl station + man <- getGlobalManager res <- httpLbs request man return $ B.unpack $ responseBody res) errHandler @@ -261,11 +256,10 @@ -> IO () startWeather' sks station args rate cb = do opts <- parseOptsWith options defaultOpts (getArgvs args) - weRef <- tryMakeManager opts runMD (station : args) weatherConfig - (runWeather sks weRef opts) + (runWeather sks opts) rate weatherReady cb @@ -278,12 +272,11 @@ -- | Run a weather monitor. runWeather :: [(String, String)] -- ^ 'SkyConditionS' replacement strings - -> Maybe Manager -- ^ Whether to use a 'Manager' -> WeatherOpts -- ^ Weather specific options -> [String] -- ^ User supplied arguments -> Monitor String -runWeather sks weMan opts args = do - d <- io $ getData weMan (head args) +runWeather sks opts args = do + d <- io $ getData (head args) i <- io $ runP parseData d formatWeather opts sks i @@ -293,7 +286,7 @@ let request = initRequest { method = methodHead } CE.catch - (do man <- mkManager + (do man <- getGlobalManager res <- httpLbs request man return $ checkResult $ responseStatus res) errHandler @@ -308,15 +301,3 @@ | statusIsServerError status = False | statusIsClientError status = False | otherwise = True - --- | Possibly create a new 'Manager', based upon the users preference. If one --- is created, this 'Manager' will be used throughout the monitor. -tryMakeManager :: WeatherOpts -> IO (Maybe Manager) -tryMakeManager opts = - if useManager opts - then Just <$> mkManager - else pure Nothing - --- | Create a new 'Manager' for managing network connections. -mkManager :: IO Manager -mkManager = newManager $ tlsManagerSettings { managerConnCount = 1 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Wireless.hs new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Wireless.hs --- old/xmobar-0.33/src/Xmobar/Plugins/Monitors/Wireless.hs 2020-02-26 21:06:28.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/Monitors/Wireless.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,4 +1,7 @@ -{-# LANGUAGE TypeApplications, CPP #-} +{-# LANGUAGE CPP #-} +#ifdef USE_NL80211 +{-# LANGUAGE TypeApplications #-} +#endif ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Wireless @@ -16,7 +19,6 @@ module Xmobar.Plugins.Monitors.Wireless (wirelessConfig, runWireless) where import System.Console.GetOpt -import Data.Maybe (fromMaybe) import Xmobar.Plugins.Monitors.Common @@ -26,7 +28,7 @@ import Control.Exception (bracket) import qualified Data.Map as M import GHC.Int (Int8) -import Data.Maybe (listToMaybe) +import Data.Maybe (listToMaybe, fromMaybe) import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT) import Data.ByteString.Char8 (unpack) @@ -42,12 +44,12 @@ data IwData = IwData { wiEssid :: String, wiSignal :: Maybe Int, wiQuality :: Int } getWirelessInfo :: String -> IO IwData -getWirelessInfo ifname = do +getWirelessInfo ifname = bracket makeNL80211Socket (closeFd . getFd) (\s -> do iflist <- getInterfaceList s iwdata <- runMaybeT $ do ifidx <- MaybeT . return $ foldr (\(n, i) z -> - if (ifname == "" || ifname == n) then Just i else z) + if ifname == "" || ifname == n then Just i else z) Nothing iflist scanp <- liftIO (getConnectedWifi s ifidx) >>= @@ -63,13 +65,16 @@ return . unpack signal = staInfoFromPacket stap >>= staSignalMBM >>= return . fromIntegral @Int8 . fromIntegral - qlty = fromMaybe (-1) (round @Float . (/ 0.7) . (+ 110) . - clamp (-110) (-40) . fromIntegral <$> signal) + qlty = maybe (-1) (round @Float . (/ 0.7) . (+ 110) . + clamp (-110) (-40) . fromIntegral) signal MaybeT . return $ Just $ IwData ssid signal qlty return $ fromMaybe (IwData "" Nothing (-1)) iwdata) where rightToMaybe = either (const Nothing) Just - clamp lb up v = if v < lb then lb else if v > up then up else v + clamp lb up v + | v < lb = lb + | v > up = up + | otherwise = v #endif newtype WirelessOpts = WirelessOpts diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/PipeReader.hs new/xmobar-0.34/src/Xmobar/Plugins/PipeReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/PipeReader.hs 2018-12-02 06:34:51.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/PipeReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -16,7 +16,6 @@ import System.IO import Xmobar.Run.Exec(Exec(..)) -import Xmobar.System.Utils(hGetLineSafe) import Xmobar.System.Environment(expandEnv) import System.Posix.Files import Control.Concurrent(threadDelay) @@ -34,7 +33,7 @@ unless (null def) (cb def) checkPipe pipe h <- openFile pipe ReadWriteMode - forever (hGetLineSafe h >>= cb) + forever (hGetLine h >>= cb) where split c xs | c `elem` xs = let (pre, post) = span (c /=) xs in (pre, dropWhile (c ==) post) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Plugins/StdinReader.hs new/xmobar-0.34/src/Xmobar/Plugins/StdinReader.hs --- old/xmobar-0.33/src/Xmobar/Plugins/StdinReader.hs 2018-12-02 06:35:02.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Plugins/StdinReader.hs 2001-09-09 03:46:40.000000000 +0200 @@ -22,23 +22,30 @@ import System.Posix.Process import System.Exit import System.IO -import Control.Exception (SomeException(..), handle) import Xmobar.Run.Exec import Xmobar.X11.Actions (stripActions) -import Xmobar.System.Utils (hGetLineSafe) +import Xmobar.System.Utils (onSomeException) +import Control.Monad (when) data StdinReader = StdinReader | UnsafeStdinReader deriving (Read, Show) instance Exec StdinReader where start stdinReader cb = do - s <- handle (\(SomeException e) -> do hPrint stderr e; return "") - (hGetLineSafe stdin) - cb $ escape stdinReader s + -- The EOF check is necessary for certain systems + -- More details here https://github.com/jaor/xmobar/issues/442 eof <- isEOF - if eof - then exitImmediately ExitSuccess - else start stdinReader cb + when eof $ + do hPrint stderr "xmobar: eof at an early stage" + exitImmediately ExitSuccess + s <- + getLine `onSomeException` + (\e -> do + let errorMessage = "xmobar: Received exception " <> show e + hPrint stderr errorMessage + cb errorMessage) + cb $ escape stdinReader s + start stdinReader cb escape :: StdinReader -> String -> String escape StdinReader = stripActions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Run/Command.hs new/xmobar-0.34/src/Xmobar/Run/Command.hs --- old/xmobar-0.33/src/Xmobar/Run/Command.hs 2020-02-24 12:46:54.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Run/Command.hs 2001-09-09 03:46:40.000000000 +0200 @@ -20,8 +20,7 @@ import Control.Exception (handle, SomeException(..)) import System.Process import System.Exit -import System.IO (hClose) -import Xmobar.System.Utils (hGetLineSafe) +import System.IO (hClose, hGetLine) import Xmobar.Run.Exec @@ -47,7 +46,7 @@ exit <- waitForProcess p let closeHandles = hClose o >> hClose i >> hClose e getL = handle (\(SomeException _) -> return "") - (hGetLineSafe o) + (hGetLine o) case exit of ExitSuccess -> do str <- getL closeHandles diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/Run/Exec.hs new/xmobar-0.34/src/Xmobar/Run/Exec.hs --- old/xmobar-0.33/src/Xmobar/Run/Exec.hs 2020-02-24 12:46:54.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/Run/Exec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -10,7 +10,7 @@ -- -- The 'Exec' class and the 'Command' data type. -- --- The 'Exec' class rappresents the executable types, whose constructors may +-- The 'Exec' class represents the executable types, whose constructors may -- appear in the 'Config.commands' field of the 'Config.Config' data type. -- -- The 'Command' data type is for OS commands to be run by xmobar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/System/Utils.hs new/xmobar-0.34/src/Xmobar/System/Utils.hs --- old/xmobar-0.33/src/Xmobar/System/Utils.hs 2018-11-26 00:37:32.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/System/Utils.hs 2001-09-09 03:46:40.000000000 +0200 @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------ -- | -- Module: Utils --- Copyright: (c) 2010, 2018 Jose Antonio Ortega Ruiz +-- Copyright: (c) 2010, 2018, 2020 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: Jose A Ortega Ruiz <j...@gnu.org> @@ -17,27 +17,21 @@ ------------------------------------------------------------------------------ -module Xmobar.System.Utils (expandHome, changeLoop, hGetLineSafe) -where +module Xmobar.System.Utils + ( expandHome + , changeLoop + , onSomeException + , safeIndex + ) where import Control.Monad import Control.Concurrent.STM +import qualified Data.List.NonEmpty as NE +import Data.Maybe (fromMaybe) import System.Environment import System.FilePath -import System.IO - -#if defined XFT || defined UTF8 -import qualified System.IO as S (hGetLine) -#endif - -hGetLineSafe :: Handle -> IO String -#if defined XFT || defined UTF8 -hGetLineSafe = S.hGetLine -#else -hGetLineSafe = hGetLine -#endif - +import Control.Exception expandHome :: FilePath -> IO FilePath expandHome ('~':'/':path) = fmap (</> path) (getEnv "HOME") @@ -52,3 +46,26 @@ new <- s guard (new /= old) return new) + +-- | Like 'finally', but only performs the final action if there was an +-- exception raised by the computation. +-- +-- Note that this implementation is a slight modification of +-- onException function. +onSomeException :: IO a -> (SomeException -> IO b) -> IO a +onSomeException io what = io `catch` \e -> do _ <- what e + throwIO (e :: SomeException) + +(!!?) :: [a] -> Int -> Maybe a +(!!?) xs i + | i < 0 = Nothing + | otherwise = go i xs + where + go :: Int -> [a] -> Maybe a + go 0 (x:_) = Just x + go j (_:ys) = go (j - 1) ys + go _ [] = Nothing +{-# INLINE (!!?) #-} + +safeIndex :: NE.NonEmpty a -> Int -> a +safeIndex xs index = fromMaybe (NE.head xs) (NE.toList xs !!? index) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/X11/Draw.hs new/xmobar-0.34/src/Xmobar/X11/Draw.hs --- old/xmobar-0.33/src/Xmobar/X11/Draw.hs 2020-02-24 12:46:54.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/X11/Draw.hs 2001-09-09 03:46:40.000000000 +0200 @@ -25,6 +25,7 @@ import Control.Monad (when) import Control.Arrow ((&&&)) import Data.Map hiding (foldr, map, filter) +import qualified Data.List.NonEmpty as NE import Graphics.X11.Xlib hiding (textExtents, textWidth) import Graphics.X11.Xlib.Extras @@ -37,6 +38,7 @@ import Xmobar.X11.ColorCache import Xmobar.X11.Window (drawBorder) import Xmobar.X11.Parsers (Widget(..)) +import Xmobar.System.Utils (safeIndex) #ifdef XFT import Xmobar.X11.MinXft @@ -55,7 +57,7 @@ strLn = liftIO . mapM getWidth iconW i = maybe 0 B.width (lookup i $ iconS r) getWidth (Text s,cl,i,_) = - textWidth d (fs!!i) s >>= \tw -> return (Text s,cl,i,fi tw) + textWidth d (safeIndex fs i) s >>= \tw -> return (Text s,cl,i,fi tw) getWidth (Icon s,cl,i,_) = return (Icon s,cl,i,fi $ iconW s) p <- liftIO $ createPixmap d w wid ht @@ -126,7 +128,7 @@ #endif -- | An easy way to print the stuff we need to print -printStrings :: Drawable -> GC -> [XFont] -> [Int] -> Position +printStrings :: Drawable -> GC -> NE.NonEmpty XFont -> [Int] -> Position -> Align -> [(Widget, String, Int, Position)] -> X () printStrings _ _ _ _ _ _ [] = return () printStrings dr gc fontlist voffs offs a sl@((s,c,i,l):xs) = do @@ -136,7 +138,7 @@ Rectangle _ _ wid ht = rect r totSLen = foldr (\(_,_,_,len) -> (+) len) 0 sl remWidth = fi wid - fi totSLen - fontst = fontlist !! i + fontst = safeIndex fontlist i offset = case a of C -> (remWidth + offs) `div` 2 R -> remWidth @@ -144,7 +146,7 @@ (fc,bc) = case break (==',') c of (f,',':b) -> (f, b ) (f, _) -> (f, bgColor conf) - valign <- verticalOffset ht s (head fontlist) (voffs !! i) conf + valign <- verticalOffset ht s (NE.head fontlist) (voffs !! i) conf case s of (Text t) -> liftIO $ printString d dr fontst gc fc bc offset valign t alph (Icon p) -> liftIO $ maybe (return ()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/X11/Parsers.hs new/xmobar-0.34/src/Xmobar/X11/Parsers.hs --- old/xmobar-0.33/src/Xmobar/X11/Parsers.hs 2019-06-30 18:04:41.000000000 +0200 +++ new/xmobar-0.34/src/Xmobar/X11/Parsers.hs 2001-09-09 03:46:40.000000000 +0200 @@ -20,7 +20,9 @@ import Xmobar.X11.Actions import Control.Monad (guard, mzero) +import Data.Maybe (fromMaybe) import Text.ParserCombinators.Parsec +import Text.Read (readMaybe) import Graphics.X11.Types (Button) data Widget = Icon String | Text String @@ -138,7 +140,7 @@ -> Parser [(Widget, ColorString, FontIndex, Maybe [Action])] fontParser c a = do f <- between (string "<fn=") (string ">") colors - s <- manyTill (allParsers c (read f) a) (try $ string "</fn>") + s <- manyTill (allParsers c (fromMaybe 0 $ readMaybe f) a) (try $ string "</fn>") return (concat s) -- | Parses a color specification (hex or named) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar/X11/Types.hs new/xmobar-0.34/src/Xmobar/X11/Types.hs --- old/xmobar-0.33/src/Xmobar/X11/Types.hs 2018-11-25 23:53:40.000000000 +0100 +++ new/xmobar-0.34/src/Xmobar/X11/Types.hs 2001-09-09 03:46:40.000000000 +0200 @@ -20,6 +20,7 @@ import Graphics.X11.Xlib import Control.Monad.Reader import Data.Map +import qualified Data.List.NonEmpty as NE import Xmobar.X11.Bitmap import Xmobar.X11.Text @@ -33,7 +34,7 @@ XConf { display :: Display , rect :: Rectangle , window :: Window - , fontListS :: [XFont] + , fontListS :: NE.NonEmpty XFont , verticalOffsets :: [Int] , iconS :: Map FilePath Bitmap , config :: Config diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/src/Xmobar.hs new/xmobar-0.34/src/Xmobar.hs --- old/xmobar-0.33/src/Xmobar.hs 2019-06-30 00:15:17.000000000 +0200 +++ new/xmobar-0.34/src/Xmobar.hs 2001-09-09 03:46:40.000000000 +0200 @@ -32,6 +32,7 @@ , module Xmobar.Plugins.DateZone #endif , module Xmobar.Plugins.EWMH + , module Xmobar.Plugins.HandleReader , module Xmobar.Plugins.Kbd , module Xmobar.Plugins.Locks #ifdef INOTIFY @@ -57,6 +58,7 @@ import Xmobar.Plugins.DateZone #endif import Xmobar.Plugins.EWMH +import Xmobar.Plugins.HandleReader import Xmobar.Plugins.Kbd import Xmobar.Plugins.Locks #ifdef INOTIFY diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/test/Xmobar/Plugins/Monitors/AlsaSpec.hs new/xmobar-0.34/test/Xmobar/Plugins/Monitors/AlsaSpec.hs --- old/xmobar-0.33/test/Xmobar/Plugins/Monitors/AlsaSpec.hs 2019-01-27 23:56:35.000000000 +0100 +++ new/xmobar-0.34/test/Xmobar/Plugins/Monitors/AlsaSpec.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,9 +1,12 @@ {-# OPTIONS_GHC -Wall #-} +{-# LANGUAGE CPP #-} + module Xmobar.Plugins.Monitors.AlsaSpec ( main , spec ) where +#ifdef ALSA import Control.Concurrent import Control.Concurrent.Async import Control.Monad @@ -158,3 +161,11 @@ $ \(Just h) _ _ _ -> do hSetBuffering h LineBuffering body h +#else +-- These No-Op values are required for HSpec's test discovery. +main :: IO () +main = return () + +spec :: Monad m => m () +spec = return () +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xmobar-0.33/xmobar.cabal new/xmobar-0.34/xmobar.cabal --- old/xmobar-0.33/xmobar.cabal 2020-02-26 21:51:21.000000000 +0100 +++ new/xmobar-0.34/xmobar.cabal 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ name: xmobar -version: 0.33 +version: 0.34 homepage: http://xmobar.org synopsis: A Minimalistic Text Based Status Bar description: Xmobar is a minimalistic text based status bar. @@ -13,7 +13,7 @@ author: Andrea Rossato and Jose A. Ortega Ruiz maintainer: Jose A. Ortega Ruiz <j...@gnu.org> bug-reports: https://github.com/jaor/xmobar/issues -cabal-version: >= 1.8 +cabal-version: >= 1.10 build-type: Simple extra-source-files: readme.md, changelog.md, @@ -92,6 +92,7 @@ default: True library + default-language: Haskell2010 hs-source-dirs: src exposed-modules: Xmobar @@ -129,6 +130,7 @@ Xmobar.Plugins.CommandReader, Xmobar.Plugins.Date, Xmobar.Plugins.EWMH, + Xmobar.Plugins.HandleReader, Xmobar.Plugins.PipeReader, Xmobar.Plugins.MarqueePipeReader, Xmobar.Plugins.StdinReader, @@ -164,12 +166,12 @@ ghc-options: -funbox-strict-fields -Wall -fno-warn-unused-do-bind build-depends: - base >= 4.9.1.0 && < 4.14, + base >= 4.9.1.0 && < 4.15, containers, regex-compat, process, old-locale, - bytestring, + bytestring >= 0.10.8.2, directory, unix, time, @@ -210,11 +212,11 @@ if flag(with_inotify) || flag(all_extensions) build-depends: hinotify >= 0.3 && < 0.5 - exposed-modules: Xmobar.Plugins.Mail, Xmobar.Plugins.MBox + other-modules: Xmobar.Plugins.Mail, Xmobar.Plugins.MBox cpp-options: -DINOTIFY if flag(with_iwlib) || flag(with_nl80211) || flag(all_extensions) - exposed-modules: Xmobar.Plugins.Monitors.Wireless + other-modules: Xmobar.Plugins.Monitors.Wireless if flag(with_iwlib) extra-libraries: iw @@ -228,25 +230,25 @@ if flag(with_mpd) || flag(all_extensions) build-depends: libmpd >= 0.9.0.10 - exposed-modules: Xmobar.Plugins.Monitors.MPD + other-modules: Xmobar.Plugins.Monitors.MPD cpp-options: -DLIBMPD if flag(with_alsa) || flag(all_extensions) build-depends: alsa-mixer >= 0.3 && < 0.4 build-depends: alsa-core == 0.5.*, process >= 1.4.3.0 - exposed-modules: Xmobar.Plugins.Monitors.Volume + other-modules: Xmobar.Plugins.Monitors.Volume Xmobar.Plugins.Monitors.Alsa cpp-options: -DALSA if flag(with_datezone) || flag(all_extensions) build-depends: timezone-olson == 0.1.*, timezone-series == 0.1.* - exposed-modules: Xmobar.Plugins.DateZone + other-modules: Xmobar.Plugins.DateZone cpp-options: -DDATEZONE if flag(with_mpris) || flag(all_extensions) build-depends: dbus >= 1 - exposed-modules: Xmobar.Plugins.Monitors.Mpris + other-modules: Xmobar.Plugins.Monitors.Mpris cpp-options: -DMPRIS if flag(with_dbus) || flag(all_extensions) @@ -260,12 +262,12 @@ cpp-options: -DXPM if flag(with_weather) || flag(all_extensions) - exposed-modules: Xmobar.Plugins.Monitors.Weather + other-modules: Xmobar.Plugins.Monitors.Weather cpp-options: -DWEATHER - build-depends: http-conduit, http-types + build-depends: http-conduit, http-types, http-client-tls if flag(with_uvmeter) - exposed-modules: Xmobar.Plugins.Monitors.UVMeter + other-modules: Xmobar.Plugins.Monitors.UVMeter build-depends: http-conduit, http-types cpp-options: -DUVMETER @@ -275,6 +277,7 @@ cpp-options: -DFREEBSD executable xmobar + default-language: Haskell2010 hs-source-dirs: app main-is: Main.hs build-depends: base, @@ -300,6 +303,7 @@ cpp-options: -DTHREADED_RUNTIME test-suite XmobarTest + default-language: Haskell2010 type: exitcode-stdio-1.0 hs-source-dirs: src, test main-is: Spec.hs