Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > cbed4e2528cdf527c82a0e95aec0d683 > files > 85

ghc-xmonad-devel-0.9.1-5.fc14.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://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>XMonad/Operations.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -fno-warn-orphans #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_GHC -fglasgow-exts    #-}</span> <span class='hs-comment'>-- For deriving Data/Typeable</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, PatternGuards, TypeSynonymInstances #-}</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-comment'>-- --------------------------------------------------------------------------</span>
<a name="line-6"></a><span class='hs-comment'>-- |</span>
<a name="line-7"></a><span class='hs-comment'>-- Module      :  XMonad.Operations</span>
<a name="line-8"></a><span class='hs-comment'>-- Copyright   :  (c) Spencer Janssen 2007</span>
<a name="line-9"></a><span class='hs-comment'>-- License     :  BSD3-style (see LICENSE)</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- Maintainer  :  dons@cse.unsw.edu.au</span>
<a name="line-12"></a><span class='hs-comment'>-- Stability   :  unstable</span>
<a name="line-13"></a><span class='hs-comment'>-- Portability :  not portable, Typeable deriving, mtl, posix</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- Operations.</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Operations</span> <span class='hs-keyword'>where</span>
<a name="line-20"></a>
<a name="line-21"></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-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>XMonad</span><span class='hs-varop'>.</span><span class='hs-conid'>Layout</span> <span class='hs-layout'>(</span><span class='hs-conid'>Full</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-23"></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-24"></a>
<a name="line-25"></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-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span>          <span class='hs-layout'>(</span><span class='hs-conid'>Endo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-27"></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'>nub</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-varid'>find</span><span class='hs-layout'>)</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Bits</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'>.&amp;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>complement</span><span class='hs-layout'>)</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>M</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-32"></a>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Reader</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>State</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>C</span>
<a name="line-37"></a>
<a name="line-38"></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-39"></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-varop'>.</span><span class='hs-conid'>Process</span> <span class='hs-layout'>(</span><span class='hs-varid'>executeFile</span><span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>X11</span><span class='hs-varop'>.</span><span class='hs-conid'>Xlib</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>X11</span><span class='hs-varop'>.</span><span class='hs-conid'>Xinerama</span> <span class='hs-layout'>(</span><span class='hs-varid'>getScreenInfo</span><span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Graphics</span><span class='hs-varop'>.</span><span class='hs-conid'>X11</span><span class='hs-varop'>.</span><span class='hs-conid'>Xlib</span><span class='hs-varop'>.</span><span class='hs-conid'>Extras</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="manage"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-45"></a><span class='hs-comment'>-- |</span>
<a name="line-46"></a><span class='hs-comment'>-- Window manager operations</span>
<a name="line-47"></a><span class='hs-comment'>-- manage. Add a new window to be managed in the current workspace.</span>
<a name="line-48"></a><span class='hs-comment'>-- Bring it into focus.</span>
<a name="line-49"></a><span class='hs-comment'>--</span>
<a name="line-50"></a><span class='hs-comment'>-- Whether the window is already managed, or not, it is mapped, has its</span>
<a name="line-51"></a><span class='hs-comment'>-- border set, and its event mask set.</span>
<a name="line-52"></a><span class='hs-comment'>--</span>
<a name="line-53"></a><span class='hs-definition'>manage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-54"></a><span class='hs-definition'>manage</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>whenX</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>isClient</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-55"></a>    <span class='hs-varid'>sh</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWMNormalHints</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-56"></a>
<a name="line-57"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>isFixedSize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sh_min_size</span> <span class='hs-varid'>sh</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>Nothing</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>sh_min_size</span> <span class='hs-varid'>sh</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sh_max_size</span> <span class='hs-varid'>sh</span>
<a name="line-58"></a>    <span class='hs-varid'>isTransient</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>isJust</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>io</span> <span class='hs-layout'>(</span><span class='hs-varid'>getTransientForHint</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-59"></a>
<a name="line-60"></a>    <span class='hs-varid'>rr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>floatLocation</span> <span class='hs-varid'>w</span>
<a name="line-61"></a>    <span class='hs-comment'>-- ensure that float windows don't go over the edge of the screen</span>
<a name="line-62"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>adjust</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-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>wid</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-varid'>wid</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-varop'>||</span> <span class='hs-varid'>y</span> <span class='hs-varop'>+</span> <span class='hs-varid'>h</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-varop'>||</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>
<a name="line-63"></a>                                              <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-layout'>(</span><span class='hs-num'>0.5</span> <span class='hs-comment'>-</span> <span class='hs-varid'>wid</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-num'>0.5</span> <span class='hs-comment'>-</span> <span class='hs-varid'>h</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>wid</span> <span class='hs-varid'>h</span>
<a name="line-64"></a>        <span class='hs-varid'>adjust</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-65"></a>
<a name="line-66"></a>        <span class='hs-varid'>f</span> <span class='hs-varid'>ws</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isFixedSize</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isTransient</span> <span class='hs-keyglyph'>=</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-layout'>(</span><span class='hs-varid'>adjust</span> <span class='hs-varid'>rr</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'>insertUp</span> <span class='hs-varid'>w</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>view</span> <span class='hs-varid'>i</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ws</span>
<a name="line-67"></a>             <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>insertUp</span> <span class='hs-varid'>w</span> <span class='hs-varid'>ws</span>
<a name="line-68"></a>            <span class='hs-keyword'>where</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</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> <span class='hs-varid'>ws</span>
<a name="line-69"></a>
<a name="line-70"></a>    <span class='hs-varid'>mh</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>manageHook</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span>
<a name="line-71"></a>    <span class='hs-varid'>g</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>appEndo</span> <span class='hs-varop'>$</span> <span class='hs-varid'>userCodeDef</span> <span class='hs-layout'>(</span><span class='hs-conid'>Endo</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>runQuery</span> <span class='hs-varid'>mh</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-72"></a>    <span class='hs-varid'>windows</span> <span class='hs-layout'>(</span><span class='hs-varid'>g</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-73"></a>
<a name="line-74"></a><a name="unmanage"></a><span class='hs-comment'>-- | unmanage. A window no longer exists, remove it from the window</span>
<a name="line-75"></a><span class='hs-comment'>-- list, on whatever workspace it is.</span>
<a name="line-76"></a><span class='hs-comment'>--</span>
<a name="line-77"></a><span class='hs-definition'>unmanage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-78"></a><span class='hs-definition'>unmanage</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>windows</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>delete</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="killWindow"></a><span class='hs-comment'>-- | Kill the specified window. If we do kill it, we'll get a</span>
<a name="line-81"></a><span class='hs-comment'>-- delete notify back from X.</span>
<a name="line-82"></a><span class='hs-comment'>--</span>
<a name="line-83"></a><span class='hs-comment'>-- There are two ways to delete a window. Either just kill it, or if it</span>
<a name="line-84"></a><span class='hs-comment'>-- supports the delete protocol, send a delete event (e.g. firefox)</span>
<a name="line-85"></a><span class='hs-comment'>--</span>
<a name="line-86"></a><span class='hs-definition'>killWindow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-87"></a><span class='hs-definition'>killWindow</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-88"></a>    <span class='hs-varid'>wmdelt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>atom_WM_DELETE_WINDOW</span>  <span class='hs-layout'>;</span>  <span class='hs-varid'>wmprot</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>atom_WM_PROTOCOLS</span>
<a name="line-89"></a>
<a name="line-90"></a>    <span class='hs-varid'>protocols</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWMProtocols</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-91"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>wmdelt</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>protocols</span>
<a name="line-92"></a>        <span class='hs-keyword'>then</span> <span class='hs-varid'>allocaXEvent</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ev</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-93"></a>                <span class='hs-varid'>setEventType</span> <span class='hs-varid'>ev</span> <span class='hs-varid'>clientMessage</span>
<a name="line-94"></a>                <span class='hs-varid'>setClientMessageEvent</span> <span class='hs-varid'>ev</span> <span class='hs-varid'>w</span> <span class='hs-varid'>wmprot</span> <span class='hs-num'>32</span> <span class='hs-varid'>wmdelt</span> <span class='hs-num'>0</span>
<a name="line-95"></a>                <span class='hs-varid'>sendEvent</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-conid'>False</span> <span class='hs-varid'>noEventMask</span> <span class='hs-varid'>ev</span>
<a name="line-96"></a>        <span class='hs-keyword'>else</span> <span class='hs-varid'>killClient</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="kill"></a><span class='hs-comment'>-- | Kill the currently focused client.</span>
<a name="line-99"></a><span class='hs-definition'>kill</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-100"></a><span class='hs-definition'>kill</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withFocused</span> <span class='hs-varid'>killWindow</span>
<a name="line-101"></a>
<a name="line-102"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-103"></a><span class='hs-comment'>-- Managing windows</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="windows"></a><span class='hs-comment'>-- | windows. Modify the current window list with a pure function, and refresh</span>
<a name="line-106"></a><span class='hs-definition'>windows</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>WindowSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WindowSet</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-107"></a><span class='hs-definition'>windows</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-108"></a>    <span class='hs-conid'>XState</span> <span class='hs-layout'>{</span> <span class='hs-varid'>windowset</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-109"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>oldvisible</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>integrate'</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>stack</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-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-varid'>old</span> <span class='hs-conop'>:</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>visible</span> <span class='hs-varid'>old</span>
<a name="line-110"></a>        <span class='hs-varid'>newwindows</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>allWindows</span> <span class='hs-varid'>ws</span> <span class='hs-varop'>\\</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>allWindows</span> <span class='hs-varid'>old</span>
<a name="line-111"></a>        <span class='hs-varid'>ws</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>old</span>
<a name="line-112"></a>    <span class='hs-conid'>XConf</span> <span class='hs-layout'>{</span> <span class='hs-varid'>display</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-layout'>,</span> <span class='hs-varid'>normalBorder</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nbc</span><span class='hs-layout'>,</span> <span class='hs-varid'>focusedBorder</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fbc</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-113"></a>
<a name="line-114"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-varid'>setInitialProperties</span> <span class='hs-varid'>newwindows</span>
<a name="line-115"></a>
<a name="line-116"></a>    <span class='hs-varid'>whenJust</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span> <span class='hs-varid'>old</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>otherw</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setWindowBorder</span> <span class='hs-varid'>d</span> <span class='hs-varid'>otherw</span> <span class='hs-varid'>nbc</span>
<a name="line-117"></a>    <span class='hs-varid'>modify</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>windowset</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ws</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-118"></a>
<a name="line-119"></a>    <span class='hs-comment'>-- notify non visibility</span>
<a name="line-120"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>tags_oldvisible</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</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-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-varid'>old</span> <span class='hs-conop'>:</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>visible</span> <span class='hs-varid'>old</span>
<a name="line-121"></a>        <span class='hs-varid'>gottenhidden</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>elem</span> <span class='hs-varid'>tags_oldvisible</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</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'>hidden</span> <span class='hs-varid'>ws</span>
<a name="line-122"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>sendMessageWithNoRefresh</span> <span class='hs-conid'>Hide</span><span class='hs-layout'>)</span> <span class='hs-varid'>gottenhidden</span>
<a name="line-123"></a>
<a name="line-124"></a>    <span class='hs-comment'>-- for each workspace, layout the currently visible workspaces</span>
<a name="line-125"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>allscreens</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screens</span> <span class='hs-varid'>ws</span>
<a name="line-126"></a>        <span class='hs-varid'>summed_visible</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scanl</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>integrate'</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>stack</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-layout'>)</span> <span class='hs-varid'>allscreens</span>
<a name="line-127"></a>    <span class='hs-varid'>rects</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>concat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>forM</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-varid'>allscreens</span> <span class='hs-varid'>summed_visible</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>vis</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-128"></a>        <span class='hs-keyword'>let</span> <span class='hs-varid'>wsp</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-varid'>w</span>
<a name="line-129"></a>            <span class='hs-varid'>this</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>view</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ws</span>
<a name="line-130"></a>            <span class='hs-varid'>n</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</span> <span class='hs-varid'>wsp</span>
<a name="line-131"></a>            <span class='hs-varid'>tiled</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-varid'>stack</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> <span class='hs-varop'>$</span> <span class='hs-varid'>this</span><span class='hs-layout'>)</span>
<a name="line-132"></a>                    <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varop'>`</span><span class='hs-conid'>M</span><span class='hs-varop'>.</span><span class='hs-varid'>notMember</span><span class='hs-varop'>`</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>floating</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-133"></a>                    <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varop'>`notElem`</span> <span class='hs-varid'>vis</span><span class='hs-layout'>)</span>
<a name="line-134"></a>            <span class='hs-varid'>viewrect</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>screenRect</span> <span class='hs-varop'>$</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screenDetail</span> <span class='hs-varid'>w</span>
<a name="line-135"></a>
<a name="line-136"></a>        <span class='hs-comment'>-- just the tiled windows:</span>
<a name="line-137"></a>        <span class='hs-comment'>-- now tile the windows on this workspace, modified by the gap</span>
<a name="line-138"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>rs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ml'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runLayout</span> <span class='hs-varid'>wsp</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>stack</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tiled</span> <span class='hs-layout'>}</span> <span class='hs-varid'>viewrect</span> <span class='hs-varop'>`catchX`</span>
<a name="line-139"></a>                     <span class='hs-varid'>runLayout</span> <span class='hs-varid'>wsp</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>stack</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tiled</span><span class='hs-layout'>,</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Layout</span> <span class='hs-conid'>Full</span> <span class='hs-layout'>}</span> <span class='hs-varid'>viewrect</span>
<a name="line-140"></a>        <span class='hs-varid'>updateLayout</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ml'</span>
<a name="line-141"></a>
<a name="line-142"></a>        <span class='hs-keyword'>let</span> <span class='hs-varid'>m</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>floating</span> <span class='hs-varid'>ws</span>
<a name="line-143"></a>            <span class='hs-varid'>flt</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>fw</span><span class='hs-layout'>,</span> <span class='hs-varid'>scaleRationalRect</span> <span class='hs-varid'>viewrect</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-144"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>M</span><span class='hs-varop'>.</span><span class='hs-varid'>member</span> <span class='hs-varid'>m</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'>index</span> <span class='hs-varid'>this</span><span class='hs-layout'>)</span>
<a name="line-145"></a>                    <span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>M</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-varid'>fw</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-146"></a>            <span class='hs-varid'>vs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flt</span> <span class='hs-varop'>++</span> <span class='hs-varid'>rs</span>
<a name="line-147"></a>
<a name="line-148"></a>        <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>restackWindows</span> <span class='hs-varid'>d</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>fst</span> <span class='hs-varid'>vs</span><span class='hs-layout'>)</span>
<a name="line-149"></a>        <span class='hs-comment'>-- return the visible windows for this workspace:</span>
<a name="line-150"></a>        <span class='hs-varid'>return</span> <span class='hs-varid'>vs</span>
<a name="line-151"></a>
<a name="line-152"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>visible</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>fst</span> <span class='hs-varid'>rects</span>
<a name="line-153"></a>
<a name="line-154"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>uncurry</span> <span class='hs-varid'>tileWindow</span><span class='hs-layout'>)</span> <span class='hs-varid'>rects</span>
<a name="line-155"></a>
<a name="line-156"></a>    <span class='hs-varid'>whenJust</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setWindowBorder</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varid'>fbc</span>
<a name="line-157"></a>
<a name="line-158"></a>    <span class='hs-comment'>-- hide every window that was potentially visible before, but is not</span>
<a name="line-159"></a>    <span class='hs-comment'>-- given a position by a layout now.</span>
<a name="line-160"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-varid'>hide</span> <span class='hs-layout'>(</span><span class='hs-varid'>nub</span> <span class='hs-layout'>(</span><span class='hs-varid'>oldvisible</span> <span class='hs-varop'>++</span> <span class='hs-varid'>newwindows</span><span class='hs-layout'>)</span> <span class='hs-varop'>\\</span> <span class='hs-varid'>visible</span><span class='hs-layout'>)</span>
<a name="line-161"></a>
<a name="line-162"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-varid'>reveal</span> <span class='hs-varid'>visible</span>
<a name="line-163"></a>    <span class='hs-varid'>setTopFocus</span>
<a name="line-164"></a>
<a name="line-165"></a>    <span class='hs-comment'>-- all windows that are no longer in the windowset are marked as</span>
<a name="line-166"></a>    <span class='hs-comment'>-- withdrawn, it is important to do this after the above, otherwise 'hide'</span>
<a name="line-167"></a>    <span class='hs-comment'>-- will overwrite withdrawnState with iconicState</span>
<a name="line-168"></a>    <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>setWMState</span> <span class='hs-varid'>withdrawnState</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'>allWindows</span> <span class='hs-varid'>old</span> <span class='hs-varop'>\\</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>allWindows</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-169"></a>
<a name="line-170"></a>    <span class='hs-varid'>isMouseFocused</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>mouseFocused</span>
<a name="line-171"></a>    <span class='hs-varid'>unless</span> <span class='hs-varid'>isMouseFocused</span> <span class='hs-varop'>$</span> <span class='hs-varid'>clearEvents</span> <span class='hs-varid'>enterWindowMask</span>
<a name="line-172"></a>    <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>logHook</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>userCodeDef</span> <span class='hs-conid'>()</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="scaleRationalRect"></a><span class='hs-comment'>-- | Produce the actual rectangle from a screen and a ratio on that screen.</span>
<a name="line-175"></a><span class='hs-definition'>scaleRationalRect</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rectangle</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-keyglyph'>-&gt;</span> <span class='hs-conid'>Rectangle</span>
<a name="line-176"></a><span class='hs-definition'>scaleRationalRect</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rectangle</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>sw</span> <span class='hs-varid'>sh</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-conid'>RationalRect</span> <span class='hs-varid'>rx</span> <span class='hs-varid'>ry</span> <span class='hs-varid'>rw</span> <span class='hs-varid'>rh</span><span class='hs-layout'>)</span>
<a name="line-177"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Rectangle</span> <span class='hs-layout'>(</span><span class='hs-varid'>sx</span> <span class='hs-varop'>+</span> <span class='hs-varid'>scale</span> <span class='hs-varid'>sw</span> <span class='hs-varid'>rx</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>sy</span> <span class='hs-varop'>+</span> <span class='hs-varid'>scale</span> <span class='hs-varid'>sh</span> <span class='hs-varid'>ry</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>scale</span> <span class='hs-varid'>sw</span> <span class='hs-varid'>rw</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>scale</span> <span class='hs-varid'>sh</span> <span class='hs-varid'>rh</span><span class='hs-layout'>)</span>
<a name="line-178"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>scale</span> <span class='hs-varid'>s</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floor</span> <span class='hs-layout'>(</span><span class='hs-varid'>toRational</span> <span class='hs-varid'>s</span> <span class='hs-varop'>*</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-179"></a>
<a name="line-180"></a><a name="setWMState"></a><span class='hs-comment'>-- | setWMState.  set the WM_STATE property</span>
<a name="line-181"></a><span class='hs-definition'>setWMState</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-182"></a><span class='hs-definition'>setWMState</span> <span class='hs-varid'>w</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>dpy</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-183"></a>    <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>atom_WM_STATE</span>
<a name="line-184"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>changeProperty32</span> <span class='hs-varid'>dpy</span> <span class='hs-varid'>w</span> <span class='hs-varid'>a</span> <span class='hs-varid'>a</span> <span class='hs-varid'>propModeReplace</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>none</span><span class='hs-keyglyph'>]</span>
<a name="line-185"></a>
<a name="line-186"></a><a name="hide"></a><span class='hs-comment'>-- | hide. Hide a window by unmapping it, and setting Iconified.</span>
<a name="line-187"></a><span class='hs-definition'>hide</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-188"></a><span class='hs-definition'>hide</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>whenX</span> <span class='hs-layout'>(</span><span class='hs-varid'>gets</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>member</span> <span class='hs-varid'>w</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mapped</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-189"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>selectInput</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>clientMask</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>complement</span> <span class='hs-varid'>structureNotifyMask</span><span class='hs-layout'>)</span>
<a name="line-190"></a>            <span class='hs-varid'>unmapWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-191"></a>            <span class='hs-varid'>selectInput</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varid'>clientMask</span>
<a name="line-192"></a>    <span class='hs-varid'>setWMState</span> <span class='hs-varid'>w</span> <span class='hs-varid'>iconicState</span>
<a name="line-193"></a>    <span class='hs-comment'>-- this part is key: we increment the waitingUnmap counter to distinguish</span>
<a name="line-194"></a>    <span class='hs-comment'>-- between client and xmonad initiated unmaps.</span>
<a name="line-195"></a>    <span class='hs-varid'>modify</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>waitingUnmap</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>M</span><span class='hs-varop'>.</span><span class='hs-varid'>insertWith</span> <span class='hs-layout'>(</span><span class='hs-varop'>+</span><span class='hs-layout'>)</span> <span class='hs-varid'>w</span> <span class='hs-num'>1</span> <span class='hs-layout'>(</span><span class='hs-varid'>waitingUnmap</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-196"></a>                    <span class='hs-layout'>,</span> <span class='hs-varid'>mapped</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>delete</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapped</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="reveal"></a><span class='hs-comment'>-- | reveal. Show a window by mapping it and setting Normal</span>
<a name="line-199"></a><span class='hs-comment'>-- this is harmless if the window was already visible</span>
<a name="line-200"></a><span class='hs-definition'>reveal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-201"></a><span class='hs-definition'>reveal</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-202"></a>    <span class='hs-varid'>setWMState</span> <span class='hs-varid'>w</span> <span class='hs-varid'>normalState</span>
<a name="line-203"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mapWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-204"></a>    <span class='hs-varid'>modify</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mapped</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapped</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-205"></a>
<a name="line-206"></a><a name="clientMask"></a><span class='hs-comment'>-- | The client events that xmonad is interested in</span>
<a name="line-207"></a><span class='hs-definition'>clientMask</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EventMask</span>
<a name="line-208"></a><span class='hs-definition'>clientMask</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>structureNotifyMask</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>enterWindowMask</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>propertyChangeMask</span>
<a name="line-209"></a>
<a name="line-210"></a><a name="setInitialProperties"></a><span class='hs-comment'>-- | Set some properties when we initially gain control of a window</span>
<a name="line-211"></a><span class='hs-definition'>setInitialProperties</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-212"></a><span class='hs-definition'>setInitialProperties</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>normalBorder</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>nb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-213"></a>    <span class='hs-varid'>setWMState</span> <span class='hs-varid'>w</span> <span class='hs-varid'>iconicState</span>
<a name="line-214"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>selectInput</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varop'>$</span> <span class='hs-varid'>clientMask</span>
<a name="line-215"></a>    <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>borderWidth</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span>
<a name="line-216"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setWindowBorderWidth</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varid'>bw</span>
<a name="line-217"></a>    <span class='hs-comment'>-- we must initially set the color of new windows, to maintain invariants</span>
<a name="line-218"></a>    <span class='hs-comment'>-- required by the border setting in 'windows'</span>
<a name="line-219"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setWindowBorder</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varid'>nb</span>
<a name="line-220"></a>
<a name="line-221"></a><a name="refresh"></a><span class='hs-comment'>-- | refresh. Render the currently visible workspaces, as determined by</span>
<a name="line-222"></a><span class='hs-comment'>-- the 'StackSet'. Also, set focus to the focused window.</span>
<a name="line-223"></a><span class='hs-comment'>--</span>
<a name="line-224"></a><span class='hs-comment'>-- This is our 'view' operation (MVC), in that it pretty prints our model</span>
<a name="line-225"></a><span class='hs-comment'>-- with X calls.</span>
<a name="line-226"></a><span class='hs-comment'>--</span>
<a name="line-227"></a><span class='hs-definition'>refresh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-228"></a><span class='hs-definition'>refresh</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>windows</span> <span class='hs-varid'>id</span>
<a name="line-229"></a>
<a name="line-230"></a><a name="clearEvents"></a><span class='hs-comment'>-- | clearEvents.  Remove all events of a given type from the event queue.</span>
<a name="line-231"></a><span class='hs-definition'>clearEvents</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EventMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-232"></a><span class='hs-definition'>clearEvents</span> <span class='hs-varid'>mask</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-233"></a>    <span class='hs-varid'>sync</span> <span class='hs-varid'>d</span> <span class='hs-conid'>False</span>
<a name="line-234"></a>    <span class='hs-varid'>allocaXEvent</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fix</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>again</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-235"></a>        <span class='hs-varid'>more</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>checkMaskEvent</span> <span class='hs-varid'>d</span> <span class='hs-varid'>mask</span> <span class='hs-varid'>p</span>
<a name="line-236"></a>        <span class='hs-varid'>when</span> <span class='hs-varid'>more</span> <span class='hs-varid'>again</span> <span class='hs-comment'>-- beautiful</span>
<a name="line-237"></a>
<a name="line-238"></a><a name="tileWindow"></a><span class='hs-comment'>-- | tileWindow. Moves and resizes w such that it fits inside the given</span>
<a name="line-239"></a><span class='hs-comment'>-- rectangle, including its border.</span>
<a name="line-240"></a><span class='hs-definition'>tileWindow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rectangle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-241"></a><span class='hs-definition'>tileWindow</span> <span class='hs-varid'>w</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-242"></a>    <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>.</span> <span class='hs-varid'>wa_border_width</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>io</span> <span class='hs-layout'>(</span><span class='hs-varid'>getWindowAttributes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-243"></a>    <span class='hs-comment'>-- give all windows at least 1x1 pixels</span>
<a name="line-244"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>least</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>bw</span><span class='hs-varop'>*</span><span class='hs-num'>2</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-245"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-comment'>-</span> <span class='hs-varid'>bw</span><span class='hs-varop'>*</span><span class='hs-num'>2</span>
<a name="line-246"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>moveResizeWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_x</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_y</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-247"></a>                              <span class='hs-layout'>(</span><span class='hs-varid'>least</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rect_width</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>least</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rect_height</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-248"></a>
<a name="line-249"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-250"></a>
<a name="line-251"></a><a name="containedIn"></a><span class='hs-comment'>-- | Returns 'True' if the first rectangle is contained within, but not equal</span>
<a name="line-252"></a><span class='hs-comment'>-- to the second.</span>
<a name="line-253"></a><span class='hs-definition'>containedIn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rectangle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rectangle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-254"></a><span class='hs-definition'>containedIn</span> <span class='hs-varid'>r1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Rectangle</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>y1</span> <span class='hs-varid'>w1</span> <span class='hs-varid'>h1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Rectangle</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>y2</span> <span class='hs-varid'>w2</span> <span class='hs-varid'>h2</span><span class='hs-layout'>)</span>
<a name="line-255"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>and</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>r2</span>
<a name="line-256"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>x1</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>x2</span>
<a name="line-257"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>y1</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>y2</span>
<a name="line-258"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>w1</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x2</span> <span class='hs-varop'>+</span> <span class='hs-varid'>w2</span>
<a name="line-259"></a>       <span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>y1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>h1</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>y2</span> <span class='hs-varop'>+</span> <span class='hs-varid'>h2</span> <span class='hs-keyglyph'>]</span>
<a name="line-260"></a>
<a name="line-261"></a><a name="nubScreens"></a><span class='hs-comment'>-- | Given a list of screens, remove all duplicated screens and screens that</span>
<a name="line-262"></a><span class='hs-comment'>-- are entirely contained within another.</span>
<a name="line-263"></a><span class='hs-definition'>nubScreens</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Rectangle</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Rectangle</span><span class='hs-keyglyph'>]</span>
<a name="line-264"></a><span class='hs-definition'>nubScreens</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nub</span> <span class='hs-varop'>.</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>any</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`containedIn`</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>xs</span>
<a name="line-265"></a>
<a name="line-266"></a><a name="getCleanedScreenInfo"></a><span class='hs-comment'>-- | Cleans the list of screens according to the rules documented for</span>
<a name="line-267"></a><span class='hs-comment'>-- nubScreens.</span>
<a name="line-268"></a><span class='hs-definition'>getCleanedScreenInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Display</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Rectangle</span><span class='hs-keyglyph'>]</span>
<a name="line-269"></a><span class='hs-definition'>getCleanedScreenInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>io</span> <span class='hs-varop'>.</span>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>nubScreens</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getScreenInfo</span>
<a name="line-270"></a>
<a name="line-271"></a><a name="rescreen"></a><span class='hs-comment'>-- | rescreen.  The screen configuration may have changed (due to</span>
<a name="line-272"></a><span class='hs-comment'>-- xrandr), update the state and refresh the screen, and reset the gap.</span>
<a name="line-273"></a><span class='hs-definition'>rescreen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-274"></a><span class='hs-definition'>rescreen</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-275"></a>    <span class='hs-varid'>xinesc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varid'>getCleanedScreenInfo</span>
<a name="line-276"></a>
<a name="line-277"></a>    <span class='hs-varid'>windows</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ws</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'>StackSet</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>visible</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vs</span><span class='hs-layout'>,</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>hidden</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hs</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-278"></a>        <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>xinesc</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-varid'>vs</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-varid'>hs</span>
<a name="line-279"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zipWith3</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>Screen</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-conid'>SD</span> <span class='hs-varid'>xinesc</span>
<a name="line-280"></a>        <span class='hs-keyword'>in</span>  <span class='hs-varid'>ws</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span>
<a name="line-281"></a>               <span class='hs-layout'>,</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>visible</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>as</span>
<a name="line-282"></a>               <span class='hs-layout'>,</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>hidden</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ys</span> <span class='hs-layout'>}</span>
<a name="line-283"></a>
<a name="line-284"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-285"></a>
<a name="line-286"></a><a name="setButtonGrab"></a><span class='hs-comment'>-- | setButtonGrab. Tell whether or not to intercept clicks on a given window</span>
<a name="line-287"></a><span class='hs-definition'>setButtonGrab</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-288"></a><span class='hs-definition'>setButtonGrab</span> <span class='hs-varid'>grab</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span>
<a name="line-289"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>grab</span>
<a name="line-290"></a>        <span class='hs-keyword'>then</span> <span class='hs-varid'>forM_</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>button1</span><span class='hs-layout'>,</span> <span class='hs-varid'>button2</span><span class='hs-layout'>,</span> <span class='hs-varid'>button3</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-291"></a>            <span class='hs-varid'>grabButton</span> <span class='hs-varid'>d</span> <span class='hs-varid'>b</span> <span class='hs-varid'>anyModifier</span> <span class='hs-varid'>w</span> <span class='hs-conid'>False</span> <span class='hs-varid'>buttonPressMask</span>
<a name="line-292"></a>                       <span class='hs-varid'>grabModeAsync</span> <span class='hs-varid'>grabModeSync</span> <span class='hs-varid'>none</span> <span class='hs-varid'>none</span>
<a name="line-293"></a>        <span class='hs-keyword'>else</span> <span class='hs-varid'>ungrabButton</span> <span class='hs-varid'>d</span> <span class='hs-varid'>anyButton</span> <span class='hs-varid'>anyModifier</span> <span class='hs-varid'>w</span>
<a name="line-294"></a>
<a name="line-295"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-296"></a><span class='hs-comment'>-- Setting keyboard focus</span>
<a name="line-297"></a>
<a name="line-298"></a><a name="setTopFocus"></a><span class='hs-comment'>-- | Set the focus to the window on top of the stack, or root</span>
<a name="line-299"></a><span class='hs-definition'>setTopFocus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-300"></a><span class='hs-definition'>setTopFocus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>setFocusX</span> <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>theRoot</span><span class='hs-layout'>)</span> <span class='hs-varid'>setFocusX</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-301"></a>
<a name="line-302"></a><a name="focus"></a><span class='hs-comment'>-- | Set focus explicitly to window 'w' if it is managed by us, or root.</span>
<a name="line-303"></a><span class='hs-comment'>-- This happens if X notices we've moved the mouse (and perhaps moved</span>
<a name="line-304"></a><span class='hs-comment'>-- the mouse to a new screen).</span>
<a name="line-305"></a><span class='hs-definition'>focus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-306"></a><span class='hs-definition'>focus</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>local</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mouseFocused</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-307"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>stag</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span>
<a name="line-308"></a>        <span class='hs-varid'>curr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stag</span> <span class='hs-varop'>$</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-varid'>s</span>
<a name="line-309"></a>    <span class='hs-varid'>mnew</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>stag</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>uncurry</span> <span class='hs-varid'>pointScreen</span><span class='hs-layout'>)</span>
<a name="line-310"></a>            <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>mousePosition</span>
<a name="line-311"></a>    <span class='hs-varid'>root</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>theRoot</span>
<a name="line-312"></a>    <span class='hs-keyword'>case</span> <span class='hs-conid'>()</span> <span class='hs-keyword'>of</span>
<a name="line-313"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>member</span> <span class='hs-varid'>w</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span> <span class='hs-varid'>s</span> <span class='hs-varop'>/=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>windows</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>focusWindow</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-314"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>new</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mnew</span><span class='hs-layout'>,</span> <span class='hs-varid'>w</span> <span class='hs-varop'>==</span> <span class='hs-varid'>root</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>curr</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>new</span>
<a name="line-315"></a>                                               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>windows</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>view</span> <span class='hs-varid'>new</span><span class='hs-layout'>)</span>
<a name="line-316"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-317"></a>
<a name="line-318"></a><a name="setFocusX"></a><span class='hs-comment'>-- | Call X to set the keyboard focus details.</span>
<a name="line-319"></a><span class='hs-definition'>setFocusX</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-320"></a><span class='hs-definition'>setFocusX</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ws</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-321"></a>    <span class='hs-varid'>dpy</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>display</span>
<a name="line-322"></a>
<a name="line-323"></a>    <span class='hs-comment'>-- clear mouse button grab and border on other windows</span>
<a name="line-324"></a>    <span class='hs-varid'>forM_</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-varid'>ws</span> <span class='hs-conop'>:</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>visible</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>wk</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-325"></a>        <span class='hs-varid'>forM_</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>index</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>view</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-varid'>wk</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>otherw</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-326"></a>            <span class='hs-varid'>setButtonGrab</span> <span class='hs-conid'>True</span> <span class='hs-varid'>otherw</span>
<a name="line-327"></a>
<a name="line-328"></a>    <span class='hs-comment'>-- If we ungrab buttons on the root window, we lose our mouse bindings.</span>
<a name="line-329"></a>    <span class='hs-varid'>whenX</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>isRoot</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>setButtonGrab</span> <span class='hs-conid'>False</span> <span class='hs-varid'>w</span>
<a name="line-330"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>setInputFocus</span> <span class='hs-varid'>dpy</span> <span class='hs-varid'>w</span> <span class='hs-varid'>revertToPointerRoot</span> <span class='hs-num'>0</span>
<a name="line-331"></a>            <span class='hs-comment'>-- raiseWindow dpy w</span>
<a name="line-332"></a>
<a name="line-333"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-334"></a><span class='hs-comment'>-- Message handling</span>
<a name="line-335"></a>
<a name="line-336"></a><a name="sendMessage"></a><span class='hs-comment'>-- | Throw a message to the current 'LayoutClass' possibly modifying how we</span>
<a name="line-337"></a><span class='hs-comment'>-- layout the windows, then refresh.</span>
<a name="line-338"></a><span class='hs-definition'>sendMessage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Message</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'>X</span> <span class='hs-conid'>()</span>
<a name="line-339"></a><span class='hs-definition'>sendMessage</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-340"></a>    <span class='hs-varid'>w</span> <span class='hs-keyglyph'>&lt;-</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> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>windowset</span>
<a name="line-341"></a>    <span class='hs-varid'>ml'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>handleMessage</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>SomeMessage</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varop'>`catchX`</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span>
<a name="line-342"></a>    <span class='hs-varid'>whenJust</span> <span class='hs-varid'>ml'</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>l'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-343"></a>        <span class='hs-varid'>windows</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ws</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ws</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</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-varid'>current</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-344"></a>                                <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</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-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> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-345"></a>                                  <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l'</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-346"></a>
<a name="line-347"></a><a name="broadcastMessage"></a><span class='hs-comment'>-- | Send a message to all layouts, without refreshing.</span>
<a name="line-348"></a><span class='hs-definition'>broadcastMessage</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Message</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'>X</span> <span class='hs-conid'>()</span>
<a name="line-349"></a><span class='hs-definition'>broadcastMessage</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ws</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-350"></a>   <span class='hs-keyword'>let</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</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> <span class='hs-varop'>$</span> <span class='hs-varid'>ws</span>
<a name="line-351"></a>       <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</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'>visible</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ws</span>
<a name="line-352"></a>       <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>hidden</span> <span class='hs-varid'>ws</span>
<a name="line-353"></a>   <span class='hs-varid'>mapM_</span> <span class='hs-layout'>(</span><span class='hs-varid'>sendMessageWithNoRefresh</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-conop'>:</span> <span class='hs-varid'>v</span> <span class='hs-varop'>++</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-354"></a>
<a name="line-355"></a><a name="sendMessageWithNoRefresh"></a><span class='hs-comment'>-- | Send a message to a layout, without refreshing.</span>
<a name="line-356"></a><span class='hs-definition'>sendMessageWithNoRefresh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Message</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'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>Workspace</span> <span class='hs-conid'>WorkspaceId</span> <span class='hs-layout'>(</span><span class='hs-conid'>Layout</span> <span class='hs-conid'>Window</span><span class='hs-layout'>)</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-357"></a><span class='hs-definition'>sendMessageWithNoRefresh</span> <span class='hs-varid'>a</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span>
<a name="line-358"></a>    <span class='hs-varid'>handleMessage</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>SomeMessage</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varop'>`catchX`</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span> <span class='hs-varop'>&gt;&gt;=</span>
<a name="line-359"></a>    <span class='hs-varid'>updateLayout</span>  <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-360"></a>
<a name="line-361"></a><a name="updateLayout"></a><span class='hs-comment'>-- | Update the layout field of a workspace</span>
<a name="line-362"></a><span class='hs-definition'>updateLayout</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WorkspaceId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Layout</span> <span class='hs-conid'>Window</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-363"></a><span class='hs-definition'>updateLayout</span> <span class='hs-varid'>i</span> <span class='hs-varid'>ml</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>whenJust</span> <span class='hs-varid'>ml</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-364"></a>    <span class='hs-varid'>runOnWorkspaces</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ww</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</span> <span class='hs-varid'>ww</span> <span class='hs-varop'>==</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>ww</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span><span class='hs-layout'>}</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>ww</span>
<a name="line-365"></a>
<a name="line-366"></a><a name="setLayout"></a><span class='hs-comment'>-- | Set the layout of the currently viewed workspace</span>
<a name="line-367"></a><span class='hs-definition'>setLayout</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Layout</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-368"></a><span class='hs-definition'>setLayout</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-369"></a>    <span class='hs-varid'>ss</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'>StackSet</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</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'>Screen</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ws</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>windowset</span>
<a name="line-370"></a>    <span class='hs-varid'>handleMessage</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>SomeMessage</span> <span class='hs-conid'>ReleaseResources</span><span class='hs-layout'>)</span>
<a name="line-371"></a>    <span class='hs-varid'>windows</span> <span class='hs-varop'>$</span> <span class='hs-varid'>const</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ss</span> <span class='hs-layout'>{</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>workspace</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ws</span> <span class='hs-layout'>{</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>layout</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-layout'>}</span> <span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-372"></a>
<a name="line-373"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-374"></a><span class='hs-comment'>-- Utilities</span>
<a name="line-375"></a>
<a name="line-376"></a><a name="screenWorkspace"></a><span class='hs-comment'>-- | Return workspace visible on screen 'sc', or 'Nothing'.</span>
<a name="line-377"></a><span class='hs-definition'>screenWorkspace</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ScreenId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>WorkspaceId</span><span class='hs-layout'>)</span>
<a name="line-378"></a><span class='hs-definition'>screenWorkspace</span> <span class='hs-varid'>sc</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'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>lookupWorkspace</span> <span class='hs-varid'>sc</span>
<a name="line-379"></a>
<a name="line-380"></a><a name="withFocused"></a><span class='hs-comment'>-- | Apply an 'X' operation to the currently focused window, if there is one.</span>
<a name="line-381"></a><span class='hs-definition'>withFocused</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-382"></a><span class='hs-definition'>withFocused</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withWindowSet</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>whenJust</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varid'>f</span>
<a name="line-383"></a>
<a name="line-384"></a><a name="isClient"></a><span class='hs-comment'>-- | 'True' if window is under management by us</span>
<a name="line-385"></a><span class='hs-definition'>isClient</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>Bool</span>
<a name="line-386"></a><span class='hs-definition'>isClient</span> <span class='hs-varid'>w</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'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>member</span> <span class='hs-varid'>w</span>
<a name="line-387"></a>
<a name="line-388"></a><a name="extraModifiers"></a><span class='hs-comment'>-- | Combinations of extra modifier masks we need to grab keys\/buttons for.</span>
<a name="line-389"></a><span class='hs-comment'>-- (numlock and capslock)</span>
<a name="line-390"></a><span class='hs-definition'>extraModifiers</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>X</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>KeyMask</span><span class='hs-keyglyph'>]</span>
<a name="line-391"></a><span class='hs-definition'>extraModifiers</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-392"></a>    <span class='hs-varid'>nlm</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>numlockMask</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span>
<a name="line-393"></a>    <span class='hs-varid'>return</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>nlm</span><span class='hs-layout'>,</span> <span class='hs-varid'>lockMask</span><span class='hs-layout'>,</span> <span class='hs-varid'>nlm</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>lockMask</span> <span class='hs-keyglyph'>]</span>
<a name="line-394"></a>
<a name="line-395"></a><a name="cleanMask"></a><span class='hs-comment'>-- | Strip numlock\/capslock from a mask</span>
<a name="line-396"></a><span class='hs-definition'>cleanMask</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>KeyMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>KeyMask</span>
<a name="line-397"></a><span class='hs-definition'>cleanMask</span> <span class='hs-varid'>km</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-398"></a>    <span class='hs-varid'>nlm</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>numlockMask</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span>
<a name="line-399"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>complement</span> <span class='hs-layout'>(</span><span class='hs-varid'>nlm</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>lockMask</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>km</span><span class='hs-layout'>)</span>
<a name="line-400"></a>
<a name="line-401"></a><a name="initColor"></a><span class='hs-comment'>-- | Get the 'Pixel' value for a named color</span>
<a name="line-402"></a><span class='hs-definition'>initColor</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Display</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Pixel</span><span class='hs-layout'>)</span>
<a name="line-403"></a><span class='hs-definition'>initColor</span> <span class='hs-varid'>dpy</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-varid'>handle</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-404"></a>    <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>color_pixel</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fst</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>allocNamedColor</span> <span class='hs-varid'>dpy</span> <span class='hs-varid'>colormap</span> <span class='hs-varid'>c</span>
<a name="line-405"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>colormap</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultColormap</span> <span class='hs-varid'>dpy</span> <span class='hs-layout'>(</span><span class='hs-varid'>defaultScreen</span> <span class='hs-varid'>dpy</span><span class='hs-layout'>)</span>
<a name="line-406"></a>
<a name="line-407"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-408"></a>
<a name="line-409"></a><a name="restart"></a><span class='hs-comment'>-- | @restart name resume@. Attempt to restart xmonad by executing the program</span>
<a name="line-410"></a><span class='hs-comment'>-- @name@.  If @resume@ is 'True', restart with the current window state.</span>
<a name="line-411"></a><span class='hs-comment'>-- When executing another window manager, @resume@ should be 'False'.</span>
<a name="line-412"></a><span class='hs-definition'>restart</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-413"></a><span class='hs-definition'>restart</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>resume</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-414"></a>    <span class='hs-varid'>broadcastMessage</span> <span class='hs-conid'>ReleaseResources</span>
<a name="line-415"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>.</span> <span class='hs-varid'>flush</span> <span class='hs-varop'>=&lt;&lt;</span> <span class='hs-varid'>asks</span> <span class='hs-varid'>display</span>
<a name="line-416"></a>    <span class='hs-varid'>args</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>resume</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>gets</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-str'>"--resume"</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showWs</span> <span class='hs-varop'>.</span> <span class='hs-varid'>windowset</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-417"></a>    <span class='hs-varid'>catchIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>executeFile</span> <span class='hs-varid'>prog</span> <span class='hs-conid'>True</span> <span class='hs-varid'>args</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-418"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>showWs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>mapLayout</span> <span class='hs-varid'>show</span>
<a name="line-419"></a>
<a name="line-420"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-421"></a><span class='hs-comment'>-- | Floating layer support</span>
<a name="line-422"></a>
<a name="line-423"></a><a name="floatLocation"></a><span class='hs-comment'>-- | Given a window, find the screen it is located on, and compute</span>
<a name="line-424"></a><span class='hs-comment'>-- the geometry of that window wrt. that screen.</span>
<a name="line-425"></a><span class='hs-definition'>floatLocation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-layout'>(</span><span class='hs-conid'>ScreenId</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-layout'>)</span>
<a name="line-426"></a><span class='hs-definition'>floatLocation</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-427"></a>    <span class='hs-varid'>ws</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>windowset</span>
<a name="line-428"></a>    <span class='hs-varid'>wa</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWindowAttributes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-429"></a>    <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fi</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>asks</span> <span class='hs-layout'>(</span><span class='hs-varid'>borderWidth</span> <span class='hs-varop'>.</span> <span class='hs-varid'>config</span><span class='hs-layout'>)</span>
<a name="line-430"></a>    <span class='hs-varid'>sc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fromMaybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>current</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>pointScreen</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wa_x</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wa_y</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span>
<a name="line-431"></a>
<a name="line-432"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>sr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>screenRect</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screenDetail</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sc</span>
<a name="line-433"></a>        <span class='hs-varid'>rr</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-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_x</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span> <span class='hs-comment'>-</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_x</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>%</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_width</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-434"></a>                            <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_y</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span> <span class='hs-comment'>-</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_y</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>%</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_height</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-435"></a>                            <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_width</span>  <span class='hs-varid'>wa</span> <span class='hs-varop'>+</span> <span class='hs-varid'>bw</span><span class='hs-varop'>*</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varop'>%</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_width</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-436"></a>                            <span class='hs-layout'>(</span><span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_height</span> <span class='hs-varid'>wa</span> <span class='hs-varop'>+</span> <span class='hs-varid'>bw</span><span class='hs-varop'>*</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varop'>%</span> <span class='hs-varid'>fi</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_height</span> <span class='hs-varid'>sr</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-437"></a>
<a name="line-438"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screen</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sc</span><span class='hs-layout'>,</span> <span class='hs-varid'>rr</span><span class='hs-layout'>)</span>
<a name="line-439"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>fi</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span>
<a name="line-440"></a>
<a name="line-441"></a><a name="pointScreen"></a><span class='hs-comment'>-- | Given a point, determine the screen (if any) that contains it.</span>
<a name="line-442"></a><span class='hs-definition'>pointScreen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Position</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Position</span>
<a name="line-443"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-conid'>Screen</span> <span class='hs-conid'>WorkspaceId</span> <span class='hs-layout'>(</span><span class='hs-conid'>Layout</span> <span class='hs-conid'>Window</span><span class='hs-layout'>)</span> <span class='hs-conid'>Window</span> <span class='hs-conid'>ScreenId</span> <span class='hs-conid'>ScreenDetail</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-444"></a><span class='hs-definition'>pointScreen</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</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-varid'>find</span> <span class='hs-varid'>p</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screens</span>
<a name="line-445"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pointWithin</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varop'>.</span> <span class='hs-varid'>screenRect</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screenDetail</span>
<a name="line-446"></a>
<a name="line-447"></a><a name="pointWithin"></a><span class='hs-comment'>-- | @pointWithin x y r@ returns 'True' if the @(x, y)@ co-ordinate is within</span>
<a name="line-448"></a><span class='hs-comment'>-- @r@.</span>
<a name="line-449"></a><span class='hs-definition'>pointWithin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Position</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Position</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rectangle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-450"></a><span class='hs-definition'>pointWithin</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>rect_x</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-451"></a>                    <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span>  <span class='hs-varid'>rect_x</span> <span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_width</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-452"></a>                    <span class='hs-varid'>y</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>rect_y</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&amp;&amp;</span>
<a name="line-453"></a>                    <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;</span>  <span class='hs-varid'>rect_y</span> <span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>rect_height</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-454"></a>
<a name="line-455"></a><a name="float"></a><span class='hs-comment'>-- | Make a tiled window floating, using its suggested rectangle</span>
<a name="line-456"></a><span class='hs-definition'>float</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-457"></a><span class='hs-definition'>float</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-458"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>sc</span><span class='hs-layout'>,</span> <span class='hs-varid'>rr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>floatLocation</span> <span class='hs-varid'>w</span>
<a name="line-459"></a>    <span class='hs-varid'>windows</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>ws</span> <span class='hs-keyglyph'>-&gt;</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'>rr</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fromMaybe</span> <span class='hs-varid'>ws</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-460"></a>        <span class='hs-varid'>i</span>  <span class='hs-keyglyph'>&lt;-</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'>ws</span>
<a name="line-461"></a>        <span class='hs-varid'>guard</span> <span class='hs-varop'>$</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>tag</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-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>screens</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-462"></a>        <span class='hs-varid'>f</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>peek</span> <span class='hs-varid'>ws</span>
<a name="line-463"></a>        <span class='hs-varid'>sw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>lookupWorkspace</span> <span class='hs-varid'>sc</span> <span class='hs-varid'>ws</span>
<a name="line-464"></a>        <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>focusWindow</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-conid'>W</span><span class='hs-varop'>.</span><span class='hs-varid'>shiftWin</span> <span class='hs-varid'>sw</span> <span class='hs-varid'>w</span> <span class='hs-varop'>$</span> <span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-465"></a>
<a name="line-466"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-467"></a><span class='hs-comment'>-- Mouse handling</span>
<a name="line-468"></a>
<a name="line-469"></a><a name="mouseDrag"></a><span class='hs-comment'>-- | Accumulate mouse motion events</span>
<a name="line-470"></a><span class='hs-definition'>mouseDrag</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Position</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Position</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-471"></a><span class='hs-definition'>mouseDrag</span> <span class='hs-varid'>f</span> <span class='hs-varid'>done</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-472"></a>    <span class='hs-varid'>drag</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>dragging</span>
<a name="line-473"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>drag</span> <span class='hs-keyword'>of</span>
<a name="line-474"></a>        <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span> <span class='hs-comment'>-- error case? we're already dragging</span>
<a name="line-475"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-476"></a>            <span class='hs-conid'>XConf</span> <span class='hs-layout'>{</span> <span class='hs-varid'>theRoot</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>root</span><span class='hs-layout'>,</span> <span class='hs-varid'>display</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ask</span>
<a name="line-477"></a>            <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>grabPointer</span> <span class='hs-varid'>d</span> <span class='hs-varid'>root</span> <span class='hs-conid'>False</span> <span class='hs-layout'>(</span><span class='hs-varid'>buttonReleaseMask</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>pointerMotionMask</span><span class='hs-layout'>)</span>
<a name="line-478"></a>                    <span class='hs-varid'>grabModeAsync</span> <span class='hs-varid'>grabModeAsync</span> <span class='hs-varid'>none</span> <span class='hs-varid'>none</span> <span class='hs-varid'>currentTime</span>
<a name="line-479"></a>            <span class='hs-varid'>modify</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dragging</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>motion</span><span class='hs-layout'>,</span> <span class='hs-varid'>cleanup</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-480"></a> <span class='hs-keyword'>where</span>
<a name="line-481"></a>    <span class='hs-varid'>cleanup</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-482"></a>        <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-varid'>io</span> <span class='hs-varop'>.</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>ungrabPointer</span> <span class='hs-varid'>currentTime</span>
<a name="line-483"></a>        <span class='hs-varid'>modify</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dragging</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <span class='hs-layout'>}</span>
<a name="line-484"></a>        <span class='hs-varid'>done</span>
<a name="line-485"></a>    <span class='hs-varid'>motion</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-486"></a>                    <span class='hs-varid'>clearEvents</span> <span class='hs-varid'>pointerMotionMask</span>
<a name="line-487"></a>                    <span class='hs-varid'>return</span> <span class='hs-varid'>z</span>
<a name="line-488"></a>
<a name="line-489"></a><a name="mouseMoveWindow"></a><span class='hs-comment'>-- | XXX comment me</span>
<a name="line-490"></a><span class='hs-definition'>mouseMoveWindow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-491"></a><span class='hs-definition'>mouseMoveWindow</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>whenX</span> <span class='hs-layout'>(</span><span class='hs-varid'>isClient</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-492"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>raiseWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-493"></a>    <span class='hs-varid'>wa</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWindowAttributes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-494"></a>    <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-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>ox'</span><span class='hs-layout'>,</span> <span class='hs-varid'>oy'</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-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>queryPointer</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-495"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>ox</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>ox'</span>
<a name="line-496"></a>        <span class='hs-varid'>oy</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>oy'</span>
<a name="line-497"></a>    <span class='hs-varid'>mouseDrag</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ex</span> <span class='hs-varid'>ey</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>moveWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_x</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>ex</span> <span class='hs-comment'>-</span> <span class='hs-varid'>ox</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-498"></a>                                             <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_y</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>ey</span> <span class='hs-comment'>-</span> <span class='hs-varid'>oy</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-499"></a>              <span class='hs-layout'>(</span><span class='hs-varid'>float</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-500"></a>
<a name="line-501"></a><a name="mouseResizeWindow"></a><span class='hs-comment'>-- | XXX comment me</span>
<a name="line-502"></a><span class='hs-definition'>mouseResizeWindow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-conid'>()</span>
<a name="line-503"></a><span class='hs-definition'>mouseResizeWindow</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>whenX</span> <span class='hs-layout'>(</span><span class='hs-varid'>isClient</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-504"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>raiseWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-505"></a>    <span class='hs-varid'>wa</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWindowAttributes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-506"></a>    <span class='hs-varid'>sh</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWMNormalHints</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-507"></a>    <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>warpPointer</span> <span class='hs-varid'>d</span> <span class='hs-varid'>none</span> <span class='hs-varid'>w</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_width</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_height</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-508"></a>    <span class='hs-varid'>mouseDrag</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ex</span> <span class='hs-varid'>ey</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-509"></a>                 <span class='hs-varid'>io</span> <span class='hs-varop'>$</span> <span class='hs-varid'>resizeWindow</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span> <span class='hs-varop'>`uncurry`</span>
<a name="line-510"></a>                    <span class='hs-varid'>applySizeHintsContents</span> <span class='hs-varid'>sh</span> <span class='hs-layout'>(</span><span class='hs-varid'>ex</span> <span class='hs-comment'>-</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_x</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-511"></a>                                               <span class='hs-varid'>ey</span> <span class='hs-comment'>-</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>wa_y</span> <span class='hs-varid'>wa</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-512"></a>              <span class='hs-layout'>(</span><span class='hs-varid'>float</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-513"></a>
<a name="line-514"></a><span class='hs-comment'>-- ---------------------------------------------------------------------</span>
<a name="line-515"></a><span class='hs-comment'>-- | Support for window size hints</span>
<a name="line-516"></a>
<a name="line-517"></a><a name="D"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Dimension</span><span class='hs-layout'>,</span> <span class='hs-conid'>Dimension</span><span class='hs-layout'>)</span>
<a name="line-518"></a>
<a name="line-519"></a><a name="mkAdjust"></a><span class='hs-comment'>-- | Given a window, build an adjuster function that will reduce the given</span>
<a name="line-520"></a><span class='hs-comment'>-- dimensions according to the window's border width and size hints.</span>
<a name="line-521"></a><span class='hs-definition'>mkAdjust</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Window</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>X</span> <span class='hs-layout'>(</span><span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span><span class='hs-layout'>)</span>
<a name="line-522"></a><span class='hs-definition'>mkAdjust</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withDisplay</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-523"></a>    <span class='hs-varid'>sh</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getWMNormalHints</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-524"></a>    <span class='hs-varid'>bw</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>.</span> <span class='hs-varid'>wa_border_width</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getWindowAttributes</span> <span class='hs-varid'>d</span> <span class='hs-varid'>w</span>
<a name="line-525"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>applySizeHints</span> <span class='hs-varid'>bw</span> <span class='hs-varid'>sh</span>
<a name="line-526"></a>
<a name="line-527"></a><a name="applySizeHints"></a><span class='hs-comment'>-- | Reduce the dimensions if needed to comply to the given SizeHints, taking</span>
<a name="line-528"></a><span class='hs-comment'>-- window borders into account.</span>
<a name="line-529"></a><span class='hs-definition'>applySizeHints</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Dimension</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SizeHints</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-530"></a><span class='hs-definition'>applySizeHints</span> <span class='hs-varid'>bw</span> <span class='hs-varid'>sh</span> <span class='hs-keyglyph'>=</span>
<a name="line-531"></a>    <span class='hs-varid'>tmap</span> <span class='hs-layout'>(</span><span class='hs-varop'>+</span> <span class='hs-num'>2</span> <span class='hs-varop'>*</span> <span class='hs-varid'>bw</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>applySizeHintsContents</span> <span class='hs-varid'>sh</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>subtract</span> <span class='hs-varop'>$</span> <span class='hs-num'>2</span> <span class='hs-varop'>*</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>bw</span><span class='hs-layout'>)</span>
<a name="line-532"></a>    <span class='hs-keyword'>where</span>
<a name="line-533"></a>    <span class='hs-varid'>tmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-534"></a>
<a name="line-535"></a><a name="applySizeHintsContents"></a><span class='hs-comment'>-- | Reduce the dimensions if needed to comply to the given SizeHints.</span>
<a name="line-536"></a><span class='hs-definition'>applySizeHintsContents</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>SizeHints</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-537"></a><span class='hs-definition'>applySizeHintsContents</span> <span class='hs-varid'>sh</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-538"></a>    <span class='hs-varid'>applySizeHints'</span> <span class='hs-varid'>sh</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>max</span> <span class='hs-num'>1</span> <span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>max</span> <span class='hs-num'>1</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-539"></a>
<a name="line-540"></a><a name="applySizeHints'"></a><span class='hs-comment'>-- | XXX comment me</span>
<a name="line-541"></a><span class='hs-definition'>applySizeHints'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SizeHints</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-542"></a><span class='hs-definition'>applySizeHints'</span> <span class='hs-varid'>sh</span> <span class='hs-keyglyph'>=</span>
<a name="line-543"></a>      <span class='hs-varid'>maybe</span> <span class='hs-varid'>id</span> <span class='hs-varid'>applyMaxSizeHint</span>                   <span class='hs-layout'>(</span><span class='hs-varid'>sh_max_size</span>   <span class='hs-varid'>sh</span><span class='hs-layout'>)</span>
<a name="line-544"></a>    <span class='hs-varop'>.</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>bw</span><span class='hs-layout'>,</span> <span class='hs-varid'>bh</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-varop'>+</span><span class='hs-varid'>bw</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-varop'>+</span><span class='hs-varid'>bh</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>sh_base_size</span>  <span class='hs-varid'>sh</span><span class='hs-layout'>)</span>
<a name="line-545"></a>    <span class='hs-varop'>.</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>id</span> <span class='hs-varid'>applyResizeIncHint</span>                 <span class='hs-layout'>(</span><span class='hs-varid'>sh_resize_inc</span> <span class='hs-varid'>sh</span><span class='hs-layout'>)</span>
<a name="line-546"></a>    <span class='hs-varop'>.</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>id</span> <span class='hs-varid'>applyAspectHint</span>                    <span class='hs-layout'>(</span><span class='hs-varid'>sh_aspect</span>     <span class='hs-varid'>sh</span><span class='hs-layout'>)</span>
<a name="line-547"></a>    <span class='hs-varop'>.</span> <span class='hs-varid'>maybe</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>bw</span><span class='hs-layout'>,</span><span class='hs-varid'>bh</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-comment'>-</span><span class='hs-varid'>bw</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-comment'>-</span><span class='hs-varid'>bh</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>sh_base_size</span>  <span class='hs-varid'>sh</span><span class='hs-layout'>)</span>
<a name="line-548"></a>
<a name="line-549"></a><a name="applyAspectHint"></a><span class='hs-comment'>-- | Reduce the dimensions so their aspect ratio falls between the two given aspect ratios.</span>
<a name="line-550"></a><span class='hs-definition'>applyAspectHint</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>D</span><span class='hs-layout'>,</span> <span class='hs-conid'>D</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-551"></a><span class='hs-definition'>applyAspectHint</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>minx</span><span class='hs-layout'>,</span> <span class='hs-varid'>miny</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>maxx</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxy</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-552"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>or</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>minx</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>miny</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxx</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxy</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-553"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>*</span> <span class='hs-varid'>maxy</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>h</span> <span class='hs-varop'>*</span> <span class='hs-varid'>maxx</span>                         <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varop'>*</span> <span class='hs-varid'>maxx</span> <span class='hs-varop'>`div`</span> <span class='hs-varid'>maxy</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-554"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>*</span> <span class='hs-varid'>miny</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>h</span> <span class='hs-varop'>*</span> <span class='hs-varid'>minx</span>                         <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>w</span> <span class='hs-varop'>*</span> <span class='hs-varid'>miny</span> <span class='hs-varop'>`div`</span> <span class='hs-varid'>minx</span><span class='hs-layout'>)</span>
<a name="line-555"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-556"></a>
<a name="line-557"></a><a name="applyResizeIncHint"></a><span class='hs-comment'>-- | Reduce the dimensions so they are a multiple of the size increments.</span>
<a name="line-558"></a><span class='hs-definition'>applyResizeIncHint</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-559"></a><span class='hs-definition'>applyResizeIncHint</span> <span class='hs-layout'>(</span><span class='hs-varid'>iw</span><span class='hs-layout'>,</span><span class='hs-varid'>ih</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-560"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>iw</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>ih</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>w</span> <span class='hs-varop'>`mod`</span> <span class='hs-varid'>iw</span><span class='hs-layout'>,</span> <span class='hs-varid'>h</span> <span class='hs-comment'>-</span> <span class='hs-varid'>h</span> <span class='hs-varop'>`mod`</span> <span class='hs-varid'>ih</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>x</span>
<a name="line-561"></a>
<a name="line-562"></a><a name="applyMaxSizeHint"></a><span class='hs-comment'>-- | Reduce the dimensions if they exceed the given maximum dimensions.</span>
<a name="line-563"></a><span class='hs-definition'>applyMaxSizeHint</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>D</span>
<a name="line-564"></a><span class='hs-definition'>applyMaxSizeHint</span> <span class='hs-layout'>(</span><span class='hs-varid'>mw</span><span class='hs-layout'>,</span><span class='hs-varid'>mh</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span><span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-565"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>mw</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>mh</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>w</span> <span class='hs-varid'>mw</span><span class='hs-layout'>,</span><span class='hs-varid'>min</span> <span class='hs-varid'>h</span> <span class='hs-varid'>mh</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>x</span>
</pre></body>
</html>