aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Util
diff options
context:
space:
mode:
Diffstat (limited to 'XMonad/Util')
-rw-r--r--XMonad/Util/Loggers.hs88
1 files changed, 88 insertions, 0 deletions
diff --git a/XMonad/Util/Loggers.hs b/XMonad/Util/Loggers.hs
new file mode 100644
index 0000000..dcf3b99
--- /dev/null
+++ b/XMonad/Util/Loggers.hs
@@ -0,0 +1,88 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonad.Util.Loggers
+-- Copyright : (c) Brent Yorgey
+-- License : BSD-style (see LICENSE)
+--
+-- Maintainer : <byorgey@gmail.com>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- A collection of simple logger functions which can be used in the
+-- 'XMonad.Hooks.DynamicLog.ppExtras' field of a pretty-printing status
+-- logger format. See "XMonad.Hooks.DynamicLog" for more information.
+-----------------------------------------------------------------------------
+
+module XMonad.Util.Loggers (
+ -- * Usage
+ -- $usage
+
+ Logger
+
+ , date
+ , loadAvg
+ , battery
+ , logCmd
+
+ ) where
+
+import XMonad.Core
+
+import System.Time
+import System.IO
+import System.Process
+import System.Locale
+
+-- $usage
+-- You can use this module by importing it into your @~\/.xmonad\/xmonad.hs@:
+--
+-- > import XMonad.Util.Loggers
+--
+-- Then, add one or more loggers to the
+-- 'XMonad.Hooks.DynamicLog.ppExtras' field of your
+-- 'XMonad.Hooks.DynamicLoc.PP' format. For example:
+--
+-- > -- display load averages and a pithy quote along with xmonad status.
+-- > , logHook = dynamicLogWithPP $ defaultPP { ppExtras = [ loadAvg, logCmd "fortune -n 40 -s" ] }
+--
+-- Of course, there is nothing really special about these so-called
+-- \'loggers\': they are just @X (Maybe String)@ actions. So you can
+-- use them anywhere you would use an @X (Maybe String)@, not just
+-- with DynamicLog.
+--
+-- Additional loggers welcome!
+--
+
+-- | 'Logger' is just a convenient synonym for @X (Maybe String)@.
+type Logger = X (Maybe String)
+
+-- | Get the current date and time, and format them via the
+-- given format string. The format used is the same as that used
+-- by the C library function strftime; for example,
+-- @date \"%a %b %d\"@ might display something like @Tue Feb 19@.
+-- For more information see something like
+-- <http://www.cplusplus.com/reference/clibrary/ctime/strftime.html>.
+date :: String -> Logger
+date fmt = io $ do cal <- (getClockTime >>= toCalendarTime)
+ return . Just $ formatCalendarTime defaultTimeLocale fmt cal
+
+-- | Get the load average. This assumes that you have a
+-- utility called @\/usr\/bin\/uptime@ and that you have @sed@
+-- installed; these are fairly common on GNU\/Linux systems but it
+-- would be nice to make this more general.
+loadAvg :: Logger
+loadAvg = logCmd "/usr/bin/uptime | sed 's/.*: //; s/,//g'"
+
+-- | Get the battery status (percent charge and charging\/discharging
+-- status). This is an ugly hack and may not work for some people.
+-- At some point it would be nice to make this more general\/have
+-- fewer dependencies.
+battery :: Logger
+battery = logCmd "/usr/bin/acpi | sed -r 's/.*?: (.*%).*/\\1/; s/discharging, ([0-9]+%)/\\1-/; s/charging, ([0-9]+%)/\\1+/; s/charged, //'"
+
+-- | Create a 'Logger' from an arbitrary shell command.
+logCmd :: String -> Logger
+logCmd c = io $ do (_, out, _, proc) <- runInteractiveCommand c
+ output <- hGetLine out
+ waitForProcess proc
+ return $ Just output