Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > 420a649e6f65db30aa7451f64d08ff92 > files > 1127

ghc-xmonad-contrib-devel-0.9.2-4.fc16.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>XMonad/Util/Loggers.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  XMonad.Util.Loggers</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  (c) Brent Yorgey, Wirt Wolff</span>
<a name="line-5"></a><span class='hs-comment'>-- License     :  BSD-style (see LICENSE)</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  :  &lt;byorgey@gmail.com&gt;</span>
<a name="line-8"></a><span class='hs-comment'>-- Stability   :  unstable</span>
<a name="line-9"></a><span class='hs-comment'>-- Portability :  unportable</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- A collection of simple logger functions and formatting utilities</span>
<a name="line-12"></a><span class='hs-comment'>-- which can be used in the 'XMonad.Hooks.DynamicLog.ppExtras' field of</span>
<a name="line-13"></a><span class='hs-comment'>-- a pretty-printing status logger format. See "XMonad.Hooks.DynamicLog"</span>
<a name="line-14"></a><span class='hs-comment'>-- for more information.</span>
<a name="line-15"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span><span class='hs-varop'>.</span><span class='hs-conid'>Loggers</span> <span class='hs-layout'>(</span>
<a name="line-18"></a>    <span class='hs-comment'>-- * Usage</span>
<a name="line-19"></a>    <span class='hs-comment'>-- $usage</span>
<a name="line-20"></a>
<a name="line-21"></a>      <span class='hs-conid'>Logger</span>
<a name="line-22"></a>
<a name="line-23"></a>    <span class='hs-comment'>-- * System Loggers</span>
<a name="line-24"></a>    <span class='hs-comment'>-- $system</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>aumixVolume</span>
<a name="line-26"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>battery</span>
<a name="line-27"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>date</span>
<a name="line-28"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>loadAvg</span>
<a name="line-29"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>maildirNew</span><span class='hs-layout'>,</span> <span class='hs-varid'>maildirUnread</span>
<a name="line-30"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>logCmd</span> <span class='hs-layout'>,</span> <span class='hs-varid'>logFileCount</span>
<a name="line-31"></a>
<a name="line-32"></a>    <span class='hs-comment'>-- * XMonad Loggers</span>
<a name="line-33"></a>    <span class='hs-comment'>-- $xmonad</span>
<a name="line-34"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>logCurrent</span><span class='hs-layout'>,</span> <span class='hs-varid'>logLayout</span><span class='hs-layout'>,</span> <span class='hs-varid'>logTitle</span>
<a name="line-35"></a>
<a name="line-36"></a>    <span class='hs-comment'>-- * Formatting Utilities</span>
<a name="line-37"></a>    <span class='hs-comment'>-- $format</span>
<a name="line-38"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>onLogger</span>
<a name="line-39"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>wrapL</span><span class='hs-layout'>,</span> <span class='hs-varid'>fixedWidthL</span>
<a name="line-40"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>logSp</span><span class='hs-layout'>,</span> <span class='hs-varid'>padL</span>
<a name="line-41"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>shortenL</span>
<a name="line-42"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>dzenColorL</span><span class='hs-layout'>,</span> <span class='hs-varid'>xmobarColorL</span>
<a name="line-43"></a>
<a name="line-44"></a>    <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftIO</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Core</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>StackSet</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>W</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Hooks</span><span class='hs-varop'>.</span><span class='hs-conid'>DynamicLog</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span><span class='hs-varop'>.</span><span class='hs-conid'>Font</span> <span class='hs-layout'>(</span><span class='hs-conid'>Align</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span><span class='hs-varop'>.</span><span class='hs-conid'>NamedWindows</span> <span class='hs-layout'>(</span><span class='hs-varid'>getName</span><span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>isSuffixOf</span><span class='hs-layout'>)</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromMaybe</span><span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Traversable</span> <span class='hs-layout'>(</span><span class='hs-varid'>traverse</span><span class='hs-layout'>)</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Directory</span> <span class='hs-layout'>(</span><span class='hs-varid'>getDirectoryContents</span><span class='hs-layout'>)</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Locale</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Process</span> <span class='hs-layout'>(</span><span class='hs-varid'>runInteractiveCommand</span><span class='hs-layout'>)</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span>
<a name="line-64"></a>
<a name="line-65"></a><span class='hs-comment'>-- $usage</span>
<a name="line-66"></a><span class='hs-comment'>-- Use this module by importing it into your @~\/.xmonad\/xmonad.hs@:</span>
<a name="line-67"></a><span class='hs-comment'>--</span>
<a name="line-68"></a><span class='hs-comment'>-- &gt; import XMonad.Util.Loggers</span>
<a name="line-69"></a><span class='hs-comment'>--</span>
<a name="line-70"></a><span class='hs-comment'>-- Then, add one or more loggers to the</span>
<a name="line-71"></a><span class='hs-comment'>-- 'XMonad.Hooks.DynamicLog.ppExtras' field of your</span>
<a name="line-72"></a><span class='hs-comment'>-- 'XMonad.Hooks.DynamicLoc.PP', possibly with extra formatting .</span>
<a name="line-73"></a><span class='hs-comment'>-- For example:</span>
<a name="line-74"></a><span class='hs-comment'>--</span>
<a name="line-75"></a><span class='hs-comment'>-- &gt;   -- display load averages and a pithy quote along with xmonad status.</span>
<a name="line-76"></a><span class='hs-comment'>-- &gt;   , logHook = dynamicLogWithPP $ defaultPP {</span>
<a name="line-77"></a><span class='hs-comment'>-- &gt;                  ppExtras = [ padL loadAvg, logCmd "fortune -n 40 -s" ]</span>
<a name="line-78"></a><span class='hs-comment'>-- &gt;                }</span>
<a name="line-79"></a><span class='hs-comment'>-- &gt;   -- gives something like " 3.27 3.52 3.26 Drive defensively.  Buy a tank."</span>
<a name="line-80"></a><span class='hs-comment'>--</span>
<a name="line-81"></a><span class='hs-comment'>-- See the formatting section below for another example using</span>
<a name="line-82"></a><span class='hs-comment'>-- a @where@ block to define some formatted loggers for a top-level</span>
<a name="line-83"></a><span class='hs-comment'>-- @myLogHook@.</span>
<a name="line-84"></a><span class='hs-comment'>--</span>
<a name="line-85"></a><span class='hs-comment'>-- Loggers are named either for their function, as in 'battery',</span>
<a name="line-86"></a><span class='hs-comment'>-- 'aumixVolume', and 'maildirNew', or are prefixed with \"log\" when</span>
<a name="line-87"></a><span class='hs-comment'>-- making use of other functions or by analogy with the pp* functions.</span>
<a name="line-88"></a><span class='hs-comment'>-- For example, the logger version of 'XMonad.Hooks.DynamicLog.ppTitle'</span>
<a name="line-89"></a><span class='hs-comment'>-- is 'logTitle', and 'logFileCount' loggerizes the result of file</span>
<a name="line-90"></a><span class='hs-comment'>-- counting code.</span>
<a name="line-91"></a><span class='hs-comment'>--</span>
<a name="line-92"></a><span class='hs-comment'>-- Formatting utility names are generally as short as possible and</span>
<a name="line-93"></a><span class='hs-comment'>-- carry the suffix \"L\". For example, the logger version of</span>
<a name="line-94"></a><span class='hs-comment'>-- 'XMonad.Hooks.DynamicLog.shorten' is 'shortenL'.</span>
<a name="line-95"></a><span class='hs-comment'>--</span>
<a name="line-96"></a><span class='hs-comment'>-- Of course, there is nothing really special about these so-called</span>
<a name="line-97"></a><span class='hs-comment'>-- \"loggers\": they are just @X (Maybe String)@ actions.  So you can</span>
<a name="line-98"></a><span class='hs-comment'>-- use them anywhere you would use an @X (Maybe String)@, not just</span>
<a name="line-99"></a><span class='hs-comment'>-- with DynamicLog.</span>
<a name="line-100"></a><span class='hs-comment'>--</span>
<a name="line-101"></a><span class='hs-comment'>-- Additional loggers welcome!</span>
<a name="line-102"></a>
<a name="line-103"></a>
<a name="line-104"></a>
<a name="line-105"></a><a name="Logger"></a><span class='hs-comment'>-- | 'Logger' is just a convenient synonym for @X (Maybe String)@.</span>
<a name="line-106"></a><a name="Logger"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>X</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span>
<a name="line-107"></a>
<a name="line-108"></a><span class='hs-comment'>-- $system</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="aumixVolume"></a><span class='hs-comment'>-- | Get the current volume with @aumix@. &lt;<a href="http://jpj.net/~trevor/aumix.html">http://jpj.net/~trevor/aumix.html</a>&gt;</span>
<a name="line-111"></a><span class='hs-definition'>aumixVolume</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-112"></a><span class='hs-definition'>aumixVolume</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>logCmd</span> <span class='hs-str'>"aumix -vq"</span>
<a name="line-113"></a>
<a name="line-114"></a><a name="battery"></a><span class='hs-comment'>-- | Get the battery status (percent charge and charging\/discharging</span>
<a name="line-115"></a><span class='hs-comment'>--   status). This is an ugly hack and may not work for some people.</span>
<a name="line-116"></a><span class='hs-comment'>--   At some point it would be nice to make this more general\/have</span>
<a name="line-117"></a><span class='hs-comment'>--   fewer dependencies (assumes @\/usr\/bin\/acpi@ and @sed@ are installed.)</span>
<a name="line-118"></a><span class='hs-definition'>battery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-119"></a><span class='hs-definition'>battery</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>logCmd</span> <span class='hs-str'>"/usr/bin/acpi | sed -r 's/.*?: (.*%).*/\\1/; s/discharging, ([0-9]+%)/\\1-/; s/charging, ([0-9]+%)/\\1+/; s/charged, //'"</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="date"></a><span class='hs-comment'>-- | Get the current date and time, and format them via the</span>
<a name="line-122"></a><span class='hs-comment'>--   given format string.  The format used is the same as that used</span>
<a name="line-123"></a><span class='hs-comment'>--   by the C library function strftime; for example,</span>
<a name="line-124"></a><span class='hs-comment'>--   @date \"%a %b %d\"@ might display something like @Tue Feb 19@.</span>
<a name="line-125"></a><span class='hs-comment'>--   For more information see something like</span>
<a name="line-126"></a><span class='hs-comment'>--   &lt;<a href="http://www.cplusplus.com/reference/clibrary/ctime/strftime.html">http://www.cplusplus.com/reference/clibrary/ctime/strftime.html</a>&gt;.</span>
<a name="line-127"></a><span class='hs-definition'>date</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-128"></a><span class='hs-definition'>date</span> <span class='hs-varid'>fmt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>cal</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>getClockTime</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>toCalendarTime</span><span class='hs-layout'>)</span>
<a name="line-129"></a>                   <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>formatCalendarTime</span> <span class='hs-varid'>defaultTimeLocale</span> <span class='hs-varid'>fmt</span> <span class='hs-varid'>cal</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="loadAvg"></a><span class='hs-comment'>-- | Get the load average.  This assumes that you have a</span>
<a name="line-132"></a><span class='hs-comment'>--   utility called @\/usr\/bin\/uptime@ and that you have @sed@</span>
<a name="line-133"></a><span class='hs-comment'>--   installed; these are fairly common on GNU\/Linux systems but it</span>
<a name="line-134"></a><span class='hs-comment'>--   would be nice to make this more general.</span>
<a name="line-135"></a><span class='hs-definition'>loadAvg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-136"></a><span class='hs-definition'>loadAvg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>logCmd</span> <span class='hs-str'>"/usr/bin/uptime | sed 's/.*: //; s/,//g'"</span>
<a name="line-137"></a>
<a name="line-138"></a><a name="logCmd"></a><span class='hs-comment'>-- | Create a 'Logger' from an arbitrary shell command.</span>
<a name="line-139"></a><span class='hs-definition'>logCmd</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-140"></a><span class='hs-definition'>logCmd</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>out</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runInteractiveCommand</span> <span class='hs-varid'>c</span>
<a name="line-141"></a>                   <span class='hs-varid'>fmap</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>hGetLine</span> <span class='hs-varid'>out</span><span class='hs-layout'>)</span> <span class='hs-varop'>`catch`</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-142"></a>                   <span class='hs-comment'>-- no need to waitForProcess, we ignore SIGCHLD</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="logFileCount"></a><span class='hs-comment'>-- | Get a count of filtered files in a directory.</span>
<a name="line-145"></a><span class='hs-comment'>-- See 'maildirUnread' and 'maildirNew' source for usage examples.</span>
<a name="line-146"></a><span class='hs-definition'>logFileCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span>          <span class='hs-comment'>-- ^ directory in which to count files</span>
<a name="line-147"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- ^ predicate to match if file should be counted</span>
<a name="line-148"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-149"></a><span class='hs-definition'>logFileCount</span> <span class='hs-varid'>d</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-150"></a>    <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span> <span class='hs-varid'>getDirectoryContents</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-151"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Prelude</span><span class='hs-varop'>.</span><span class='hs-varid'>filter</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span>
<a name="line-152"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>of</span>
<a name="line-153"></a>        <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-154"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>show</span> <span class='hs-varid'>n</span>
<a name="line-155"></a>
<a name="line-156"></a><a name="maildirUnread"></a><span class='hs-comment'>-- | Get a count of unread mails in a maildir. For maildir format</span>
<a name="line-157"></a><span class='hs-comment'>-- details, to write loggers for other classes of mail, see</span>
<a name="line-158"></a><span class='hs-comment'>-- &lt;<a href="http://cr.yp.to/proto/maildir.html">http://cr.yp.to/proto/maildir.html</a>&gt; and 'logFileCount'.</span>
<a name="line-159"></a><span class='hs-definition'>maildirUnread</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-160"></a><span class='hs-definition'>maildirUnread</span> <span class='hs-varid'>mdir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>logFileCount</span> <span class='hs-layout'>(</span><span class='hs-varid'>mdir</span> <span class='hs-varop'>++</span> <span class='hs-str'>"/cur/"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>isSuffixOf</span> <span class='hs-str'>","</span><span class='hs-layout'>)</span>
<a name="line-161"></a>
<a name="line-162"></a><a name="maildirNew"></a><span class='hs-comment'>-- | Get a count of new mails in a maildir.</span>
<a name="line-163"></a><span class='hs-definition'>maildirNew</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-164"></a><span class='hs-definition'>maildirNew</span> <span class='hs-varid'>mdir</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>logFileCount</span> <span class='hs-layout'>(</span><span class='hs-varid'>mdir</span> <span class='hs-varop'>++</span> <span class='hs-str'>"/new/"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>isPrefixOf</span> <span class='hs-str'>"."</span><span class='hs-layout'>)</span>
<a name="line-165"></a>
<a name="line-166"></a><span class='hs-comment'>-- $xmonad</span>
<a name="line-167"></a><span class='hs-comment'>--</span>
<a name="line-168"></a><span class='hs-comment'>-- A very small sample of what you can log since you have access to X. For</span>
<a name="line-169"></a><span class='hs-comment'>-- example you can loggerize the number of windows on each workspace, or</span>
<a name="line-170"></a><span class='hs-comment'>-- titles on other workspaces, or the id of the previously focused workspace....</span>
<a name="line-171"></a>
<a name="line-172"></a><a name="logTitle"></a><span class='hs-comment'>-- | Get the title (name) of the focused window.</span>
<a name="line-173"></a><span class='hs-definition'>logTitle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-174"></a><span class='hs-definition'>logTitle</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-varid'>traverse</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getName</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span>
<a name="line-175"></a>
<a name="line-176"></a><a name="logLayout"></a><span class='hs-comment'>-- | Get the name of the current layout.</span>
<a name="line-177"></a><span class='hs-definition'>logLayout</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-178"></a><span class='hs-definition'>logLayout</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ld</span>
<a name="line-179"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>ld</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>description</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span>
<a name="line-180"></a>
<a name="line-181"></a><a name="logCurrent"></a><span class='hs-comment'>-- | Get the name of the current workspace.</span>
<a name="line-182"></a><span class='hs-definition'>logCurrent</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span>
<a name="line-183"></a><span class='hs-definition'>logCurrent</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>currentTag</span>
<a name="line-184"></a>
<a name="line-185"></a><span class='hs-comment'>-- $format</span>
<a name="line-186"></a><span class='hs-comment'>-- Combine logger formatting functions to make your</span>
<a name="line-187"></a><span class='hs-comment'>-- 'XMonad.Hooks.DynamicLog.ppExtras' more colorful and readable.</span>
<a name="line-188"></a><span class='hs-comment'>-- (For convenience this module exports 'Control.Applicative.&lt;$&gt;' to</span>
<a name="line-189"></a><span class='hs-comment'>-- use instead of \'.\' or \'$\' in hard to read formatting lines.</span>
<a name="line-190"></a><span class='hs-comment'>-- For example:</span>
<a name="line-191"></a><span class='hs-comment'>--</span>
<a name="line-192"></a><span class='hs-comment'>-- &gt; myLogHook = dynamicLogWithPP defaultPP {</span>
<a name="line-193"></a><span class='hs-comment'>-- &gt;     -- skipped</span>
<a name="line-194"></a><span class='hs-comment'>-- &gt;     , ppExtras = [lLoad, lTitle, logSp 3, wrapL "[" "]" $ date "%a %d %b"]</span>
<a name="line-195"></a><span class='hs-comment'>-- &gt;     , ppOrder = \(ws,l,_,xs) -&gt; [l,ws] ++ xs</span>
<a name="line-196"></a><span class='hs-comment'>-- &gt;     }</span>
<a name="line-197"></a><span class='hs-comment'>-- &gt;   where</span>
<a name="line-198"></a><span class='hs-comment'>-- &gt;     -- lTitle = fixedWidthL AlignCenter "." 99 . dzenColorL "cornsilk3" "" . padL . shortenL 80 $ logTitle</span>
<a name="line-199"></a><span class='hs-comment'>-- &gt;     -- or something like:</span>
<a name="line-200"></a><span class='hs-comment'>-- &gt;     lTitle = fixedWidthL AlignCenter "." 99 &lt;$&gt; dzenColorL "cornsilk3" "" &lt;$&gt; padL . shortenL 80 $ logTitle</span>
<a name="line-201"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-202"></a><span class='hs-comment'>-- &gt;     lLoad = dzenColorL "#6A5ACD" "" . wrapL loadIcon "   " . padL $ loadAvg</span>
<a name="line-203"></a><span class='hs-comment'>-- &gt;     loadIcon = " ^i(/home/me/.dzen/icons/load.xbm)"</span>
<a name="line-204"></a><span class='hs-comment'>--</span>
<a name="line-205"></a><span class='hs-comment'>-- Note: When applying 'shortenL' or 'fixedWidthL' to logger strings</span>
<a name="line-206"></a><span class='hs-comment'>-- containing colors or other formatting commands, apply the formatting</span>
<a name="line-207"></a><span class='hs-comment'>-- /after/ the length adjustment, or include \"invisible\" characters</span>
<a name="line-208"></a><span class='hs-comment'>-- in the length specification, e.g. in the above \'^fg(cornsilk3)\' and</span>
<a name="line-209"></a><span class='hs-comment'>-- \'^fg()' yields 19 invisible and 80 visible characters.</span>
<a name="line-210"></a>
<a name="line-211"></a><a name="onLogger"></a><span class='hs-comment'>-- | Use a string formatting function to edit a 'Logger' string.</span>
<a name="line-212"></a><span class='hs-comment'>-- For example, to create a tag function to prefix or label loggers,</span>
<a name="line-213"></a><span class='hs-comment'>-- as in \'tag: output\', use:</span>
<a name="line-214"></a><span class='hs-comment'>--</span>
<a name="line-215"></a><span class='hs-comment'>-- &gt; tagL l = onLogger $ wrap (l ++ ": ") ""</span>
<a name="line-216"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-217"></a><span class='hs-comment'>-- &gt;    tagL "bat" battery</span>
<a name="line-218"></a><span class='hs-comment'>-- &gt;    tagL "load" loadAvg</span>
<a name="line-219"></a><span class='hs-comment'>--</span>
<a name="line-220"></a><span class='hs-comment'>-- If you already have a (String -&gt; String) function you want to</span>
<a name="line-221"></a><span class='hs-comment'>-- apply to a logger:</span>
<a name="line-222"></a><span class='hs-comment'>--</span>
<a name="line-223"></a><span class='hs-comment'>-- &gt; revL = onLogger trim</span>
<a name="line-224"></a><span class='hs-comment'>--</span>
<a name="line-225"></a><span class='hs-comment'>-- See formatting utility source code for more 'onLogger' usage examples.</span>
<a name="line-226"></a><span class='hs-definition'>onLogger</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-227"></a><span class='hs-definition'>onLogger</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fmap</span>
<a name="line-228"></a>
<a name="line-229"></a><a name="wrapL"></a><span class='hs-comment'>-- | Wrap a logger's output in delimiters, unless it is @X (Nothing)@</span>
<a name="line-230"></a><span class='hs-comment'>-- or @X (Just \"\")@. Some examples:</span>
<a name="line-231"></a><span class='hs-comment'>--</span>
<a name="line-232"></a><span class='hs-comment'>-- &gt;    wrapL " | " " | " (date "%a %d %b") -- ' | Tue 19 Feb | '</span>
<a name="line-233"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-234"></a><span class='hs-comment'>-- &gt;    wrapL "bat: " "" battery            -- ' bat: battery_logger_output'</span>
<a name="line-235"></a><span class='hs-definition'>wrapL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-236"></a><span class='hs-definition'>wrapL</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>onLogger</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wrap</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span>
<a name="line-237"></a>
<a name="line-238"></a><a name="fixedWidthL"></a><span class='hs-comment'>-- | Make a logger's output constant width by padding with the given string,</span>
<a name="line-239"></a><span class='hs-comment'>-- /even if the logger is/ @X (Nothing)@ /or/ @X (Just \"\")@. Useful to</span>
<a name="line-240"></a><span class='hs-comment'>-- reduce visual noise as a title logger shrinks and grows, to use a fixed</span>
<a name="line-241"></a><span class='hs-comment'>-- width for a logger that sometimes becomes Nothing, or even to create</span>
<a name="line-242"></a><span class='hs-comment'>-- fancy spacers or character based art effects.</span>
<a name="line-243"></a><span class='hs-comment'>--</span>
<a name="line-244"></a><span class='hs-comment'>-- It fills missing logger output with a repeated character like \".\",</span>
<a name="line-245"></a><span class='hs-comment'>-- \":\" or pattern, like \" -.-\". The cycling padding string is reversed on</span>
<a name="line-246"></a><span class='hs-comment'>-- the left of the logger output. This is mainly useful with AlignCenter.</span>
<a name="line-247"></a><span class='hs-definition'>fixedWidthL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Align</span>  <span class='hs-comment'>-- ^ AlignCenter, AlignRight, or AlignLeft</span>
<a name="line-248"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ String to cycle to pad missing logger output</span>
<a name="line-249"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>    <span class='hs-comment'>-- ^ Fixed length to output (including invisible formatting characters)</span>
<a name="line-250"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-251"></a><span class='hs-definition'>fixedWidthL</span> <span class='hs-varid'>a</span> <span class='hs-varid'>str</span> <span class='hs-varid'>n</span> <span class='hs-varid'>logger</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-252"></a>    <span class='hs-varid'>mbl</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>logger</span>
<a name="line-253"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromMaybe</span> <span class='hs-str'>""</span> <span class='hs-varid'>mbl</span>
<a name="line-254"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>of</span>
<a name="line-255"></a>       <span class='hs-conid'>AlignCenter</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>toL</span> <span class='hs-layout'>(</span><span class='hs-varid'>take</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>padhalf</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-256"></a>       <span class='hs-conid'>AlignRight</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>toL</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-layout'>(</span><span class='hs-varid'>take</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reverse</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-257"></a>       <span class='hs-conid'>AlignLeft</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>toL</span> <span class='hs-layout'>(</span><span class='hs-varid'>take</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-258"></a>  <span class='hs-keyword'>where</span>
<a name="line-259"></a>    <span class='hs-varid'>toL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span>
<a name="line-260"></a>    <span class='hs-varid'>cs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cycle</span> <span class='hs-varid'>str</span>
<a name="line-261"></a>    <span class='hs-varid'>padhalf</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>$</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-varid'>length</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>cs</span>
<a name="line-262"></a>
<a name="line-263"></a><a name="logSp"></a><span class='hs-comment'>-- | Create a \"spacer\" logger, e.g. @logSp 3 -- loggerizes \'   \'@.</span>
<a name="line-264"></a><span class='hs-comment'>-- For more complex \"spacers\", use 'fixedWidthL' with @return Nothing@.</span>
<a name="line-265"></a><span class='hs-definition'>logSp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-266"></a><span class='hs-definition'>logSp</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>take</span> <span class='hs-varid'>n</span> <span class='hs-varop'>$</span> <span class='hs-varid'>cycle</span> <span class='hs-str'>" "</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="padL"></a><span class='hs-comment'>-- | Pad a logger's output with a leading and trailing space, unless it</span>
<a name="line-269"></a><span class='hs-comment'>-- is @X (Nothing)@ or @X (Just \"\")@.</span>
<a name="line-270"></a><span class='hs-definition'>padL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-271"></a><span class='hs-definition'>padL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>onLogger</span> <span class='hs-varid'>pad</span>
<a name="line-272"></a>
<a name="line-273"></a><a name="shortenL"></a><span class='hs-comment'>-- | Limit a logger's length, adding \"...\" if truncated.</span>
<a name="line-274"></a><span class='hs-definition'>shortenL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-275"></a><span class='hs-definition'>shortenL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>onLogger</span> <span class='hs-varop'>.</span> <span class='hs-varid'>shorten</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="dzenColorL"></a><span class='hs-comment'>-- | Color a logger's output with dzen foreground and background colors.</span>
<a name="line-278"></a><span class='hs-comment'>--</span>
<a name="line-279"></a><span class='hs-comment'>-- &gt;  dzenColorL "green" "#2A4C3F" battery</span>
<a name="line-280"></a><span class='hs-definition'>dzenColorL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-281"></a><span class='hs-definition'>dzenColorL</span> <span class='hs-varid'>fg</span> <span class='hs-varid'>bg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>onLogger</span> <span class='hs-varop'>$</span> <span class='hs-varid'>dzenColor</span> <span class='hs-varid'>fg</span> <span class='hs-varid'>bg</span>
<a name="line-282"></a>
<a name="line-283"></a><a name="xmobarColorL"></a><span class='hs-comment'>-- | Color a logger's output with xmobar foreground and background colors.</span>
<a name="line-284"></a><span class='hs-comment'>--</span>
<a name="line-285"></a><span class='hs-comment'>-- &gt;  xmobarColorL "#6A5ACD" "gray6" loadAverage</span>
<a name="line-286"></a><span class='hs-definition'>xmobarColorL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Logger</span>
<a name="line-287"></a><span class='hs-definition'>xmobarColorL</span> <span class='hs-varid'>fg</span> <span class='hs-varid'>bg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>onLogger</span> <span class='hs-varop'>$</span> <span class='hs-varid'>xmobarColor</span> <span class='hs-varid'>fg</span> <span class='hs-varid'>bg</span>
<a name="line-288"></a>
<a name="line-289"></a><span class='hs-comment'>-- todo</span>
<a name="line-290"></a><span class='hs-comment'>-- * dynamicLogXinerama logger? Or sorted onscreen Id's with "current" indicator?</span>
<a name="line-291"></a><span class='hs-comment'>-- is logCurrent really useful at all?</span>
<a name="line-292"></a><span class='hs-comment'>--</span>
<a name="line-293"></a><span class='hs-comment'>-- * ppVisible, etc. Resolve code dup. somehow. Refactor DynamicLog so can</span>
<a name="line-294"></a><span class='hs-comment'>-- be used for regular PP stuff /and/ loggers?</span>
<a name="line-295"></a><span class='hs-comment'>--</span>
<a name="line-296"></a><span class='hs-comment'>-- * fns for "ppExtras as a whole", combine loggers more nicely.</span>
<a name="line-297"></a><span class='hs-comment'>--</span>
<a name="line-298"></a><span class='hs-comment'>-- * parsers  to use with fixedWidthL to be smarter about invisible characters?</span>
</pre></body>
</html>