<?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://www.cs.york.ac.uk/fp/darcs/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 : <byorgey@gmail.com></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'><$></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'><$></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'>-- > 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'>-- > -- display load averages and a pithy quote along with xmonad status.</span> <a name="line-76"></a><span class='hs-comment'>-- > , logHook = dynamicLogWithPP $ defaultPP {</span> <a name="line-77"></a><span class='hs-comment'>-- > ppExtras = [ padL loadAvg, logCmd "fortune -n 40 -s" ]</span> <a name="line-78"></a><span class='hs-comment'>-- > }</span> <a name="line-79"></a><span class='hs-comment'>-- > -- 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@. <<a href="http://jpj.net/~trevor/aumix.html">http://jpj.net/~trevor/aumix.html</a>></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'>-- <<a href="http://www.cplusplus.com/reference/clibrary/ctime/strftime.html">http://www.cplusplus.com/reference/clibrary/ctime/strftime.html</a>>.</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'>-></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'><-</span> <span class='hs-layout'>(</span><span class='hs-varid'>getClockTime</span> <span class='hs-varop'>>>=</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'>-></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'><-</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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></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'>-></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'><-</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'>-></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'>-></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'>-- <<a href="http://cr.yp.to/proto/maildir.html">http://cr.yp.to/proto/maildir.html</a>> 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'>-></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'>-></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.<$>' 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'>-- > myLogHook = dynamicLogWithPP defaultPP {</span> <a name="line-193"></a><span class='hs-comment'>-- > -- skipped</span> <a name="line-194"></a><span class='hs-comment'>-- > , ppExtras = [lLoad, lTitle, logSp 3, wrapL "[" "]" $ date "%a %d %b"]</span> <a name="line-195"></a><span class='hs-comment'>-- > , ppOrder = \(ws,l,_,xs) -> [l,ws] ++ xs</span> <a name="line-196"></a><span class='hs-comment'>-- > }</span> <a name="line-197"></a><span class='hs-comment'>-- > where</span> <a name="line-198"></a><span class='hs-comment'>-- > -- lTitle = fixedWidthL AlignCenter "." 99 . dzenColorL "cornsilk3" "" . padL . shortenL 80 $ logTitle</span> <a name="line-199"></a><span class='hs-comment'>-- > -- or something like:</span> <a name="line-200"></a><span class='hs-comment'>-- > lTitle = fixedWidthL AlignCenter "." 99 <$> dzenColorL "cornsilk3" "" <$> padL . shortenL 80 $ logTitle</span> <a name="line-201"></a><span class='hs-comment'>-- ></span> <a name="line-202"></a><span class='hs-comment'>-- > lLoad = dzenColorL "#6A5ACD" "" . wrapL loadIcon " " . padL $ loadAvg</span> <a name="line-203"></a><span class='hs-comment'>-- > 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'>-- > tagL l = onLogger $ wrap (l ++ ": ") ""</span> <a name="line-216"></a><span class='hs-comment'>-- ></span> <a name="line-217"></a><span class='hs-comment'>-- > tagL "bat" battery</span> <a name="line-218"></a><span class='hs-comment'>-- > 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 -> 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'>-- > 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'>-></span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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'>-- > wrapL " | " " | " (date "%a %d %b") -- ' | Tue 19 Feb | '</span> <a name="line-233"></a><span class='hs-comment'>-- ></span> <a name="line-234"></a><span class='hs-comment'>-- > 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'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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'><-</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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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'>-- > 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'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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'>-- > 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'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Logger</span> <span class='hs-keyglyph'>-></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>