xmobar 0.49 → 0.50
raw patch · 10 files changed
+155/−79 lines, 10 filesdep ~libmpd
Dependency ranges changed: libmpd
Files
- changelog.md +10/−0
- doc/plugins.org +22/−6
- readme.org +9/−16
- src/Xmobar.hs +2/−0
- src/Xmobar/Plugins/Accordion.hs +36/−20
- src/Xmobar/Plugins/ArchUpdates.hs +24/−29
- src/Xmobar/Plugins/Monitors/MPD.hs +3/−2
- src/Xmobar/Plugins/Monitors/Swap/FreeBSD.hsc +2/−3
- src/Xmobar/Plugins/PacmanUpdates.hs +43/−0
- xmobar.cabal +4/−3
changelog.md view
@@ -1,3 +1,13 @@+## Version 0.50 (June, 2025)++- New plugins: `PacmanUpdates` (thanks, Alexander)+- `ArchUpdates` deprecated in favor of `PacmanUpdates`+ - a deprecation notice will be shown to users of that plugin in the bar in+ the zero updates case+- `Accordion`: new constructor to allow short version to have plugins too+- `Swap`: update for FreeBSD 15+- `MPD` compiled again by default with `all_extensions`.+ ## Version 0.49 (April, 2025) - New plugins: `ArchUpdates` and `Accordion` (thanks, Enrico Maria)
doc/plugins.org view
@@ -1077,8 +1077,8 @@ ** Music monitors *** =MPD Args RefreshRate= - - This monitor will only be compiled if you ask for it using the- =with_mpd= flag. It needs [[http://hackage.haskell.org/package/libmpd/][libmpd]] 5.0 or later (available on Hackage).+ - This monitor will only be compiled if you ask for it using the =with_mpd=+ flag. It needs [[http://hackage.haskell.org/package/libmpd/][libmpd]] 0.10.1 or later (available on Hackage). - Aliases to =mpd= @@ -1353,19 +1353,35 @@ the display of those numeric fields. - Default template: =Up: <days>d <hours>h <minutes>m= -*** =ArchUpdates (Zero, One, Many) Rate=+*** =PacmanUpdates (Zero, One, Many, Error) Rate= - - Aliases to =arch=+ - Aliases to =pacman= - =Zero=: a =String= to use when the system is up to date. - =One=: a =String= to use when only one update is available.- - =Many=: a =String= to use when several updates are available; it must contain+ - =Many=: a =String= to use when several updates are available; it can contain a =?= character as a placeholder for the number of updates.+ - =Error=: a =String= to use when pacman fails for unkown reasons (e.g.+ network error) - Example: #+begin_src haskell ArchUpdates ("<fc=green>up to date</fc>", "<fc=yellow>1 update</fc>,- "<fc=red>? updates</fc>")+ "<fc=red>? updates</fc>",+ "<fc=red>!Pacman Error!</fc>") 600+ #+end_src++*** =ArchUpdates (Zero, One, Many) Rate=++ - *This plugin is deprecated. Use =PacmanUpdates= instead.*+ - Aliases to =arch=+ - Same As:+ #+begin_src haskell+ PacmanUpdates (Zero,+ One,+ Many,+ "pacman: Unknown cause of failure.")+ Rate #+end_src *** =makeAccordion Tuning [Runnable]=
readme.org view
@@ -28,13 +28,6 @@ * Breaking news - - Starting with version 0.47.1, we are excluding MPD from the extensions- included with ~all_extensions~ when GHC version is 9.4 or greater, because- that seems to break cabal compilation. However, it's been reported that- in some installations compilation with ~libmpd~ works fine: just add- explicitly the ~with_mpd~ flag to include MPD and check for yourself.- Compilation with stack has also been reported to work. Please see the- comments in issue #679 for details. - Starting with version 0.45, we use cairo/pango as our drawing engine (instead of plain X11/Xft). From a user's point of view, that change should be mostly transparent, except for the facts that it's allowed@@ -179,15 +172,15 @@ Lennart Kolmodin, Krzysztof Kosciuszkiewicz, Dmitry Kurochkin, Todd Lunter, Vanessa McHale, Robert J. Macomber, Dmitry Malikov, David McLean, Ulrik de Muelenaere, Joan Milev, Marcin Mikołajczyk, Dino Morelli, Tony Morris, Eric- Mrak, Thiago Negri, Edward O'Callaghan, Svein Ove, Martin Perner, Jens- Petersen, Alexander Polakov, Sibi Prabakaran, Pavan Rikhi, Petr Rockai,- Andrew Emmanuel Rosa, Sackville-West, Amir Saeid, Markus Scherer, Daniel- Schüssler, Olivier Schneider, Alexander Shabalin, Valentin Shirokov, Peter- Simons, Alexander Solovyov, Will Song, John Soo, 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, Nikolay Yakimov, Edward Z. Yang,- Leo Zhang, Norbert Zeh, and Michał Zielonka.+ Mrak, Thiago Negri, Edward O'Callaghan, Svein Ove, Martin Perner, Alexander+ Pankoff, Jens Petersen, Alexander Polakov, Sibi Prabakaran, Pavan Rikhi,+ Petr Rockai, Andrew Emmanuel Rosa, Sackville-West, Amir Saeid, Markus+ Scherer, Daniel Schüssler, Olivier Schneider, Alexander Shabalin, Valentin+ Shirokov, Peter Simons, Alexander Solovyov, Will Song, John Soo, 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, Nikolay Yakimov,+ Edward Z. Yang, Leo Zhang, Norbert Zeh, and Michał Zielonka. Andrea wants to thank Robert Manea and Spencer Janssen for their help in understanding how X works. They gave him suggestions on how to solve many
src/Xmobar.hs view
@@ -45,6 +45,7 @@ #endif , module Xmobar.Plugins.NotmuchMail , module Xmobar.Plugins.Monitors+ , module Xmobar.Plugins.PacmanUpdates , module Xmobar.Plugins.PipeReader , module Xmobar.Plugins.MarqueePipeReader , module Xmobar.Plugins.StdinReader@@ -74,6 +75,7 @@ import Xmobar.Plugins.MBox #endif import Xmobar.Plugins.Monitors+import Xmobar.Plugins.PacmanUpdates import Xmobar.Plugins.PipeReader import Xmobar.Plugins.StdinReader import Xmobar.Plugins.MarqueePipeReader
src/Xmobar/Plugins/Accordion.hs view
@@ -15,7 +15,7 @@ -- ----------------------------------------------------------------------------- -module Xmobar.Plugins.Accordion (defaultTuning, makeAccordion, Tuning(..)) where+module Xmobar.Plugins.Accordion (defaultTuning, makeAccordion, makeAccordion', Tuning(..)) where import Control.Concurrent.Async (withAsync) import Control.Exception (finally)@@ -23,7 +23,7 @@ import Control.Monad.IO.Class (liftIO) import Control.Monad.Reader (runReaderT, ask) import Control.Monad.State.Strict (evalStateT, get, modify')-import Data.IORef (atomicModifyIORef', newIORef, readIORef)+import Data.IORef (atomicModifyIORef', newIORef, readIORef, IORef) import Data.Maybe (isJust) import System.Directory (removeFile) import System.Exit (ExitCode(..))@@ -38,11 +38,15 @@ data Accordion a = Accordion { tuning :: Tuning , plugins :: [a]+ , shortPlugins :: [a] } deriving (Show, Read) makeAccordion :: Exec a => Tuning -> [a] -> Accordion a-makeAccordion t rs = Accordion { tuning = t, plugins = rs }+makeAccordion t rs = Accordion { tuning = t, plugins = rs, shortPlugins = [] } +makeAccordion' :: Exec a => Tuning -> [a] -> [a] -> Accordion a+makeAccordion' t rs rs' = Accordion { tuning = t, plugins = rs, shortPlugins = rs' }+ data Tuning = Tuning { alias' :: String , initial :: Bool@@ -59,11 +63,12 @@ } instance (Exec a, Read a, Show a) => Exec (Accordion a) where- alias (Accordion Tuning { alias' = name } _) = name+ alias (Accordion Tuning { alias' = name } _ _) = name start (Accordion Tuning { initial = initial'- , expand = expand'- , shrink = shrink' }- runnables)+ , expand = expandIcon+ , shrink = shrinkIcon }+ runnables+ shortRunnables) cb = do clicked <- newIORef Nothing (_, n, _) <- readProcessWithExitCode "uuidgen" [] ""@@ -74,24 +79,35 @@ ExitSuccess -> atomicModifyIORef' clicked (const (Just (), ())) ExitFailure _ -> error "how is this possible?") (const $ do- srefs <- mapM (newIORef . const "") runnables- foldr (\(runnable, sref) acc -> withAsync (start runnable (writeToRef sref)) (const acc))+ strRefs <- mapM (newIORef . const "") runnables+ strRefs' <- mapM (newIORef . const "") shortRunnables+ foldr (\(runnable, strRef) acc -> withAsync (start runnable (writeToRef strRef)) (const acc)) (forever (do liftIO (tenthSeconds 1) clicked' <- liftIO $ readIORef clicked when (isJust clicked') (do liftIO $ clear clicked modify' not) b <- get- if b then loop pipe else liftIO $ cb (click pipe expand'))- `runReaderT` srefs `evalStateT` initial')- (zip runnables srefs))+ loop b pipe)+ `runReaderT` (strRefs, strRefs')+ `evalStateT` initial')+ (zip (runnables ++ shortRunnables)+ (strRefs ++ strRefs'))) `finally` removeFile pipe where- click file icon = "<action=`echo 1 > " ++ file ++ "`>" ++ icon ++ "</action>"- clear = (`atomicModifyIORef'` const (Nothing, ()))- removeLinebreak = init- writeToRef strRef = atomicModifyIORef' strRef . const . (,())- loop p = do- srefs <- ask- text <- join <$> mapM (liftIO . readIORef) srefs- liftIO $ cb $ text ++ click p shrink'+ loop b p = do+ (strRefs, strRefs') <- ask+ text <- join <$> mapM (liftIO . readIORef) (if b then strRefs else strRefs')+ liftIO $ cb $ text ++ attachClick p (if b then shrinkIcon else expandIcon)++writeToRef :: IORef a -> a -> IO ()+writeToRef strRef = atomicModifyIORef' strRef . const . (,())++clear :: IORef (Maybe a) -> IO ()+clear = (`atomicModifyIORef'` const (Nothing, ()))++removeLinebreak :: [a] -> [a]+removeLinebreak = init++attachClick :: String -> String -> String+attachClick file icon = "<action=`echo 1 > " ++ file ++ "`>" ++ icon ++ "</action>"
src/Xmobar/Plugins/ArchUpdates.hs view
@@ -1,41 +1,36 @@ {-# LANGUAGE CPP #-} -------------------------------------------------------------------------------- |--- Module : Plugins.Monitors.ArchUpdates--- Copyright : (c) 2024 Enrico Maria De Angelis--- License : BSD-style (see LICENSE)------ Maintainer : Enrico Maria De Angelis <enricomaria.dean6elis@gmail.com>--- Stability : unstable--- Portability : unportable------ An ArchLinux updates availablility plugin for Xmobar---+ ----------------------------------------------------------------------------- -module Xmobar.Plugins.ArchUpdates (ArchUpdates(..)) where+{- |+Module : Plugins.Monitors.ArchUpdates+Copyright : (c) 2024 Enrico Maria De Angelis+License : BSD-style (see LICENSE) -import System.Exit (ExitCode(..))-import System.Process (readProcessWithExitCode)-import Xmobar.Run.Exec+Maintainer : Enrico Maria De Angelis <enricomaria.dean6elis@gmail.com>+Stability : unstable+Portability : unportable++An ArchLinux updates availablility plugin for Xmobar+-}+module Xmobar.Plugins.ArchUpdates (ArchUpdates (..)) where+ import Xmobar.Plugins.Command (Rate)+import Xmobar.Plugins.PacmanUpdates (PacmanUpdates (PacmanUpdates))+import Xmobar.Run.Exec data ArchUpdates = ArchUpdates (String, String, String) Rate deriving (Read, Show) +intoPacmanUpdates :: ArchUpdates -> PacmanUpdates+intoPacmanUpdates (ArchUpdates (z, o, m) r) =+ PacmanUpdates (z <> deprecation, o, m, "pacman: Unknown cause of failure.") r+ where+ deprecation = " <fc=#ff0000>(<action=`xdg-open https://codeberg.org/xmobar/xmobar/pulls/723`>deprecated plugin, click here</action>)</fc>"+ instance Exec ArchUpdates where- alias (ArchUpdates _ _) = "arch"- rate (ArchUpdates _ r) = r- run (ArchUpdates (z, o, m) _) = do- (exit, stdout, _) <- readProcessWithExitCode "checkupdates" [] ""- return $ case exit of- ExitFailure 2 -> z--ero updates- ExitFailure 1 -> "pacman: Unknown cause of failure."- ExitSuccess -> case length $ lines stdout of- 0 -> impossible- 1 -> o- n -> m >>= \c -> if c == '?' then show n else pure c- _ -> impossible- where- impossible = error "This is impossible based on pacman manpage"+ alias = const "arch"+ rate = rate . intoPacmanUpdates+ run = run . intoPacmanUpdates
src/Xmobar/Plugins/Monitors/MPD.hs view
@@ -109,8 +109,9 @@ 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 = showTime $ floor p+ len = showTime $ floor t+ remain = showTime $ 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
src/Xmobar/Plugins/Monitors/Swap/FreeBSD.hsc view
@@ -71,11 +71,10 @@ poke _ _ = pure () - isEnabled :: IO Bool isEnabled = do- enabled <- sysctlReadUInt "vm.swap_enabled"- return $ enabled == 1+ nswapdev <- sysctlReadUInt "vm.nswapdev"+ return $ nswapdev > 0 parseMEM' :: Bool -> IO [Float] parseMEM' False = return []
+ src/Xmobar/Plugins/PacmanUpdates.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE CPP #-}++-----------------------------------------------------------------------------++-----------------------------------------------------------------------------++{- |+Module : Plugins.Monitors.PacmanUpdates+Copyright : (c) 2024 Enrico Maria De Angelis+ , (c) 2025 Alexander Pankoff+License : BSD-style (see LICENSE)++Maintainer : Enrico Maria De Angelis <enricomaria.dean6elis@gmail.com>+Stability : unstable+Portability : unportable++A Pacman updates availablility plugin for Xmobar+-}+module Xmobar.Plugins.PacmanUpdates (PacmanUpdates (..)) where++import System.Exit (ExitCode (..))+import System.Process (readProcessWithExitCode)+import Xmobar.Plugins.Command (Rate)+import Xmobar.Run.Exec++data PacmanUpdates = PacmanUpdates (String, String, String, String) Rate+ deriving (Read, Show)++instance Exec PacmanUpdates where+ alias = const "pacman"+ rate (PacmanUpdates _ r) = r+ run (PacmanUpdates (z, o, m, e) _) = do+ (exit, stdout, _) <- readProcessWithExitCode "checkupdates" [] ""+ return $ case exit of+ ExitFailure 2 -> z -- ero updates+ ExitFailure 1 -> e+ ExitSuccess -> case length $ lines stdout of+ 0 -> impossible+ 1 -> o+ n -> m >>= \c -> if c == '?' then show n else pure c+ _ -> impossible+ where+ impossible = error "This is impossible based on pacman manpage"
xmobar.cabal view
@@ -1,5 +1,5 @@ name: xmobar-version: 0.49+version: 0.50 homepage: https://codeberg.org/xmobar/xmobar synopsis: A Minimalistic Text Based Status Bar description: Xmobar is a minimalistic text based status bar.@@ -158,6 +158,7 @@ Xmobar.Plugins.EWMH, Xmobar.Plugins.HandleReader, Xmobar.Plugins.QueueReader,+ Xmobar.Plugins.PacmanUpdates, Xmobar.Plugins.PipeReader, Xmobar.Plugins.MarqueePipeReader, Xmobar.Plugins.StdinReader,@@ -265,8 +266,8 @@ cereal >= 0.5.8.1 cpp-options: -DUSE_NL80211 - if flag(with_mpd) || (flag(all_extensions) && impl(ghc < 9.4))- build-depends: libmpd >= 0.9.2.0+ if flag(with_mpd) || flag(all_extensions)+ build-depends: libmpd >= 0.10.0.1 other-modules: Xmobar.Plugins.Monitors.MPD cpp-options: -DLIBMPD