Sophie

Sophie

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

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/Hooks/ManageHelpers.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.Hooks.ManageHelpers</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright    : (c) Lukas Mai</span>
<a name="line-5"></a><span class='hs-comment'>-- License      : BSD</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer   : Lukas Mai &lt;l.mai@web.de&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'>-- This module provides helper functions to be used in @manageHook@. Here's</span>
<a name="line-12"></a><span class='hs-comment'>-- how you might use this:</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-- &gt; import XMonad.Hooks.ManageHelpers</span>
<a name="line-15"></a><span class='hs-comment'>-- &gt; main =</span>
<a name="line-16"></a><span class='hs-comment'>-- &gt;     xmonad defaultConfig{</span>
<a name="line-17"></a><span class='hs-comment'>-- &gt;         ...</span>
<a name="line-18"></a><span class='hs-comment'>-- &gt;         manageHook = composeOne [</span>
<a name="line-19"></a><span class='hs-comment'>-- &gt;             isKDETrayWindow -?&gt; doIgnore,</span>
<a name="line-20"></a><span class='hs-comment'>-- &gt;             transience,</span>
<a name="line-21"></a><span class='hs-comment'>-- &gt;             isFullscreen -?&gt; doFullFloat,</span>
<a name="line-22"></a><span class='hs-comment'>-- &gt;             resource =? "stalonetray" -?&gt; doIgnore</span>
<a name="line-23"></a><span class='hs-comment'>-- &gt;         ],</span>
<a name="line-24"></a><span class='hs-comment'>-- &gt;         ...</span>
<a name="line-25"></a><span class='hs-comment'>-- &gt;     }</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-keyword'>module</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'>ManageHelpers</span> <span class='hs-layout'>(</span>
<a name="line-28"></a>    <span class='hs-conid'>Side</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-29"></a>    <span class='hs-varid'>composeOne</span><span class='hs-layout'>,</span>
<a name="line-30"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>-?&gt;</span><span class='hs-layout'>)</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> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;==?</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;/=?</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>--&gt;&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>-?&gt;&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-31"></a>    <span class='hs-varid'>isInProperty</span><span class='hs-layout'>,</span>
<a name="line-32"></a>    <span class='hs-varid'>isKDETrayWindow</span><span class='hs-layout'>,</span>
<a name="line-33"></a>    <span class='hs-varid'>isFullscreen</span><span class='hs-layout'>,</span>
<a name="line-34"></a>    <span class='hs-varid'>isDialog</span><span class='hs-layout'>,</span>
<a name="line-35"></a>    <span class='hs-varid'>pid</span><span class='hs-layout'>,</span>
<a name="line-36"></a>    <span class='hs-varid'>transientTo</span><span class='hs-layout'>,</span>
<a name="line-37"></a>    <span class='hs-varid'>maybeToDefinite</span><span class='hs-layout'>,</span>
<a name="line-38"></a>    <span class='hs-conid'>MaybeManageHook</span><span class='hs-layout'>,</span>
<a name="line-39"></a>    <span class='hs-varid'>transience</span><span class='hs-layout'>,</span>
<a name="line-40"></a>    <span class='hs-varid'>transience'</span><span class='hs-layout'>,</span>
<a name="line-41"></a>    <span class='hs-varid'>doRectFloat</span><span class='hs-layout'>,</span>
<a name="line-42"></a>    <span class='hs-varid'>doFullFloat</span><span class='hs-layout'>,</span>
<a name="line-43"></a>    <span class='hs-varid'>doCenterFloat</span><span class='hs-layout'>,</span>
<a name="line-44"></a>    <span class='hs-varid'>doSideFloat</span><span class='hs-layout'>,</span>
<a name="line-45"></a>    <span class='hs-varid'>doFloatAt</span><span class='hs-layout'>,</span>
<a name="line-46"></a>    <span class='hs-varid'>doFloatDep</span><span class='hs-layout'>,</span>
<a name="line-47"></a>    <span class='hs-varid'>doHideIgnore</span>
<a name="line-48"></a><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span>
<a name="line-51"></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-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'>WindowProperties</span> <span class='hs-layout'>(</span><span class='hs-varid'>getProp32s</span><span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span> <span class='hs-layout'>(</span><span class='hs-conid'>ProcessID</span><span class='hs-layout'>)</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="Side"></a><span class='hs-comment'>-- | Denotes a side of a screen. @S@ stands for South, @NE@ for Northeast</span>
<a name="line-60"></a><a name="Side"></a><span class='hs-comment'>-- etc. @C@ stands for Center.</span>
<a name="line-61"></a><a name="Side"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Side</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SC</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NC</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CE</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CW</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SE</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SW</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NE</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NW</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span>
<a name="line-62"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="MaybeManageHook"></a><span class='hs-comment'>-- | A ManageHook that may or may not have been executed; the outcome is embedded in the Maybe</span>
<a name="line-65"></a><a name="MaybeManageHook"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>MaybeManageHook</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Endo</span> <span class='hs-conid'>WindowSet</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-66"></a><a name="Match"></a><span class='hs-comment'>-- | A grouping type, which can hold the outcome of a predicate Query.</span>
<a name="line-67"></a><a name="Match"></a><span class='hs-comment'>-- This is analogous to group types in regular expressions.</span>
<a name="line-68"></a><a name="Match"></a><span class='hs-comment'>-- TODO: create a better API for aggregating multiple Matches logically</span>
<a name="line-69"></a><a name="Match"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Match</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Match</span> <span class='hs-conid'>Bool</span> <span class='hs-varid'>a</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="composeOne"></a><span class='hs-comment'>-- | An alternative 'ManageHook' composer. Unlike 'composeAll' it stops as soon as</span>
<a name="line-72"></a><span class='hs-comment'>-- a candidate returns a 'Just' value, effectively running only the first match</span>
<a name="line-73"></a><span class='hs-comment'>-- (whereas 'composeAll' continues and executes all matching rules).</span>
<a name="line-74"></a><span class='hs-definition'>composeOne</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>MaybeManageHook</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-75"></a><span class='hs-definition'>composeOne</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>try</span> <span class='hs-varid'>idHook</span>
<a name="line-76"></a>    <span class='hs-keyword'>where</span>
<a name="line-77"></a>    <span class='hs-varid'>try</span> <span class='hs-varid'>q</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-78"></a>        <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>q</span>
<a name="line-79"></a>        <span class='hs-keyword'>case</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span>
<a name="line-80"></a>            <span class='hs-conid'>Just</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-81"></a>            <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>z</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>0</span> <span class='hs-varop'>-?&gt;</span><span class='hs-layout'>,</span> <span class='hs-varop'>--&gt;&gt;</span><span class='hs-layout'>,</span> <span class='hs-varop'>-?&gt;&gt;</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="/=?"></a><span class='hs-comment'>-- | q \/=? x. if the result of q equals x, return False</span>
<a name="line-86"></a><span class='hs-layout'>(</span><span class='hs-varop'>/=?</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Bool</span>
<a name="line-87"></a><a name="q"></a><span class='hs-definition'>q</span> <span class='hs-varop'>/=?</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varop'>/=</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>q</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="%3c==?"></a><span class='hs-comment'>-- | q &lt;==? x. if the result of q equals x, return True grouped with q</span>
<a name="line-90"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;==?</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Match</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-91"></a><span class='hs-definition'>q</span> <span class='hs-varop'>&lt;==?</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varop'>`eq`</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>q</span>
<a name="line-92"></a>    <span class='hs-keyword'>where</span>
<a name="line-93"></a>    <span class='hs-varid'>eq</span> <span class='hs-varid'>q'</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Match</span> <span class='hs-layout'>(</span><span class='hs-varid'>q'</span> <span class='hs-varop'>==</span> <span class='hs-varid'>x'</span><span class='hs-layout'>)</span> <span class='hs-varid'>q'</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="%3c/=?"></a><span class='hs-comment'>-- | q &lt;\/=? x. if the result of q notequals x, return True grouped with q</span>
<a name="line-96"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;/=?</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Match</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-97"></a><span class='hs-definition'>q</span> <span class='hs-varop'>&lt;/=?</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varop'>`neq`</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>q</span>
<a name="line-98"></a>    <span class='hs-keyword'>where</span>
<a name="line-99"></a>    <span class='hs-varid'>neq</span> <span class='hs-varid'>q'</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Match</span> <span class='hs-layout'>(</span><span class='hs-varid'>q'</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>x'</span><span class='hs-layout'>)</span> <span class='hs-varid'>q'</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="-?%3e"></a><span class='hs-comment'>-- | A helper operator for use in 'composeOne'. It takes a condition and an action;</span>
<a name="line-102"></a><span class='hs-comment'>-- if the condition fails, it returns 'Nothing' from the 'Query' so 'composeOne' will</span>
<a name="line-103"></a><span class='hs-comment'>-- go on and try the next rule.</span>
<a name="line-104"></a><span class='hs-layout'>(</span><span class='hs-varop'>-?&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeManageHook</span>
<a name="line-105"></a><a name="p"></a><span class='hs-definition'>p</span> <span class='hs-varop'>-?&gt;</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-106"></a>    <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-107"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>fmap</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="--%3e%3e"></a><span class='hs-comment'>-- | A helper operator for use in 'composeAll'. It takes a condition and a function taking a grouped datum to action.  If 'p' is true, it executes the resulting action.</span>
<a name="line-110"></a><span class='hs-layout'>(</span><span class='hs-varop'>--&gt;&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Match</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-111"></a><span class='hs-definition'>p</span> <span class='hs-varop'>--&gt;&gt;</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-112"></a>    <span class='hs-conid'>Match</span> <span class='hs-varid'>b</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-113"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>mempty</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="-?%3e%3e"></a><span class='hs-comment'>-- | A helper operator for use in 'composeOne'.  It takes a condition and a function taking a groupdatum to action.  If 'p' is true, it executes the resulting action.  If it fails, it returns 'Nothing' from the 'Query' so 'composeOne' will go on and try the next rule.</span>
<a name="line-116"></a><span class='hs-layout'>(</span><span class='hs-varop'>-?&gt;&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Match</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MaybeManageHook</span>
<a name="line-117"></a><span class='hs-definition'>p</span> <span class='hs-varop'>-?&gt;&gt;</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-118"></a>    <span class='hs-conid'>Match</span> <span class='hs-varid'>b</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-119"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>fmap</span>  <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="isKDETrayWindow"></a><span class='hs-comment'>-- | A predicate to check whether a window is a KDE system tray icon.</span>
<a name="line-122"></a><span class='hs-definition'>isKDETrayWindow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Bool</span>
<a name="line-123"></a><span class='hs-definition'>isKDETrayWindow</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftX</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-124"></a>    <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getProp32s</span> <span class='hs-str'>"_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR"</span> <span class='hs-varid'>w</span>
<a name="line-125"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-126"></a>        <span class='hs-conid'>Just</span> <span class='hs-keyglyph'>[</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-127"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-128"></a>
<a name="line-129"></a><a name="isInProperty"></a><span class='hs-comment'>-- | Helper to check if a window property contains certain value.</span>
<a name="line-130"></a><span class='hs-definition'>isInProperty</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'>Query</span> <span class='hs-conid'>Bool</span>
<a name="line-131"></a><span class='hs-definition'>isInProperty</span> <span class='hs-varid'>p</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftX</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-132"></a>    <span class='hs-varid'>va</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getAtom</span> <span class='hs-varid'>v</span>
<a name="line-133"></a>    <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getProp32s</span> <span class='hs-varid'>p</span> <span class='hs-varid'>w</span>
<a name="line-134"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-135"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>va</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>xs</span>
<a name="line-136"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-137"></a>
<a name="line-138"></a><a name="isFullscreen"></a><span class='hs-comment'>-- | A predicate to check whether a window wants to fill the whole screen.</span>
<a name="line-139"></a><span class='hs-comment'>-- See also 'doFullFloat'.</span>
<a name="line-140"></a><span class='hs-definition'>isFullscreen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Bool</span>
<a name="line-141"></a><span class='hs-definition'>isFullscreen</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isInProperty</span> <span class='hs-str'>"_NET_WM_STATE"</span> <span class='hs-str'>"_NET_WM_STATE_FULLSCREEN"</span>
<a name="line-142"></a>
<a name="line-143"></a><a name="isDialog"></a><span class='hs-comment'>-- | A predicate to check whether a window is a dialog.</span>
<a name="line-144"></a><span class='hs-definition'>isDialog</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>Bool</span>
<a name="line-145"></a><span class='hs-definition'>isDialog</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isInProperty</span> <span class='hs-str'>"_NET_WM_WINDOW_TYPE"</span> <span class='hs-str'>"_NET_WM_WINDOW_TYPE_DIALOG"</span>
<a name="line-146"></a>
<a name="line-147"></a><a name="pid"></a><span class='hs-definition'>pid</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>ProcessID</span><span class='hs-layout'>)</span>
<a name="line-148"></a><span class='hs-definition'>pid</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftX</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-149"></a>    <span class='hs-varid'>p</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getProp32s</span> <span class='hs-str'>"_NET_WM_PID"</span> <span class='hs-varid'>w</span>
<a name="line-150"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>of</span>
<a name="line-151"></a>        <span class='hs-conid'>Just</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-152"></a>        <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-153"></a>
<a name="line-154"></a><a name="transientTo"></a><span class='hs-comment'>-- | A predicate to check whether a window is Transient.</span>
<a name="line-155"></a><span class='hs-comment'>-- It holds the result which might be the window it is transient to</span>
<a name="line-156"></a><span class='hs-comment'>-- or it might be 'Nothing'.</span>
<a name="line-157"></a><span class='hs-definition'>transientTo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Window</span><span class='hs-layout'>)</span>
<a name="line-158"></a><span class='hs-definition'>transientTo</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-159"></a>    <span class='hs-varid'>w</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-160"></a>    <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftX</span> <span class='hs-varop'>.</span> <span class='hs-varid'>asks</span><span class='hs-layout'>)</span> <span class='hs-varid'>display</span>
<a name="line-161"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getTransientForHint</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-162"></a>
<a name="line-163"></a><a name="transience"></a><span class='hs-comment'>-- | A convenience 'MaybeManageHook' that will check to see if a window</span>
<a name="line-164"></a><span class='hs-comment'>-- is transient, and then move it to its parent.</span>
<a name="line-165"></a><span class='hs-definition'>transience</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MaybeManageHook</span>
<a name="line-166"></a><span class='hs-definition'>transience</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>transientTo</span> <span class='hs-varop'>&lt;/=?</span> <span class='hs-conid'>Nothing</span> <span class='hs-varop'>-?&gt;&gt;</span> <span class='hs-varid'>move</span>
<a name="line-167"></a>    <span class='hs-keyword'>where</span>
<a name="line-168"></a>    <span class='hs-varid'>move</span> <span class='hs-varid'>mw</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>idHook</span> <span class='hs-layout'>(</span><span class='hs-varid'>doF</span> <span class='hs-varop'>.</span> <span class='hs-varid'>move'</span><span class='hs-layout'>)</span> <span class='hs-varid'>mw</span>
<a name="line-169"></a>    <span class='hs-varid'>move'</span> <span class='hs-varid'>w</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>s</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'>shift</span><span class='hs-varop'>`</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>findTag</span> <span class='hs-varid'>w</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-170"></a>
<a name="line-171"></a><a name="transience'"></a><span class='hs-comment'>-- | 'transience' set to a 'ManageHook'</span>
<a name="line-172"></a><span class='hs-definition'>transience'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ManageHook</span>
<a name="line-173"></a><span class='hs-definition'>transience'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>maybeToDefinite</span> <span class='hs-varid'>transience</span>
<a name="line-174"></a>
<a name="line-175"></a><a name="maybeToDefinite"></a><span class='hs-comment'>-- | converts 'MaybeManageHook's to 'ManageHook's</span>
<a name="line-176"></a><span class='hs-definition'>maybeToDefinite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MaybeManageHook</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-177"></a><span class='hs-definition'>maybeToDefinite</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromMaybe</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>)</span>
<a name="line-178"></a>
<a name="line-179"></a>
<a name="line-180"></a><a name="doRectFloat"></a><span class='hs-comment'>-- | Floats the new window in the given rectangle.</span>
<a name="line-181"></a><span class='hs-definition'>doRectFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span>  <span class='hs-comment'>-- ^ The rectangle to float the window in. 0 to 1; x, y, w, h.</span>
<a name="line-182"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-183"></a><span class='hs-definition'>doRectFloat</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>doF</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>float</span> <span class='hs-varid'>w</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-184"></a>
<a name="line-185"></a><a name="doFullFloat"></a><span class='hs-comment'>-- | Floats the window and makes it use the whole screen. Equivalent to</span>
<a name="line-186"></a><span class='hs-comment'>-- @'doRectFloat' $ 'W.RationalRect' 0 0 1 1@.</span>
<a name="line-187"></a><span class='hs-definition'>doFullFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ManageHook</span>
<a name="line-188"></a><span class='hs-definition'>doFullFloat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doRectFloat</span> <span class='hs-varop'>$</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-num'>1</span> <span class='hs-num'>1</span>
<a name="line-189"></a>
<a name="line-190"></a><a name="doFloatDep"></a><span class='hs-comment'>-- | Floats a new window using a rectangle computed as a function of</span>
<a name="line-191"></a><span class='hs-comment'>--   the rectangle that it would have used by default.</span>
<a name="line-192"></a><span class='hs-definition'>doFloatDep</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-193"></a><span class='hs-definition'>doFloatDep</span> <span class='hs-varid'>move</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>doF</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>float</span> <span class='hs-varid'>w</span> <span class='hs-varop'>.</span> <span class='hs-varid'>move</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>liftX</span> <span class='hs-layout'>(</span><span class='hs-varid'>floatLocation</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-194"></a>
<a name="line-195"></a><a name="doFloatAt"></a><span class='hs-comment'>-- | Floats a new window with its original size, and its top left</span>
<a name="line-196"></a><span class='hs-comment'>--   corner at a specific point on the screen (both coordinates should</span>
<a name="line-197"></a><span class='hs-comment'>--   be in the range 0 to 1).</span>
<a name="line-198"></a><span class='hs-definition'>doFloatAt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-199"></a><span class='hs-definition'>doFloatAt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doFloatDep</span> <span class='hs-varid'>move</span>
<a name="line-200"></a>  <span class='hs-keyword'>where</span>
<a name="line-201"></a>    <span class='hs-varid'>move</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>w</span> <span class='hs-varid'>h</span>
<a name="line-202"></a>
<a name="line-203"></a><a name="doSideFloat"></a><span class='hs-comment'>-- | Floats a new window with its original size on the specified side of a</span>
<a name="line-204"></a><span class='hs-comment'>-- screen</span>
<a name="line-205"></a><span class='hs-definition'>doSideFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Side</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ManageHook</span>
<a name="line-206"></a><span class='hs-definition'>doSideFloat</span> <span class='hs-varid'>side</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doFloatDep</span> <span class='hs-varid'>move</span>
<a name="line-207"></a>  <span class='hs-keyword'>where</span>
<a name="line-208"></a>    <span class='hs-varid'>move</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>RationalRect</span> <span class='hs-varid'>cx</span> <span class='hs-varid'>cy</span> <span class='hs-varid'>w</span> <span class='hs-varid'>h</span>
<a name="line-209"></a>      <span class='hs-keyword'>where</span> <span class='hs-varid'>cx</span> <span class='hs-keyglyph'>=</span>      <span class='hs-keyword'>if</span> <span class='hs-varid'>side</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SC</span><span class='hs-layout'>,</span><span class='hs-conid'>C</span> <span class='hs-layout'>,</span><span class='hs-conid'>NC</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span>
<a name="line-210"></a>                 <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>side</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SW</span><span class='hs-layout'>,</span><span class='hs-conid'>CW</span><span class='hs-layout'>,</span><span class='hs-conid'>NW</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>then</span> <span class='hs-num'>0</span>
<a name="line-211"></a>                 <span class='hs-keyword'>else</span> <span class='hs-comment'>{- side `elem` [SE,CE,NE] -}</span>   <span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>w</span>
<a name="line-212"></a>            <span class='hs-varid'>cy</span> <span class='hs-keyglyph'>=</span>      <span class='hs-keyword'>if</span> <span class='hs-varid'>side</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CE</span><span class='hs-layout'>,</span><span class='hs-conid'>C</span> <span class='hs-layout'>,</span><span class='hs-conid'>CW</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span>
<a name="line-213"></a>                 <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>side</span> <span class='hs-varop'>`elem`</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NE</span><span class='hs-layout'>,</span><span class='hs-conid'>NC</span><span class='hs-layout'>,</span><span class='hs-conid'>NW</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>then</span> <span class='hs-num'>0</span>
<a name="line-214"></a>                 <span class='hs-keyword'>else</span> <span class='hs-comment'>{- side `elem` [SE,SC,SW] -}</span>   <span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>h</span>
<a name="line-215"></a>
<a name="line-216"></a><a name="doCenterFloat"></a><span class='hs-comment'>-- | Floats a new window with its original size, but centered.</span>
<a name="line-217"></a><span class='hs-definition'>doCenterFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ManageHook</span>
<a name="line-218"></a><span class='hs-definition'>doCenterFloat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doSideFloat</span> <span class='hs-conid'>C</span>
<a name="line-219"></a>
<a name="line-220"></a><a name="doHideIgnore"></a><span class='hs-comment'>-- | Hides window and ignores it.</span>
<a name="line-221"></a><span class='hs-definition'>doHideIgnore</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ManageHook</span>
<a name="line-222"></a><span class='hs-definition'>doHideIgnore</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ask</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftX</span> <span class='hs-layout'>(</span><span class='hs-varid'>hide</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>doF</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>delete</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
</pre></body>
</html>