mmagorsc/taskmonad

View on GitHub
docs/src/GridSelect.Extras.html

Summary

Maintainability
Test Coverage
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><link rel="stylesheet" type="text/css" href="style.css" /><script type="text/javascript" src="highlight.js"></script></head><body><pre><span class="hs-pragma">{-# LANGUAGE ScopedTypeVariables, TupleSections, GeneralizedNewtypeDeriving, TypeSynonymInstances, FlexibleInstances #-}</span><span>
</span><a name="line-2"></a><span class="hs-comment">-----------------------------------------------------------------------------</span><span>
</span><a name="line-3"></a><span class="hs-comment">-- |</span><span>
</span><a name="line-4"></a><span class="hs-comment">-- Module      :  GridSelect.Extras</span><span>
</span><a name="line-5"></a><span class="hs-comment">-- Copyright   :  Clemens Fruhwirth &lt;clemens@endorphin.org&gt;, Max Magorsch &lt;max@magorsch.de&gt;</span><span>
</span><a name="line-6"></a><span class="hs-comment">-- License     :  BSD-style (see LICENSE)</span><span>
</span><a name="line-7"></a><span class="hs-comment">--</span><span>
</span><a name="line-8"></a><span class="hs-comment">-- Maintainer  :  Max Magorsch &lt;max@magorsch.de&gt;</span><span>
</span><a name="line-9"></a><span class="hs-comment">-- Stability   :  unstable</span><span>
</span><a name="line-10"></a><span class="hs-comment">-- Portability :  unportable</span><span>
</span><a name="line-11"></a><span class="hs-comment">--</span><span>
</span><a name="line-12"></a><span class="hs-comment">-- GridSelect.Extras adds a method to [XMonad.Actions.GridSelect]</span><span>
</span><a name="line-13"></a><span class="hs-comment">-- (http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Actions-GridSelect.html)</span><span>
</span><a name="line-14"></a><span class="hs-comment">-- that displays a message at the top of the screen while using the normal GridSelect. </span><span>
</span><a name="line-15"></a><span class="hs-comment">--</span><span>
</span><a name="line-16"></a><span class="hs-comment">-----------------------------------------------------------------------------</span><span>
</span><a name="line-17"></a><span>
</span><a name="line-18"></a><span class="hs-keyword">module</span><span> </span><span class="hs-identifier">GridSelect.Extras</span><span>
</span><a name="line-19"></a><span>  </span><span class="hs-special">(</span><span>
</span><a name="line-20"></a><span>    </span><span class="hs-comment">-- * Usage</span><span>
</span><a name="line-21"></a><span>    </span><span class="hs-comment">-- $usage</span><span>
</span><a name="line-22"></a><span>    </span><a href="GridSelect.Extras.html#runSelectedActionWithMessageAndIcon"><span class="hs-identifier hs-var">runSelectedActionWithMessageAndIcon</span></a><span>
</span><a name="line-23"></a><span>  </span><span class="hs-special">,</span><span>
</span><a name="line-24"></a><span>
</span><a name="line-25"></a><span>    </span><span class="hs-comment">-- ** Screenshots</span><span>
</span><a name="line-26"></a><span>    </span><span class="hs-comment">-- $screenshots</span><span>
</span><a name="line-27"></a><span>
</span><a name="line-28"></a><span>    </span><span class="hs-comment">-- ** Customizing</span><span>
</span><a name="line-29"></a><span>    </span><span class="hs-comment">-- $customizing</span><span>
</span><a name="line-30"></a><span>
</span><a name="line-31"></a><span>    </span><span class="hs-comment">-- * Configuration</span><span>
</span><a name="line-32"></a><span>    </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span class="hs-special">(</span><span class="hs-glyph">..</span><span class="hs-special">)</span><span>
</span><a name="line-33"></a><span>  </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">def</span><span>
</span><a name="line-34"></a><span>  </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#buildDefaultGSConfig"><span class="hs-identifier hs-var">buildDefaultGSConfig</span></a><span>
</span><a name="line-35"></a><span>  </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span>
</span><a name="line-36"></a><span>  </span><span class="hs-special">)</span><span>
</span><a name="line-37"></a><span class="hs-keyword">where</span><span>
</span><a name="line-38"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.Maybe</span><span>
</span><a name="line-39"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.Bits</span><span>
</span><a name="line-40"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.Char</span><span>
</span><a name="line-41"></a><span class="hs-keyword">import</span><span> </span><span class="hs-keyword">qualified</span><span> </span><span class="hs-identifier">Data.Foldable</span><span>
</span><a name="line-42"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.Ord</span><span>                       </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">comparing</span><span> </span><span class="hs-special">)</span><span>
</span><a name="line-43"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Control.Applicative</span><span>
</span><a name="line-44"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Control.Monad.State</span><span>
</span><a name="line-45"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Control.Arrow</span><span>
</span><a name="line-46"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.List</span><span>                     </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">L</span><span>
</span><a name="line-47"></a><span class="hs-keyword">import</span><span> </span><span class="hs-keyword">qualified</span><span> </span><span class="hs-identifier">Data.Map</span><span>                      </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">M</span><span>
</span><a name="line-48"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad</span><span>                  </span><span class="hs-keyword">hiding</span><span> </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">liftX</span><span> </span><span class="hs-special">)</span><span>
</span><a name="line-49"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Util.Font</span><span>
</span><a name="line-50"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Prompt</span><span>                  </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">mkUnmanagedWindow</span><span> </span><span class="hs-special">)</span><span>
</span><a name="line-51"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.StackSet</span><span>               </span><span class="hs-keyword">as</span><span> </span><span class="hs-identifier">W</span><span>
</span><a name="line-52"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Layout.Decoration</span><span>
</span><a name="line-53"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Util.Image</span><span>
</span><a name="line-54"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Util.NamedWindows</span><span>
</span><a name="line-55"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Util.XUtils</span><span>
</span><a name="line-56"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">XMonad.Actions.WindowBringer</span><span>   </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">bringWindow</span><span> </span><span class="hs-special">)</span><span>
</span><a name="line-57"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Text.Printf</span><span>
</span><a name="line-58"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">System.Random</span><span>                  </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">mkStdGen</span><span>
</span><a name="line-59"></a><span>                                                </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">genRange</span><span>
</span><a name="line-60"></a><span>                                                </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">next</span><span>
</span><a name="line-61"></a><span>                                                </span><span class="hs-special">)</span><span>
</span><a name="line-62"></a><span class="hs-keyword">import</span><span>           </span><span class="hs-identifier">Data.Word</span><span>                      </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-type">Word8</span><span> </span><span class="hs-special">)</span><span>
</span><a name="line-63"></a><span>
</span><a name="line-64"></a><span class="hs-comment">-- $usage</span><span>
</span><a name="line-65"></a><span class="hs-comment">--</span><span>
</span><a name="line-66"></a><span class="hs-comment">-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:</span><span>
</span><a name="line-67"></a><span class="hs-comment">--</span><span>
</span><a name="line-68"></a><span class="hs-comment">-- &gt;    import qualified GridSelect.Extras</span><span>
</span><a name="line-69"></a><span class="hs-comment">--</span><span>
</span><a name="line-70"></a><span class="hs-comment">-- Then add a keybinding, e.g.</span><span>
</span><a name="line-71"></a><span class="hs-comment">--</span><span>
</span><a name="line-72"></a><span class="hs-comment">-- &gt;    , ((modm, xK_g), gridselect gsconfig message actions)</span><span>
</span><a name="line-73"></a><span class="hs-comment">-- &gt;         where</span><span>
</span><a name="line-74"></a><span class="hs-comment">-- &gt;            gridselect = GridSelect.Extras.runSelectedActionWithMessage</span><span>
</span><a name="line-75"></a><span class="hs-comment">-- &gt;            gsconfig   = GridSelect.Extras.def</span><span>
</span><a name="line-76"></a><span class="hs-comment">-- &gt;            message    = &quot;Please choose an option:&quot;</span><span>
</span><a name="line-77"></a><span class="hs-comment">-- &gt;            actions    = [ (&quot;Option #1&quot;, unsafeSpawn &quot;notify-send 'Option #1'&quot;),</span><span>
</span><a name="line-78"></a><span class="hs-comment">-- &gt;                           (&quot;Option #2&quot;, unsafeSpawn &quot;notify-send 'Option #2'&quot;) ]</span><span>
</span><a name="line-79"></a><span class="hs-comment">--</span><span>
</span><a name="line-80"></a><span class="hs-comment">--</span><span>
</span><a name="line-81"></a><span class="hs-comment">-- This module also supports displaying an icon in the message window. To do so, just use 'runSelectedActionWithMessageAndIcon' like so:</span><span>
</span><a name="line-82"></a><span class="hs-comment">--</span><span>
</span><a name="line-83"></a><span class="hs-comment">-- &gt;    , ((modm, xK_g), gridselect gsconfig message icon actions)</span><span>
</span><a name="line-84"></a><span class="hs-comment">-- &gt;         where</span><span>
</span><a name="line-85"></a><span class="hs-comment">-- &gt;             gridselect = GridSelect.Extras.runSelectedActionWithMessageAndIcon</span><span>
</span><a name="line-86"></a><span class="hs-comment">-- &gt;             icon       = [[True,  False, False],</span><span>
</span><a name="line-87"></a><span class="hs-comment">-- &gt;                           [False, True,  False],</span><span>
</span><a name="line-88"></a><span class="hs-comment">-- &gt;                           [True,  False, True ]]</span><span>
</span><a name="line-89"></a><span class="hs-comment">-- &gt;             -- ...  </span><span>
</span><a name="line-90"></a><span class="hs-comment">--</span><span>
</span><a name="line-91"></a><span class="hs-comment">--</span><span>
</span><a name="line-92"></a><span class="hs-comment">-- $screenshots</span><span>
</span><a name="line-93"></a><span class="hs-comment">--</span><span>
</span><a name="line-94"></a><span class="hs-comment">-- Selecting an action:</span><span>
</span><a name="line-95"></a><span class="hs-comment">--</span><span>
</span><a name="line-96"></a><span class="hs-comment">-- &lt;&lt;./gridselect-extras.png&gt;&gt;</span><span>
</span><a name="line-97"></a><span class="hs-comment">--</span><span>
</span><a name="line-98"></a><span class="hs-comment">--</span><span>
</span><a name="line-99"></a><span class="hs-comment">--</span><span>
</span><a name="line-100"></a><span class="hs-comment">-- $customizing</span><span>
</span><a name="line-101"></a><span class="hs-comment">--</span><span>
</span><a name="line-102"></a><span class="hs-comment">-- It is possible to customize GridSelect.Extras the same way GridSelect is customized. Please refer to the [GridSelect Documentation](http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Actions-GridSelect.html) for further information.</span><span>
</span><a name="line-103"></a><span>
</span><a name="line-104"></a><span class="hs-comment">-- | The 'Default' instance gives a basic configuration for 'gridselect', with</span><span>
</span><a name="line-105"></a><span class="hs-comment">-- the colorizer chosen based on the type.</span><span>
</span><a name="line-106"></a><span class="hs-comment">--</span><span>
</span><a name="line-107"></a><span class="hs-comment">-- If you want to replace the 'gs_colorizer' field, use 'buildDefaultGSConfig'</span><span>
</span><a name="line-108"></a><span class="hs-comment">-- instead of 'def' to avoid ambiguous type variables.</span><span>
</span><a name="line-109"></a><span class="hs-keyword">data</span><span> </span><a name="GSConfig"><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier">GSConfig</span></a></a><span> </span><a name="local-6989586621679026272"><a href="#local-6989586621679026272"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="GSConfig"><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier">GSConfig</span></a></a><span> </span><span class="hs-special">{</span><span>
</span><a name="line-110"></a><span>      </span><a name="gs_cellheight"><a href="GridSelect.Extras.html#gs_cellheight"><span class="hs-identifier">gs_cellheight</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span>
</span><a name="line-111"></a><span>      </span><a name="gs_cellwidth"><a href="GridSelect.Extras.html#gs_cellwidth"><span class="hs-identifier">gs_cellwidth</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span>
</span><a name="line-112"></a><span>      </span><a name="gs_cellpadding"><a href="GridSelect.Extras.html#gs_cellpadding"><span class="hs-identifier">gs_cellpadding</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span>
</span><a name="line-113"></a><span>      </span><a name="gs_colorizer"><a href="GridSelect.Extras.html#gs_colorizer"><span class="hs-identifier">gs_colorizer</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="#local-6989586621679026272"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span class="hs-special">,</span><span>
</span><a name="line-114"></a><span>      </span><a name="gs_font"><a href="GridSelect.Extras.html#gs_font"><span class="hs-identifier">gs_font</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span>
</span><a name="line-115"></a><span>      </span><a name="gs_navigate"><a href="GridSelect.Extras.html#gs_navigate"><span class="hs-identifier">gs_navigate</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679026272"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679026272"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">,</span><span>
</span><a name="line-116"></a><span>      </span><a name="gs_rearranger"><a href="GridSelect.Extras.html#gs_rearranger"><span class="hs-identifier">gs_rearranger</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#Rearranger"><span class="hs-identifier hs-type">Rearranger</span></a><span> </span><a href="#local-6989586621679026272"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span>
</span><a name="line-117"></a><span>      </span><a name="gs_originFractX"><a href="GridSelect.Extras.html#gs_originFractX"><span class="hs-identifier">gs_originFractX</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Double</span><span class="hs-special">,</span><span>
</span><a name="line-118"></a><span>      </span><a name="gs_originFractY"><a href="GridSelect.Extras.html#gs_originFractY"><span class="hs-identifier">gs_originFractY</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Double</span><span class="hs-special">,</span><span>
</span><a name="line-119"></a><span>      </span><a name="gs_bordercolor"><a href="GridSelect.Extras.html#gs_bordercolor"><span class="hs-identifier">gs_bordercolor</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-120"></a><span class="hs-special">}</span><span>
</span><a name="line-121"></a><span>
</span><a name="line-122"></a><span class="hs-comment">-- | That is 'fromClassName' if you are selecting a 'Window', or</span><span>
</span><a name="line-123"></a><span class="hs-comment">-- 'defaultColorizer' if you are selecting a 'String'. The catch-all instance</span><span>
</span><a name="line-124"></a><span class="hs-comment">-- @HasColorizer a@ uses the 'focusedBorderColor' and 'normalBorderColor'</span><span>
</span><a name="line-125"></a><span class="hs-comment">-- colors.</span><span>
</span><a name="line-126"></a><span class="hs-keyword">class</span><span> </span><a name="HasColorizer"><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier">HasColorizer</span></a></a><span> </span><a name="local-6989586621679024430"><a href="#local-6989586621679024430"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-127"></a><span>    </span><a name="defaultColorizer"><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier">defaultColorizer</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="#local-6989586621679024430"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-128"></a><span>
</span><a name="line-129"></a><span class="hs-keyword">instance</span><span> </span><span class="hs-pragma">{-# OVERLAPPING</span><span> </span><span class="hs-pragma">#-}</span><span> </span><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier hs-type">HasColorizer</span></a><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-130"></a><span>    </span><a name="local-8214565720323796334"><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier">defaultColorizer</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#fromClassName"><span class="hs-identifier hs-var">fromClassName</span></a><span>
</span><a name="line-131"></a><span>
</span><a name="line-132"></a><span class="hs-keyword">instance</span><span> </span><span class="hs-pragma">{-# OVERLAPPING</span><span> </span><span class="hs-pragma">#-}</span><span> </span><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier hs-type">HasColorizer</span></a><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-133"></a><span>    </span><a name="local-8214565720323796334"><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier">defaultColorizer</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#stringColorizer"><span class="hs-identifier hs-var">stringColorizer</span></a><span>
</span><a name="line-134"></a><span>
</span><a name="line-135"></a><span class="hs-keyword">instance</span><span> </span><span class="hs-pragma">{-# OVERLAPPING</span><span> </span><span class="hs-pragma">#-}</span><span> </span><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier hs-type">HasColorizer</span></a><span> </span><a href="#local-6989586621679026275"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-136"></a><span>    </span><a name="local-8214565720323796334"><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier">defaultColorizer</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><a name="local-6989586621679026276"><a href="#local-6989586621679026276"><span class="hs-identifier">isFg</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-137"></a><span>        </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679026277"><a href="#local-6989586621679026277"><span class="hs-identifier">getColor</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679026276"><span class="hs-identifier hs-var">isFg</span></a><span> </span><span class="hs-keyword">then</span><span> </span><span class="hs-identifier">focusedBorderColor</span><span> </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier">normalBorderColor</span><span>
</span><a name="line-138"></a><span>        </span><span class="hs-keyword">in</span><span> </span><span class="hs-identifier hs-var">asks</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;black&quot;</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a href="#local-6989586621679026277"><span class="hs-identifier hs-var">getColor</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">config</span><span>
</span><a name="line-139"></a><span>
</span><a name="line-140"></a><span class="hs-keyword">instance</span><span> </span><span class="hs-pragma">{-# OVERLAPPING</span><span> </span><span class="hs-pragma">#-}</span><span> </span><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier hs-type">HasColorizer</span></a><span> </span><a href="#local-6989586621679026274"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">=&gt;</span><span> </span><span class="hs-identifier hs-type">Default</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679026274"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-141"></a><span>    </span><a name="local-8214565720323789094"><span class="hs-identifier">def</span></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#buildDefaultGSConfig"><span class="hs-identifier hs-var">buildDefaultGSConfig</span></a><span> </span><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier hs-var">defaultColorizer</span></a><span>
</span><a name="line-142"></a><span>
</span><a name="line-143"></a><span class="hs-pragma">{-# DEPRECATED</span><span> </span><span class="hs-pragma">defaultGSConfig</span><span> </span><span class="hs-pragma">&quot;Use def (from Data.Default, and re-exported from XMonad.Actions.GridSelect) instead.&quot;</span><span> </span><span class="hs-pragma">#-}</span><span>
</span><a name="line-144"></a><span class="hs-identifier">defaultGSConfig</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#HasColorizer"><span class="hs-identifier hs-type">HasColorizer</span></a><span> </span><a href="#local-6989586621679034570"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">=&gt;</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679034570"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-145"></a><a name="defaultGSConfig"><a href="GridSelect.Extras.html#defaultGSConfig"><span class="hs-identifier">defaultGSConfig</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">def</span><span>
</span><a name="line-146"></a><span>
</span><a name="line-147"></a><span class="hs-keyword">type</span><span> </span><a name="TwoDPosition"><a href="GridSelect.Extras.html#TwoDPosition"><span class="hs-identifier">TwoDPosition</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">)</span><span>
</span><a name="line-148"></a><span>
</span><a name="line-149"></a><span class="hs-keyword">type</span><span> </span><a name="TwoDElementMap"><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier">TwoDElementMap</span></a></a><span> </span><a name="local-6989586621679024429"><a href="#local-6989586621679024429"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><a href="GridSelect.Extras.html#TwoDPosition"><span class="hs-identifier hs-type">TwoDPosition</span></a><span class="hs-special">,</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><a href="#local-6989586621679024429"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-150"></a><span>
</span><a name="line-151"></a><span class="hs-keyword">data</span><span> </span><a name="TwoDState"><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier">TwoDState</span></a></a><span> </span><a name="local-6989586621679022975"><a href="#local-6989586621679022975"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="TwoDState"><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier">TwoDState</span></a></a><span> </span><span class="hs-special">{</span><span> </span><a name="td_curpos"><a href="GridSelect.Extras.html#td_curpos"><span class="hs-identifier">td_curpos</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoDPosition"><span class="hs-identifier hs-type">TwoDPosition</span></a><span>
</span><a name="line-152"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_availSlots"><a href="GridSelect.Extras.html#td_availSlots"><span class="hs-identifier">td_availSlots</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">[</span><a href="GridSelect.Extras.html#TwoDPosition"><span class="hs-identifier hs-type">TwoDPosition</span></a><span class="hs-special">]</span><span>
</span><a name="line-153"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_elements"><a href="GridSelect.Extras.html#td_elements"><span class="hs-identifier">td_elements</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><a href="#local-6989586621679022975"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-154"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_gsconfig"><a href="GridSelect.Extras.html#td_gsconfig"><span class="hs-identifier">td_gsconfig</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679022975"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-155"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_font"><a href="GridSelect.Extras.html#td_font"><span class="hs-identifier">td_font</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">XMonadFont</span><span>
</span><a name="line-156"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_paneX"><a href="GridSelect.Extras.html#td_paneX"><span class="hs-identifier">td_paneX</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-157"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_paneY"><a href="GridSelect.Extras.html#td_paneY"><span class="hs-identifier">td_paneY</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-158"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_drawingWin"><a href="GridSelect.Extras.html#td_drawingWin"><span class="hs-identifier">td_drawingWin</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Window</span><span>
</span><a name="line-159"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_searchString"><a href="GridSelect.Extras.html#td_searchString"><span class="hs-identifier">td_searchString</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-160"></a><span>                             </span><span class="hs-special">,</span><span> </span><a name="td_elementmap"><a href="GridSelect.Extras.html#td_elementmap"><span class="hs-identifier">td_elementmap</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679022975"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-161"></a><span>                             </span><span class="hs-special">}</span><span>
</span><a name="line-162"></a><span>
</span><a name="line-163"></a><span class="hs-identifier">generateElementmap</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-type">TwoDState</span></a><span> </span><a href="#local-6989586621679034569"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679034569"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-164"></a><a name="generateElementmap"><a href="GridSelect.Extras.html#generateElementmap"><span class="hs-identifier">generateElementmap</span></a></a><span> </span><a name="local-6989586621679034571"><a href="#local-6989586621679034571"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-165"></a><span>  </span><a name="local-6989586621679035288"><a href="#local-6989586621679035288"><span class="hs-identifier">rearrangedElements</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="#local-6989586621679034575"><span class="hs-identifier hs-var">rearranger</span></a><span> </span><a href="#local-6989586621679034574"><span class="hs-identifier hs-var">searchString</span></a><span> </span><a href="#local-6989586621679034577"><span class="hs-identifier hs-var">sortedElements</span></a><span>
</span><a name="line-166"></a><span>  </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">zip</span><span> </span><a href="#local-6989586621679034572"><span class="hs-identifier hs-var">positions</span></a><span> </span><a href="#local-6989586621679035288"><span class="hs-identifier hs-var">rearrangedElements</span></a><span>
</span><a name="line-167"></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-168"></a><span>  </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_availSlots</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679034572"><a href="#local-6989586621679034572"><span class="hs-identifier">positions</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679034573"><a href="#local-6989586621679034573"><span class="hs-identifier">gsconfig</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_searchString</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679034574"><a href="#local-6989586621679034574"><span class="hs-identifier">searchString</span></a></a><span> </span><span class="hs-special">}</span><span>
</span><a name="line-169"></a><span>    </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679034571"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-170"></a><span>  </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-var">GSConfig</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">gs_rearranger</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679034575"><a href="#local-6989586621679034575"><span class="hs-identifier">rearranger</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679034573"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-171"></a><span>  </span><span class="hs-comment">-- Filter out any elements that don't contain the searchString (case insensitive)</span><span>
</span><a name="line-172"></a><span>  </span><a name="local-6989586621679034576"><a href="#local-6989586621679034576"><span class="hs-identifier">filteredElements</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-173"></a><span>    </span><span class="hs-identifier hs-var">L.filter</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><a href="#local-6989586621679034574"><span class="hs-identifier hs-var">searchString</span></a><span> </span><span class="hs-special">`</span><a href="#local-6989586621679034578"><span class="hs-identifier hs-var">isInfixOfI</span></a><span class="hs-special">`</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">fst</span><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elements</span><span> </span><a href="#local-6989586621679034571"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-174"></a><span>  </span><span class="hs-comment">-- Sorts the elementmap</span><span>
</span><a name="line-175"></a><span>  </span><a name="local-6989586621679034577"><a href="#local-6989586621679034577"><span class="hs-identifier">sortedElements</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#orderElementmap"><span class="hs-identifier hs-var">orderElementmap</span></a><span> </span><a href="#local-6989586621679034574"><span class="hs-identifier hs-var">searchString</span></a><span> </span><a href="#local-6989586621679034576"><span class="hs-identifier hs-var">filteredElements</span></a><span>
</span><a name="line-176"></a><span>  </span><span class="hs-comment">-- Case Insensitive version of isInfixOf</span><span>
</span><a name="line-177"></a><span>  </span><a name="local-6989586621679034788"><a href="#local-6989586621679034788"><span class="hs-identifier">needle</span></a></a><span> </span><span class="hs-special">`</span><a name="local-6989586621679034578"><a href="#local-6989586621679034578"><span class="hs-identifier">isInfixOfI</span></a></a><span class="hs-special">`</span><span> </span><a name="local-6989586621679034789"><a href="#local-6989586621679034789"><span class="hs-identifier">haystack</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679034579"><span class="hs-identifier hs-var">upper</span></a><span> </span><a href="#local-6989586621679034788"><span class="hs-identifier hs-var">needle</span></a><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">isInfixOf</span><span class="hs-special">`</span><span> </span><a href="#local-6989586621679034579"><span class="hs-identifier hs-var">upper</span></a><span> </span><a href="#local-6989586621679034789"><span class="hs-identifier hs-var">haystack</span></a><span>
</span><a name="line-178"></a><span>  </span><a name="local-6989586621679034579"><a href="#local-6989586621679034579"><span class="hs-identifier">upper</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">toUpper</span><span>
</span><a name="line-179"></a><span>
</span><a name="line-180"></a><span>
</span><a name="line-181"></a><span class="hs-comment">-- | We enforce an ordering such that we will always get the same result. If the</span><span>
</span><a name="line-182"></a><span class="hs-comment">-- elements position changes from call to call of gridselect, then the shown</span><span>
</span><a name="line-183"></a><span class="hs-comment">-- positions will also change when you search for the same string. This is</span><span>
</span><a name="line-184"></a><span class="hs-comment">-- especially the case when using gridselect for showing and switching between</span><span>
</span><a name="line-185"></a><span class="hs-comment">-- workspaces, as workspaces are usually shown in order of last visited.  The</span><span>
</span><a name="line-186"></a><span class="hs-comment">-- chosen ordering is &quot;how deep in the haystack the needle is&quot; (number of</span><span>
</span><a name="line-187"></a><span class="hs-comment">-- characters from the beginning of the string and the needle).</span><span>
</span><a name="line-188"></a><span class="hs-identifier">orderElementmap</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679034568"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679034568"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-189"></a><a name="orderElementmap"><a href="GridSelect.Extras.html#orderElementmap"><span class="hs-identifier">orderElementmap</span></a></a><span> </span><a name="local-6989586621679035289"><a href="#local-6989586621679035289"><span class="hs-identifier">searchString</span></a></a><span> </span><a name="local-6989586621679035290"><a href="#local-6989586621679035290"><span class="hs-identifier">elements</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">if</span><span> </span><span class="hs-identifier hs-var">not</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">null</span><span> </span><a href="#local-6989586621679035289"><span class="hs-identifier hs-var">searchString</span></a><span>
</span><a name="line-190"></a><span>  </span><span class="hs-keyword">then</span><span> </span><a href="#local-6989586621679035294"><span class="hs-identifier hs-var">sortedElements</span></a><span>
</span><a name="line-191"></a><span>  </span><span class="hs-keyword">else</span><span> </span><a href="#local-6989586621679035290"><span class="hs-identifier hs-var">elements</span></a><span>
</span><a name="line-192"></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-193"></a><span>  </span><a name="local-6989586621679035291"><a href="#local-6989586621679035291"><span class="hs-identifier">upper</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">toUpper</span><span>
</span><a name="line-194"></a><span>  </span><span class="hs-comment">-- Calculates a (score, element) tuple where the score is the depth of the (case insensitive) needle.</span><span>
</span><a name="line-195"></a><span>  </span><a name="local-6989586621679035292"><a href="#local-6989586621679035292"><span class="hs-identifier">calcScore</span></a></a><span> </span><a name="local-6989586621679035295"><a href="#local-6989586621679035295"><span class="hs-identifier">element</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-196"></a><span>    </span><span class="hs-special">(</span><span> </span><span class="hs-identifier hs-var">length</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">takeWhile</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">not</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">isPrefixOf</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035291"><span class="hs-identifier hs-var">upper</span></a><span> </span><a href="#local-6989586621679035289"><span class="hs-identifier hs-var">searchString</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-197"></a><span>                         </span><span class="hs-special">(</span><span class="hs-identifier hs-var">tails</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a href="#local-6989586621679035291"><span class="hs-identifier hs-var">upper</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">fst</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679035295"><span class="hs-identifier hs-var">element</span></a><span class="hs-special">)</span><span>
</span><a name="line-198"></a><span>    </span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679035295"><span class="hs-identifier hs-var">element</span></a><span>
</span><a name="line-199"></a><span>    </span><span class="hs-special">)</span><span>
</span><a name="line-200"></a><span>  </span><span class="hs-comment">-- Use the score and then the string as the parameters for comparing, making</span><span>
</span><a name="line-201"></a><span>  </span><span class="hs-comment">-- it consistent even when two strings that score the same, as it will then be</span><span>
</span><a name="line-202"></a><span>  </span><span class="hs-comment">-- sorted by the strings, making it consistent.</span><span>
</span><a name="line-203"></a><span>  </span><a name="local-6989586621679035293"><a href="#local-6989586621679035293"><span class="hs-identifier">compareScore</span></a></a><span>   </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">comparing</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><span class="hs-special">(</span><a name="local-6989586621679035296"><a href="#local-6989586621679035296"><span class="hs-identifier">score</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><a name="local-6989586621679035297"><a href="#local-6989586621679035297"><span class="hs-identifier">str</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">_</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035296"><span class="hs-identifier hs-var">score</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679035297"><span class="hs-identifier hs-var">str</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-204"></a><span>  </span><a name="local-6989586621679035294"><a href="#local-6989586621679035294"><span class="hs-identifier">sortedElements</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">snd</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">sortBy</span><span> </span><a href="#local-6989586621679035293"><span class="hs-identifier hs-var">compareScore</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><a href="#local-6989586621679035292"><span class="hs-identifier hs-var">calcScore</span></a><span> </span><a href="#local-6989586621679035290"><span class="hs-identifier hs-var">elements</span></a><span>
</span><a name="line-205"></a><span>
</span><a name="line-206"></a><span>
</span><a name="line-207"></a><span class="hs-keyword">newtype</span><span> </span><a name="TwoD"><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier">TwoD</span></a></a><span> </span><a name="local-6989586621679022666"><a href="#local-6989586621679022666"><span class="hs-identifier">a</span></a></a><span> </span><a name="local-6989586621679022667"><a href="#local-6989586621679022667"><span class="hs-identifier">b</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a name="TwoD"><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier">TwoD</span></a></a><span> </span><span class="hs-special">{</span><span> </span><a name="unTwoD"><a href="GridSelect.Extras.html#unTwoD"><span class="hs-identifier">unTwoD</span></a></a><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">StateT</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-type">TwoDState</span></a><span> </span><a href="#local-6989586621679022666"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><a href="#local-6989586621679022667"><span class="hs-identifier hs-type">b</span></a><span> </span><span class="hs-special">}</span><span>
</span><a name="line-208"></a><span>    </span><span class="hs-keyword">deriving</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Monad</span><span class="hs-special">,</span><span class="hs-identifier hs-type">Functor</span><span class="hs-special">,</span><span class="hs-identifier hs-type">MonadState</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-type">TwoDState</span></a><span> </span><a href="#local-6989586621679022666"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-209"></a><span>
</span><a name="line-210"></a><span class="hs-keyword">instance</span><span> </span><span class="hs-identifier hs-type">Applicative</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679026273"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-211"></a><span>    </span><span class="hs-special">(</span><a name="local-3458764513820541679"><span class="hs-operator">&lt;*&gt;</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">ap</span><span>
</span><a name="line-212"></a><span>    </span><a name="local-3458764513820541680"><span class="hs-identifier">pure</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span>
</span><a name="line-213"></a><span>
</span><a name="line-214"></a><span class="hs-identifier">liftX</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><a href="#local-6989586621679034566"><span class="hs-identifier hs-type">a1</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679034567"><span class="hs-identifier hs-type">a</span></a><span> </span><a href="#local-6989586621679034566"><span class="hs-identifier hs-type">a1</span></a><span>
</span><a name="line-215"></a><a name="liftX"><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier">liftX</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-var">TwoD</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">lift</span><span>
</span><a name="line-216"></a><span>
</span><a name="line-217"></a><span class="hs-identifier">evalTwoD</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679034564"><span class="hs-identifier hs-type">a1</span></a><span> </span><a href="#local-6989586621679034565"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-type">TwoDState</span></a><span> </span><a href="#local-6989586621679034564"><span class="hs-identifier hs-type">a1</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><a href="#local-6989586621679034565"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-218"></a><a name="evalTwoD"><a href="GridSelect.Extras.html#evalTwoD"><span class="hs-identifier">evalTwoD</span></a></a><span> </span><a name="local-6989586621679035319"><a href="#local-6989586621679035319"><span class="hs-identifier">m</span></a></a><span> </span><a name="local-6989586621679035320"><a href="#local-6989586621679035320"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">flip</span><span> </span><span class="hs-identifier hs-var">evalStateT</span><span> </span><a href="#local-6989586621679035320"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">unTwoD</span><span> </span><a href="#local-6989586621679035319"><span class="hs-identifier hs-var">m</span></a><span>
</span><a name="line-219"></a><span>
</span><a name="line-220"></a><span class="hs-identifier">diamondLayer</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Enum</span><span> </span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Num</span><span> </span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Eq</span><span> </span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=&gt;</span><span> </span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679034563"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-221"></a><a name="diamondLayer"><a href="GridSelect.Extras.html#diamondLayer"><span class="hs-identifier">diamondLayer</span></a></a><span> </span><span class="hs-number">0</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-222"></a><span class="hs-identifier">diamondLayer</span><span> </span><a name="local-6989586621679035321"><a href="#local-6989586621679035321"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-223"></a><span>  </span><span class="hs-comment">-- tr = top right</span><span>
</span><a name="line-224"></a><span>  </span><span class="hs-comment">--  r = ur ++ 90 degree clock-wise rotation of ur</span><span>
</span><a name="line-225"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679035322"><a href="#local-6989586621679035322"><span class="hs-identifier">tr</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035324"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679035321"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679035324"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">|</span><span> </span><a name="local-6989586621679035324"><a href="#local-6989586621679035324"><span class="hs-identifier">x</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-special">[</span><span class="hs-number">0</span><span> </span><span class="hs-glyph">..</span><span> </span><a href="#local-6989586621679035321"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span class="hs-special">]</span><span> </span><span class="hs-special">]</span><span>
</span><a name="line-226"></a><span>      </span><a name="local-6989586621679035323"><a href="#local-6989586621679035323"><span class="hs-identifier">r</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679035322"><span class="hs-identifier hs-var">tr</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><span class="hs-special">(</span><a name="local-6989586621679035325"><a href="#local-6989586621679035325"><span class="hs-identifier">x</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679035326"><a href="#local-6989586621679035326"><span class="hs-identifier">y</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035326"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">,</span><span> </span><span class="hs-glyph">-</span><a href="#local-6989586621679035325"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679035322"><span class="hs-identifier hs-var">tr</span></a><span>
</span><a name="line-227"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><a href="#local-6989586621679035323"><span class="hs-identifier hs-var">r</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">negate</span><span> </span><span class="hs-operator hs-var">***</span><span> </span><span class="hs-identifier hs-var">negate</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679035323"><span class="hs-identifier hs-var">r</span></a><span>
</span><a name="line-228"></a><span>
</span><a name="line-229"></a><span class="hs-identifier">diamond</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Enum</span><span> </span><a href="#local-6989586621679033942"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Num</span><span> </span><a href="#local-6989586621679033942"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Eq</span><span> </span><a href="#local-6989586621679033942"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><a href="#local-6989586621679033942"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679033942"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-230"></a><a name="diamond"><a href="GridSelect.Extras.html#diamond"><span class="hs-identifier">diamond</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">concatMap</span><span> </span><a href="GridSelect.Extras.html#diamondLayer"><span class="hs-identifier hs-var">diamondLayer</span></a><span> </span><span class="hs-special">[</span><span class="hs-number">0</span><span> </span><span class="hs-glyph">..</span><span class="hs-special">]</span><span>
</span><a name="line-231"></a><span>
</span><a name="line-232"></a><span class="hs-identifier">diamondRestrict</span><span>
</span><a name="line-233"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-234"></a><a name="diamondRestrict"><a href="GridSelect.Extras.html#diamondRestrict"><span class="hs-identifier">diamondRestrict</span></a></a><span> </span><a name="local-6989586621679035327"><a href="#local-6989586621679035327"><span class="hs-identifier">x</span></a></a><span> </span><a name="local-6989586621679035328"><a href="#local-6989586621679035328"><span class="hs-identifier">y</span></a></a><span> </span><a name="local-6989586621679035329"><a href="#local-6989586621679035329"><span class="hs-identifier">originX</span></a></a><span> </span><a name="local-6989586621679035330"><a href="#local-6989586621679035330"><span class="hs-identifier">originY</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-235"></a><span>  </span><span class="hs-identifier hs-var">L.filter</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><span class="hs-special">(</span><a name="local-6989586621679035331"><a href="#local-6989586621679035331"><span class="hs-identifier">x'</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679035332"><a href="#local-6989586621679035332"><span class="hs-identifier">y'</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">abs</span><span> </span><a href="#local-6989586621679035331"><span class="hs-identifier hs-var">x'</span></a><span> </span><span class="hs-operator hs-var">&lt;=</span><span> </span><a href="#local-6989586621679035327"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var">&amp;&amp;</span><span> </span><span class="hs-identifier hs-var">abs</span><span> </span><a href="#local-6989586621679035332"><span class="hs-identifier hs-var">y'</span></a><span> </span><span class="hs-operator hs-var">&lt;=</span><span> </span><a href="#local-6989586621679035328"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">)</span><span>
</span><a name="line-236"></a><span>    </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><span class="hs-special">(</span><a name="local-6989586621679035333"><a href="#local-6989586621679035333"><span class="hs-identifier">x'</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679035334"><a href="#local-6989586621679035334"><span class="hs-identifier">y'</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035333"><span class="hs-identifier hs-var">x'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035329"><span class="hs-identifier hs-var">originX</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679035334"><span class="hs-identifier hs-var">y'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035330"><span class="hs-identifier hs-var">originY</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-237"></a><span>    </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">take</span><span> </span><span class="hs-number">1000</span><span>
</span><a name="line-238"></a><span>    </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#diamond"><span class="hs-identifier hs-var">diamond</span></a><span>
</span><a name="line-239"></a><span>
</span><a name="line-240"></a><span class="hs-identifier">findInElementMap</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Eq</span><span> </span><a href="#local-6989586621679030073"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=&gt;</span><span> </span><a href="#local-6989586621679030073"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><a href="#local-6989586621679030073"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679030074"><span class="hs-identifier hs-type">b</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Maybe</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679030073"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679030074"><span class="hs-identifier hs-type">b</span></a><span class="hs-special">)</span><span>
</span><a name="line-241"></a><a name="findInElementMap"><a href="GridSelect.Extras.html#findInElementMap"><span class="hs-identifier">findInElementMap</span></a></a><span> </span><a name="local-6989586621679035335"><a href="#local-6989586621679035335"><span class="hs-identifier">pos</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">find</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679035335"><span class="hs-identifier hs-var">pos</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">fst</span><span class="hs-special">)</span><span>
</span><a name="line-242"></a><span>
</span><a name="line-243"></a><span class="hs-identifier">drawWinBox</span><span>
</span><a name="line-244"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Window</span><span>
</span><a name="line-245"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">XMonadFont</span><span>
</span><a name="line-246"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-247"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-248"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-249"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-250"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-251"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-252"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-253"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-254"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-255"></a><a name="drawWinBox"><a href="GridSelect.Extras.html#drawWinBox"><span class="hs-identifier">drawWinBox</span></a></a><span> </span><a name="local-6989586621679035336"><a href="#local-6989586621679035336"><span class="hs-identifier">win</span></a></a><span> </span><a name="local-6989586621679035337"><a href="#local-6989586621679035337"><span class="hs-identifier">font</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679035338"><a href="#local-6989586621679035338"><span class="hs-identifier">fg</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679035339"><a href="#local-6989586621679035339"><span class="hs-identifier">bg</span></a></a><span class="hs-special">)</span><span> </span><a name="local-6989586621679035340"><a href="#local-6989586621679035340"><span class="hs-identifier">bc</span></a></a><span> </span><a name="local-6989586621679035341"><a href="#local-6989586621679035341"><span class="hs-identifier">ch</span></a></a><span> </span><a name="local-6989586621679035342"><a href="#local-6989586621679035342"><span class="hs-identifier">cw</span></a></a><span> </span><a name="local-6989586621679035343"><a href="#local-6989586621679035343"><span class="hs-identifier">text</span></a></a><span> </span><a name="local-6989586621679035344"><a href="#local-6989586621679035344"><span class="hs-identifier">x</span></a></a><span> </span><a name="local-6989586621679035345"><a href="#local-6989586621679035345"><span class="hs-identifier">y</span></a></a><span> </span><a name="local-6989586621679035346"><a href="#local-6989586621679035346"><span class="hs-identifier">cp</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">withDisplay</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679035347"><a href="#local-6989586621679035347"><span class="hs-identifier">dpy</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-256"></a><span>  </span><a name="local-6989586621679035410"><a href="#local-6989586621679035410"><span class="hs-identifier">gc</span></a></a><span>       </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">createGC</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035336"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-257"></a><span>  </span><a name="local-6989586621679035411"><a href="#local-6989586621679035411"><span class="hs-identifier">bordergc</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">createGC</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035336"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-258"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-259"></a><span>    </span><span class="hs-identifier hs-var">Just</span><span> </span><a name="local-6989586621679035714"><a href="#local-6989586621679035714"><span class="hs-identifier">fgcolor</span></a></a><span>     </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initColor</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035338"><span class="hs-identifier hs-var">fg</span></a><span>
</span><a name="line-260"></a><span>    </span><span class="hs-identifier hs-var">Just</span><span> </span><a name="local-6989586621679035715"><a href="#local-6989586621679035715"><span class="hs-identifier">bgcolor</span></a></a><span>     </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initColor</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035339"><span class="hs-identifier hs-var">bg</span></a><span>
</span><a name="line-261"></a><span>    </span><span class="hs-identifier hs-var">Just</span><span> </span><a name="local-6989586621679035716"><a href="#local-6989586621679035716"><span class="hs-identifier">bordercolor</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initColor</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035340"><span class="hs-identifier hs-var">bc</span></a><span>
</span><a name="line-262"></a><span>    </span><span class="hs-identifier hs-var">setForeground</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035410"><span class="hs-identifier hs-var">gc</span></a><span> </span><a href="#local-6989586621679035714"><span class="hs-identifier hs-var">fgcolor</span></a><span>
</span><a name="line-263"></a><span>    </span><span class="hs-identifier hs-var">setBackground</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035410"><span class="hs-identifier hs-var">gc</span></a><span> </span><a href="#local-6989586621679035715"><span class="hs-identifier hs-var">bgcolor</span></a><span>
</span><a name="line-264"></a><span>    </span><span class="hs-identifier hs-var">setForeground</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035411"><span class="hs-identifier hs-var">bordergc</span></a><span> </span><a href="#local-6989586621679035716"><span class="hs-identifier hs-var">bordercolor</span></a><span>
</span><a name="line-265"></a><span>    </span><span class="hs-identifier hs-var">fillRectangle</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-266"></a><span>                  </span><a href="#local-6989586621679035336"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-267"></a><span>                  </span><a href="#local-6989586621679035410"><span class="hs-identifier hs-var">gc</span></a><span>
</span><a name="line-268"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035344"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">)</span><span>
</span><a name="line-269"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035345"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">)</span><span>
</span><a name="line-270"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035342"><span class="hs-identifier hs-var">cw</span></a><span class="hs-special">)</span><span>
</span><a name="line-271"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035341"><span class="hs-identifier hs-var">ch</span></a><span class="hs-special">)</span><span>
</span><a name="line-272"></a><span>    </span><span class="hs-identifier hs-var">drawRectangle</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-273"></a><span>                  </span><a href="#local-6989586621679035336"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-274"></a><span>                  </span><a href="#local-6989586621679035411"><span class="hs-identifier hs-var">bordergc</span></a><span>
</span><a name="line-275"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035344"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">)</span><span>
</span><a name="line-276"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035345"><span class="hs-identifier hs-var">y</span></a><span class="hs-special">)</span><span>
</span><a name="line-277"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035342"><span class="hs-identifier hs-var">cw</span></a><span class="hs-special">)</span><span>
</span><a name="line-278"></a><span>                  </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679035341"><span class="hs-identifier hs-var">ch</span></a><span class="hs-special">)</span><span>
</span><a name="line-279"></a><span>  </span><a name="local-6989586621679036363"><a href="#local-6989586621679036363"><span class="hs-identifier">stext</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">shrinkWhile</span><span>
</span><a name="line-280"></a><span>    </span><span class="hs-special">(</span><span class="hs-identifier hs-var">shrinkIt</span><span> </span><span class="hs-identifier hs-var">shrinkText</span><span class="hs-special">)</span><span>
</span><a name="line-281"></a><span>    </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679036361"><a href="#local-6989586621679036361"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-282"></a><span>      </span><a name="local-6989586621679036362"><a href="#local-6989586621679036362"><span class="hs-identifier">size</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">textWidthXMF</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035337"><span class="hs-identifier hs-var">font</span></a><span> </span><a href="#local-6989586621679036361"><span class="hs-identifier hs-var">n</span></a><span>
</span><a name="line-283"></a><span>      </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679036362"><span class="hs-identifier hs-var">size</span></a><span> </span><span class="hs-operator hs-var">&gt;</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035342"><span class="hs-identifier hs-var">cw</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">2</span><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679035346"><span class="hs-identifier hs-var">cp</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-284"></a><span>    </span><span class="hs-special">)</span><span>
</span><a name="line-285"></a><span>    </span><a href="#local-6989586621679035343"><span class="hs-identifier hs-var">text</span></a><span>
</span><a name="line-286"></a><span>  </span><span class="hs-comment">-- calculate the offset to vertically centre the text based on the ascender and descender</span><span>
</span><a name="line-287"></a><span>  </span><span class="hs-special">(</span><a name="local-6989586621679036364"><a href="#local-6989586621679036364"><span class="hs-identifier">asc</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036365"><a href="#local-6989586621679036365"><span class="hs-identifier">desc</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">textExtentsXMF</span><span> </span><a href="#local-6989586621679035337"><span class="hs-identifier hs-var">font</span></a><span> </span><a href="#local-6989586621679036363"><span class="hs-identifier hs-var">stext</span></a><span>
</span><a name="line-288"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036366"><a href="#local-6989586621679036366"><span class="hs-identifier">offset</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><a href="#local-6989586621679035341"><span class="hs-identifier hs-var">ch</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036364"><span class="hs-identifier hs-var">asc</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036365"><span class="hs-identifier hs-var">desc</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">div</span><span class="hs-special">`</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><a href="#local-6989586621679036364"><span class="hs-identifier hs-var">asc</span></a><span>
</span><a name="line-289"></a><span>  </span><span class="hs-identifier hs-var">printStringXMF</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-290"></a><span>                 </span><a href="#local-6989586621679035336"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-291"></a><span>                 </span><a href="#local-6989586621679035337"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-292"></a><span>                 </span><a href="#local-6989586621679035410"><span class="hs-identifier hs-var">gc</span></a><span>
</span><a name="line-293"></a><span>                 </span><a href="#local-6989586621679035339"><span class="hs-identifier hs-var">bg</span></a><span>
</span><a name="line-294"></a><span>                 </span><a href="#local-6989586621679035338"><span class="hs-identifier hs-var">fg</span></a><span>
</span><a name="line-295"></a><span>                 </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035344"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679035346"><span class="hs-identifier hs-var">cp</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-296"></a><span>                 </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679035345"><span class="hs-identifier hs-var">y</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036366"><span class="hs-identifier hs-var">offset</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-297"></a><span>                 </span><a href="#local-6989586621679036363"><span class="hs-identifier hs-var">stext</span></a><span>
</span><a name="line-298"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">freeGC</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035410"><span class="hs-identifier hs-var">gc</span></a><span>
</span><a name="line-299"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">freeGC</span><span> </span><a href="#local-6989586621679035347"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679035411"><span class="hs-identifier hs-var">bordergc</span></a><span>
</span><a name="line-300"></a><span>
</span><a name="line-301"></a><span class="hs-identifier">updateAllElements</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679030072"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-302"></a><a name="updateAllElements"><a href="GridSelect.Extras.html#updateAllElements"><span class="hs-identifier">updateAllElements</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-303"></a><span>  </span><a name="local-6989586621679036367"><a href="#local-6989586621679036367"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-304"></a><span>  </span><a href="GridSelect.Extras.html#updateElements"><span class="hs-identifier hs-var">updateElements</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036367"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-305"></a><span>
</span><a name="line-306"></a><span class="hs-identifier">grayoutElements</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Int</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679030071"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-307"></a><a name="grayoutElements"><a href="GridSelect.Extras.html#grayoutElements"><span class="hs-identifier">grayoutElements</span></a></a><span> </span><a name="local-6989586621679036368"><a href="#local-6989586621679036368"><span class="hs-identifier">skip</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-308"></a><span>  </span><a name="local-6989586621679036370"><a href="#local-6989586621679036370"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-309"></a><span>  </span><a href="GridSelect.Extras.html#updateElementsWithColorizer"><span class="hs-identifier hs-var">updateElementsWithColorizer</span></a><span> </span><a href="#local-6989586621679036369"><span class="hs-identifier hs-var">grayOnly</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">drop</span><span> </span><a href="#local-6989586621679036368"><span class="hs-identifier hs-var">skip</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036370"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-310"></a><span>  </span><span class="hs-keyword">where</span><span> </span><a name="local-6989586621679036369"><a href="#local-6989586621679036369"><span class="hs-identifier">grayOnly</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#808080&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;#808080&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-311"></a><span>
</span><a name="line-312"></a><span class="hs-identifier">updateElements</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679030070"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679030070"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-313"></a><a name="updateElements"><a href="GridSelect.Extras.html#updateElements"><span class="hs-identifier">updateElements</span></a></a><span> </span><a name="local-6989586621679036371"><a href="#local-6989586621679036371"><span class="hs-identifier">elementmap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-314"></a><span>  </span><a name="local-6989586621679036372"><a href="#local-6989586621679036372"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-315"></a><span>  </span><a href="GridSelect.Extras.html#updateElementsWithColorizer"><span class="hs-identifier hs-var">updateElementsWithColorizer</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_colorizer</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_gsconfig</span><span> </span><a href="#local-6989586621679036372"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036371"><span class="hs-identifier hs-var">elementmap</span></a><span>
</span><a name="line-316"></a><span>
</span><a name="line-317"></a><span class="hs-identifier">updateElementsWithColorizer</span><span>
</span><a name="line-318"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679030069"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679030069"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679030069"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-319"></a><a name="updateElementsWithColorizer"><a href="GridSelect.Extras.html#updateElementsWithColorizer"><span class="hs-identifier">updateElementsWithColorizer</span></a></a><span> </span><a name="local-6989586621679036373"><a href="#local-6989586621679036373"><span class="hs-identifier">colorizer</span></a></a><span> </span><a name="local-6989586621679036374"><a href="#local-6989586621679036374"><span class="hs-identifier">elementmap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-320"></a><span>  </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_curpos</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036375"><a href="#local-6989586621679036375"><span class="hs-identifier">curpos</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_drawingWin</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036376"><a href="#local-6989586621679036376"><span class="hs-identifier">win</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036377"><a href="#local-6989586621679036377"><span class="hs-identifier">gsconfig</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_font</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036378"><a href="#local-6989586621679036378"><span class="hs-identifier">font</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneX</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036379"><a href="#local-6989586621679036379"><span class="hs-identifier">paneX</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneY</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036380"><a href="#local-6989586621679036380"><span class="hs-identifier">paneY</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">&lt;-</span><span>
</span><a name="line-321"></a><span>    </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-322"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036381"><a href="#local-6989586621679036381"><span class="hs-identifier">cellwidth</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">gs_cellwidth</span><span> </span><a href="#local-6989586621679036377"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-323"></a><span>      </span><a name="local-6989586621679036382"><a href="#local-6989586621679036382"><span class="hs-identifier">cellheight</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">gs_cellheight</span><span> </span><a href="#local-6989586621679036377"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-324"></a><span>      </span><a name="local-6989586621679036383"><a href="#local-6989586621679036383"><span class="hs-identifier">paneX'</span></a></a><span>     </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">div</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036379"><span class="hs-identifier hs-var">paneX</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036381"><span class="hs-identifier hs-var">cellwidth</span></a><span class="hs-special">)</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-325"></a><span>      </span><a name="local-6989586621679036384"><a href="#local-6989586621679036384"><span class="hs-identifier">paneY'</span></a></a><span>     </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">div</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036380"><span class="hs-identifier hs-var">paneY</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036382"><span class="hs-identifier hs-var">cellheight</span></a><span class="hs-special">)</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-326"></a><span>      </span><a name="local-6989586621679036385"><a href="#local-6989586621679036385"><span class="hs-identifier">updateElement</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679036386"><a href="#local-6989586621679036386"><span class="hs-identifier">pos</span></a></a><span class="hs-glyph">@</span><span class="hs-special">(</span><a name="local-6989586621679036387"><a href="#local-6989586621679036387"><span class="hs-identifier">x</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036388"><a href="#local-6989586621679036388"><span class="hs-identifier">y</span></a></a><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><a name="local-6989586621679036389"><a href="#local-6989586621679036389"><span class="hs-identifier">text</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036390"><a href="#local-6989586621679036390"><span class="hs-identifier">element</span></a></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier hs-var">liftX</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-327"></a><span>        </span><a name="local-6989586621679036391"><a href="#local-6989586621679036391"><span class="hs-identifier">colors</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="#local-6989586621679036373"><span class="hs-identifier hs-var">colorizer</span></a><span> </span><a href="#local-6989586621679036390"><span class="hs-identifier hs-var">element</span></a><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036386"><span class="hs-identifier hs-var">pos</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679036375"><span class="hs-identifier hs-var">curpos</span></a><span class="hs-special">)</span><span>
</span><a name="line-328"></a><span>        </span><a href="GridSelect.Extras.html#drawWinBox"><span class="hs-identifier hs-var">drawWinBox</span></a><span> </span><a href="#local-6989586621679036376"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-329"></a><span>                   </span><a href="#local-6989586621679036378"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-330"></a><span>                   </span><a href="#local-6989586621679036391"><span class="hs-identifier hs-var">colors</span></a><span>
</span><a name="line-331"></a><span>                   </span><span class="hs-special">(</span><span class="hs-identifier">gs_bordercolor</span><span> </span><a href="#local-6989586621679036377"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-332"></a><span>                   </span><a href="#local-6989586621679036382"><span class="hs-identifier hs-var">cellheight</span></a><span>
</span><a name="line-333"></a><span>                   </span><a href="#local-6989586621679036381"><span class="hs-identifier hs-var">cellwidth</span></a><span>
</span><a name="line-334"></a><span>                   </span><a href="#local-6989586621679036389"><span class="hs-identifier hs-var">text</span></a><span>
</span><a name="line-335"></a><span>                   </span><span class="hs-special">(</span><a href="#local-6989586621679036383"><span class="hs-identifier hs-var">paneX'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036387"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679036381"><span class="hs-identifier hs-var">cellwidth</span></a><span class="hs-special">)</span><span>
</span><a name="line-336"></a><span>                   </span><span class="hs-special">(</span><a href="#local-6989586621679036384"><span class="hs-identifier hs-var">paneY'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036388"><span class="hs-identifier hs-var">y</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679036382"><span class="hs-identifier hs-var">cellheight</span></a><span class="hs-special">)</span><span>
</span><a name="line-337"></a><span>                   </span><span class="hs-special">(</span><span class="hs-identifier">gs_cellpadding</span><span> </span><a href="#local-6989586621679036377"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-338"></a><span>  </span><span class="hs-identifier hs-var">mapM_</span><span> </span><a href="#local-6989586621679036385"><span class="hs-identifier hs-var">updateElement</span></a><span> </span><a href="#local-6989586621679036374"><span class="hs-identifier hs-var">elementmap</span></a><span>
</span><a name="line-339"></a><span>
</span><a name="line-340"></a><span class="hs-identifier">stdHandle</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Event</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679028740"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679028740"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679028740"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679028740"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-341"></a><a name="stdHandle"><a href="GridSelect.Extras.html#stdHandle"><span class="hs-identifier">stdHandle</span></a></a><span> </span><span class="hs-identifier hs-var">ButtonEvent</span><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">ev_event_type</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036392"><a href="#local-6989586621679036392"><span class="hs-identifier">t</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">ev_x</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036393"><a href="#local-6989586621679036393"><span class="hs-identifier">x</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">ev_y</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036394"><a href="#local-6989586621679036394"><span class="hs-identifier">y</span></a></a><span> </span><span class="hs-special">}</span><span> </span><a name="local-6989586621679036395"><a href="#local-6989586621679036395"><span class="hs-identifier">contEventloop</span></a></a><span>
</span><a name="line-342"></a><span>  </span><span class="hs-glyph">|</span><span> </span><a href="#local-6989586621679036392"><span class="hs-identifier hs-var">t</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-identifier hs-var">buttonRelease</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-343"></a><span>    </span><a name="local-6989586621679036396"><a href="#local-6989586621679036396"><span class="hs-identifier">s</span></a></a><span class="hs-glyph">@</span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_paneX</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036397"><a href="#local-6989586621679036397"><span class="hs-identifier">px</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneY</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679036398"><a href="#local-6989586621679036398"><span class="hs-identifier">py</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-var">GSConfig</span></a><span> </span><a name="local-6989586621679036399"><a href="#local-6989586621679036399"><span class="hs-identifier">ch</span></a></a><span> </span><a name="local-6989586621679036400"><a href="#local-6989586621679036400"><span class="hs-identifier">cw</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span class="hs-special">)</span><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">&lt;-</span><span>
</span><a name="line-344"></a><span>      </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-345"></a><span>    </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036401"><a href="#local-6989586621679036401"><span class="hs-identifier">gridX</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fi</span><span> </span><a href="#local-6989586621679036393"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036397"><span class="hs-identifier hs-var">px</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036400"><span class="hs-identifier hs-var">cw</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">div</span><span class="hs-special">`</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">div</span><span class="hs-special">`</span><span> </span><a href="#local-6989586621679036400"><span class="hs-identifier hs-var">cw</span></a><span>
</span><a name="line-346"></a><span>        </span><a name="local-6989586621679036402"><a href="#local-6989586621679036402"><span class="hs-identifier">gridY</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fi</span><span> </span><a href="#local-6989586621679036394"><span class="hs-identifier hs-var">y</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036398"><span class="hs-identifier hs-var">py</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036399"><span class="hs-identifier hs-var">ch</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">div</span><span class="hs-special">`</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">div</span><span class="hs-special">`</span><span> </span><a href="#local-6989586621679036399"><span class="hs-identifier hs-var">ch</span></a><span>
</span><a name="line-347"></a><span>    </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier hs-var">lookup</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036401"><span class="hs-identifier hs-var">gridX</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036402"><span class="hs-identifier hs-var">gridY</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036396"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span> </span><span class="hs-keyword">of</span><span>
</span><a name="line-348"></a><span>      </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">_</span><span class="hs-special">,</span><span> </span><a name="local-6989586621679036403"><a href="#local-6989586621679036403"><span class="hs-identifier">el</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">Just</span><span> </span><a href="#local-6989586621679036403"><span class="hs-identifier hs-var">el</span></a><span class="hs-special">)</span><span>
</span><a name="line-349"></a><span>      </span><span class="hs-identifier hs-var">Nothing</span><span>      </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679036395"><span class="hs-identifier hs-var">contEventloop</span></a><span>
</span><a name="line-350"></a><span>  </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036395"><span class="hs-identifier hs-var">contEventloop</span></a><span>
</span><a name="line-351"></a><span>
</span><a name="line-352"></a><span class="hs-identifier">stdHandle</span><span> </span><span class="hs-identifier hs-var">ExposeEvent</span><span class="hs-special">{</span><span class="hs-special">}</span><span> </span><a name="local-6989586621679036404"><a href="#local-6989586621679036404"><span class="hs-identifier">contEventloop</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#updateAllElements2"><span class="hs-identifier hs-var">updateAllElements2</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="#local-6989586621679036404"><span class="hs-identifier hs-var">contEventloop</span></a><span>
</span><a name="line-353"></a><span>
</span><a name="line-354"></a><span class="hs-identifier">stdHandle</span><span> </span><span class="hs-identifier">_</span><span>             </span><a name="local-6989586621679036405"><a href="#local-6989586621679036405"><span class="hs-identifier">contEventloop</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036405"><span class="hs-identifier hs-var">contEventloop</span></a><span>
</span><a name="line-355"></a><span>
</span><a name="line-356"></a><span class="hs-comment">-- | Embeds a key handler into the X event handler that dispatches key</span><span>
</span><a name="line-357"></a><span class="hs-comment">-- events to the key handler, while non-key event go to the standard</span><span>
</span><a name="line-358"></a><span class="hs-comment">-- handler.</span><span>
</span><a name="line-359"></a><span class="hs-identifier">makeXEventhandler</span><span>
</span><a name="line-360"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-type">KeySym</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">KeyMask</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679028739"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679028739"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679028739"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679028739"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-361"></a><a name="makeXEventhandler"><a href="GridSelect.Extras.html#makeXEventhandler"><span class="hs-identifier">makeXEventhandler</span></a></a><span> </span><a name="local-6989586621679036406"><a href="#local-6989586621679036406"><span class="hs-identifier">keyhandler</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-362"></a><span>  </span><span class="hs-identifier hs-var">fix</span><span>
</span><a name="line-363"></a><span>    </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036422"><a href="#local-6989586621679036422"><span class="hs-identifier">me</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">join</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier hs-var">liftX</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">withDisplay</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036423"><a href="#local-6989586621679036423"><span class="hs-identifier">d</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">allocaXEvent</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036820"><a href="#local-6989586621679036820"><span class="hs-identifier">e</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-364"></a><span>        </span><span class="hs-identifier hs-var">maskEvent</span><span> </span><a href="#local-6989586621679036423"><span class="hs-identifier hs-var">d</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">exposureMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">keyPressMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">buttonReleaseMask</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036820"><span class="hs-identifier hs-var">e</span></a><span>
</span><a name="line-365"></a><span>        </span><a name="local-6989586621679036821"><a href="#local-6989586621679036821"><span class="hs-identifier">ev</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">getEvent</span><span> </span><a href="#local-6989586621679036820"><span class="hs-identifier hs-var">e</span></a><span>
</span><a name="line-366"></a><span>        </span><span class="hs-keyword">if</span><span> </span><span class="hs-identifier">ev_event_type</span><span> </span><a href="#local-6989586621679036821"><span class="hs-identifier hs-var">ev</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-identifier hs-var">keyPress</span><span>
</span><a name="line-367"></a><span>          </span><span class="hs-keyword">then</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-368"></a><span>            </span><span class="hs-special">(</span><a name="local-6989586621679036822"><a href="#local-6989586621679036822"><span class="hs-identifier">ks</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036823"><a href="#local-6989586621679036823"><span class="hs-identifier">s</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">lookupString</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">asKeyEvent</span><span> </span><a href="#local-6989586621679036820"><span class="hs-identifier hs-var">e</span></a><span>
</span><a name="line-369"></a><span>            </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-370"></a><span>              </span><a name="local-6989586621679036824"><a href="#local-6989586621679036824"><span class="hs-identifier">mask</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier hs-var">liftX</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">cleanMask</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">ev_state</span><span> </span><a href="#local-6989586621679036821"><span class="hs-identifier hs-var">ev</span></a><span class="hs-special">)</span><span>
</span><a name="line-371"></a><span>              </span><a href="#local-6989586621679036406"><span class="hs-identifier hs-var">keyhandler</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromMaybe</span><span> </span><span class="hs-identifier hs-var">xK_VoidSymbol</span><span> </span><a href="#local-6989586621679036822"><span class="hs-identifier hs-var">ks</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036823"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036824"><span class="hs-identifier hs-var">mask</span></a><span class="hs-special">)</span><span>
</span><a name="line-372"></a><span>          </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#stdHandle"><span class="hs-identifier hs-var">stdHandle</span></a><span> </span><a href="#local-6989586621679036821"><span class="hs-identifier hs-var">ev</span></a><span> </span><a href="#local-6989586621679036422"><span class="hs-identifier hs-var">me</span></a><span>
</span><a name="line-373"></a><span>
</span><a name="line-374"></a><span class="hs-comment">-- | When the map contains (KeySym,KeyMask) tuple for the given event,</span><span>
</span><a name="line-375"></a><span class="hs-comment">-- the associated action in the map associated shadows the default key</span><span>
</span><a name="line-376"></a><span class="hs-comment">-- handler</span><span>
</span><a name="line-377"></a><span class="hs-identifier">shadowWithKeymap</span><span>
</span><a name="line-378"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">M.Map</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">KeyMask</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">KeySym</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679027793"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-379"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-type">KeySym</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">KeyMask</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679027793"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-380"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">KeySym</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">KeyMask</span><span class="hs-special">)</span><span>
</span><a name="line-381"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679027793"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-382"></a><a name="shadowWithKeymap"><a href="GridSelect.Extras.html#shadowWithKeymap"><span class="hs-identifier">shadowWithKeymap</span></a></a><span> </span><a name="local-6989586621679036825"><a href="#local-6989586621679036825"><span class="hs-identifier">keymap</span></a></a><span> </span><a name="local-6989586621679036826"><a href="#local-6989586621679036826"><span class="hs-identifier">dflt</span></a></a><span> </span><a name="local-6989586621679036827"><a href="#local-6989586621679036827"><span class="hs-identifier">keyEvent</span></a></a><span class="hs-glyph">@</span><span class="hs-special">(</span><a name="local-6989586621679036828"><a href="#local-6989586621679036828"><span class="hs-identifier">ks</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">_</span><span class="hs-special">,</span><span> </span><a name="local-6989586621679036829"><a href="#local-6989586621679036829"><span class="hs-identifier">m'</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-383"></a><span>  </span><span class="hs-identifier hs-var">fromMaybe</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036826"><span class="hs-identifier hs-var">dflt</span></a><span> </span><a href="#local-6989586621679036827"><span class="hs-identifier hs-var">keyEvent</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">M.lookup</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036829"><span class="hs-identifier hs-var">m'</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036828"><span class="hs-identifier hs-var">ks</span></a><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036825"><span class="hs-identifier hs-var">keymap</span></a><span class="hs-special">)</span><span>
</span><a name="line-384"></a><span>
</span><a name="line-385"></a><span class="hs-comment">-- Helper functions to use for key handler functions</span><span>
</span><a name="line-386"></a><span>
</span><a name="line-387"></a><span class="hs-comment">-- | Closes gridselect returning the element under the cursor</span><span>
</span><a name="line-388"></a><span class="hs-identifier">select</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027792"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027792"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-389"></a><a name="select"><a href="GridSelect.Extras.html#select"><span class="hs-identifier">select</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-390"></a><span>  </span><a name="local-6989586621679036830"><a href="#local-6989586621679036830"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-391"></a><span>  </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">snd</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">snd</span><span> </span><span class="hs-operator hs-var">&lt;$&gt;</span><span> </span><a href="GridSelect.Extras.html#findInElementMap"><span class="hs-identifier hs-var">findInElementMap</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_curpos</span><span> </span><a href="#local-6989586621679036830"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036830"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-392"></a><span>
</span><a name="line-393"></a><span class="hs-comment">-- | Closes gridselect returning no element.</span><span>
</span><a name="line-394"></a><span class="hs-identifier">cancel</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027791"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027791"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-395"></a><a name="cancel"><a href="GridSelect.Extras.html#cancel"><span class="hs-identifier">cancel</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-396"></a><span>
</span><a name="line-397"></a><span class="hs-comment">-- | Sets the absolute position of the cursor.</span><span>
</span><a name="line-398"></a><span class="hs-identifier">setPos</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027790"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-399"></a><a name="setPos"><a href="GridSelect.Extras.html#setPos"><span class="hs-identifier">setPos</span></a></a><span> </span><a name="local-6989586621679036847"><a href="#local-6989586621679036847"><span class="hs-identifier">newPos</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-400"></a><span>  </span><a name="local-6989586621679036848"><a href="#local-6989586621679036848"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-401"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036849"><a href="#local-6989586621679036849"><span class="hs-identifier">elmap</span></a></a><span>         </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036848"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-402"></a><span>      </span><a name="local-6989586621679036850"><a href="#local-6989586621679036850"><span class="hs-identifier">newSelectedEl</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#findInElementMap"><span class="hs-identifier hs-var">findInElementMap</span></a><span> </span><a href="#local-6989586621679036847"><span class="hs-identifier hs-var">newPos</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036848"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-403"></a><span>      </span><a name="local-6989586621679036851"><a href="#local-6989586621679036851"><span class="hs-identifier">oldPos</span></a></a><span>        </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">td_curpos</span><span> </span><a href="#local-6989586621679036848"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-404"></a><span>  </span><span class="hs-identifier hs-var">when</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">isJust</span><span> </span><a href="#local-6989586621679036850"><span class="hs-identifier hs-var">newSelectedEl</span></a><span> </span><span class="hs-operator hs-var">&amp;&amp;</span><span> </span><a href="#local-6989586621679036847"><span class="hs-identifier hs-var">newPos</span></a><span> </span><span class="hs-operator hs-var">/=</span><span> </span><a href="#local-6989586621679036851"><span class="hs-identifier hs-var">oldPos</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-405"></a><span>    </span><span class="hs-identifier hs-var">put</span><span> </span><a href="#local-6989586621679036848"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_curpos</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036847"><span class="hs-identifier hs-var">newPos</span></a><span> </span><span class="hs-special">}</span><span>
</span><a name="line-406"></a><span>    </span><a href="GridSelect.Extras.html#updateElements2"><span class="hs-identifier hs-var">updateElements2</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">catMaybes</span><span> </span><span class="hs-special">[</span><a href="GridSelect.Extras.html#findInElementMap"><span class="hs-identifier hs-var">findInElementMap</span></a><span> </span><a href="#local-6989586621679036851"><span class="hs-identifier hs-var">oldPos</span></a><span> </span><a href="#local-6989586621679036849"><span class="hs-identifier hs-var">elmap</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036850"><span class="hs-identifier hs-var">newSelectedEl</span></a><span class="hs-special">]</span><span class="hs-special">)</span><span>
</span><a name="line-407"></a><span>
</span><a name="line-408"></a><span class="hs-comment">-- | Moves the cursor by the offsets specified</span><span>
</span><a name="line-409"></a><span class="hs-identifier">move</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027789"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-410"></a><a name="move"><a href="GridSelect.Extras.html#move"><span class="hs-identifier">move</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679036852"><a href="#local-6989586621679036852"><span class="hs-identifier">dx</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036853"><a href="#local-6989586621679036853"><span class="hs-identifier">dy</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-411"></a><span>  </span><a name="local-6989586621679036854"><a href="#local-6989586621679036854"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-412"></a><span>  </span><span class="hs-keyword">let</span><span> </span><span class="hs-special">(</span><a name="local-6989586621679036855"><a href="#local-6989586621679036855"><span class="hs-identifier">x</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036856"><a href="#local-6989586621679036856"><span class="hs-identifier">y</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">td_curpos</span><span> </span><a href="#local-6989586621679036854"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-413"></a><span>      </span><a name="local-6989586621679036857"><a href="#local-6989586621679036857"><span class="hs-identifier">newPos</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036855"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036852"><span class="hs-identifier hs-var">dx</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036856"><span class="hs-identifier hs-var">y</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679036853"><span class="hs-identifier hs-var">dy</span></a><span class="hs-special">)</span><span>
</span><a name="line-414"></a><span>  </span><a href="GridSelect.Extras.html#setPos"><span class="hs-identifier hs-var">setPos</span></a><span> </span><a href="#local-6989586621679036857"><span class="hs-identifier hs-var">newPos</span></a><span>
</span><a name="line-415"></a><span>
</span><a name="line-416"></a><span class="hs-identifier">moveNext</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027788"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-417"></a><a name="moveNext"><a href="GridSelect.Extras.html#moveNext"><span class="hs-identifier">moveNext</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-418"></a><span>  </span><a name="local-6989586621679036858"><a href="#local-6989586621679036858"><span class="hs-identifier">position</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-identifier">td_curpos</span><span>
</span><a name="line-419"></a><span>  </span><a name="local-6989586621679036859"><a href="#local-6989586621679036859"><span class="hs-identifier">elems</span></a></a><span>    </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-identifier">td_elementmap</span><span>
</span><a name="line-420"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036860"><a href="#local-6989586621679036860"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">length</span><span> </span><a href="#local-6989586621679036859"><span class="hs-identifier hs-var">elems</span></a><span>
</span><a name="line-421"></a><span>      </span><a name="local-6989586621679036861"><a href="#local-6989586621679036861"><span class="hs-identifier">m</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier hs-var">findIndex</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679036862"><a href="#local-6989586621679036862"><span class="hs-identifier">p</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">fst</span><span> </span><a href="#local-6989586621679036862"><span class="hs-identifier hs-var">p</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679036858"><span class="hs-identifier hs-var">position</span></a><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036859"><span class="hs-identifier hs-var">elems</span></a><span> </span><span class="hs-keyword">of</span><span>
</span><a name="line-422"></a><span>        </span><span class="hs-identifier hs-var">Nothing</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-423"></a><span>        </span><span class="hs-identifier hs-var">Just</span><span> </span><a name="local-6989586621679036863"><a href="#local-6989586621679036863"><span class="hs-identifier">k</span></a></a><span> </span><span class="hs-glyph">|</span><span> </span><a href="#local-6989586621679036863"><span class="hs-identifier hs-var">k</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679036860"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-number">0</span><span>
</span><a name="line-424"></a><span>               </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036863"><span class="hs-identifier hs-var">k</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span>
</span><a name="line-425"></a><span>  </span><span class="hs-identifier hs-var">whenJust</span><span> </span><a href="#local-6989586621679036861"><span class="hs-identifier hs-var">m</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036864"><a href="#local-6989586621679036864"><span class="hs-identifier">i</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#setPos"><span class="hs-identifier hs-var">setPos</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fst</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679036859"><span class="hs-identifier hs-var">elems</span></a><span> </span><span class="hs-operator hs-var">!!</span><span> </span><a href="#local-6989586621679036864"><span class="hs-identifier hs-var">i</span></a><span class="hs-special">)</span><span>
</span><a name="line-426"></a><span>
</span><a name="line-427"></a><span class="hs-identifier">movePrev</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027787"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-428"></a><a name="movePrev"><a href="GridSelect.Extras.html#movePrev"><span class="hs-identifier">movePrev</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-429"></a><span>  </span><a name="local-6989586621679036865"><a href="#local-6989586621679036865"><span class="hs-identifier">position</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-identifier">td_curpos</span><span>
</span><a name="line-430"></a><span>  </span><a name="local-6989586621679036866"><a href="#local-6989586621679036866"><span class="hs-identifier">elems</span></a></a><span>    </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-identifier">td_elementmap</span><span>
</span><a name="line-431"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036867"><a href="#local-6989586621679036867"><span class="hs-identifier">n</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">length</span><span> </span><a href="#local-6989586621679036866"><span class="hs-identifier hs-var">elems</span></a><span>
</span><a name="line-432"></a><span>      </span><a name="local-6989586621679036868"><a href="#local-6989586621679036868"><span class="hs-identifier">m</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">case</span><span> </span><span class="hs-identifier hs-var">findIndex</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679036869"><a href="#local-6989586621679036869"><span class="hs-identifier">p</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">fst</span><span> </span><a href="#local-6989586621679036869"><span class="hs-identifier hs-var">p</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679036865"><span class="hs-identifier hs-var">position</span></a><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036866"><span class="hs-identifier hs-var">elems</span></a><span> </span><span class="hs-keyword">of</span><span>
</span><a name="line-433"></a><span>        </span><span class="hs-identifier hs-var">Nothing</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-434"></a><span>        </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-number">0</span><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036867"><span class="hs-identifier hs-var">n</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span>
</span><a name="line-435"></a><span>        </span><span class="hs-identifier hs-var">Just</span><span> </span><a name="local-6989586621679036870"><a href="#local-6989586621679036870"><span class="hs-identifier">k</span></a></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">Just</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036870"><span class="hs-identifier hs-var">k</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span>
</span><a name="line-436"></a><span>  </span><span class="hs-identifier hs-var">whenJust</span><span> </span><a href="#local-6989586621679036868"><span class="hs-identifier hs-var">m</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036871"><a href="#local-6989586621679036871"><span class="hs-identifier">i</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#setPos"><span class="hs-identifier hs-var">setPos</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fst</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679036866"><span class="hs-identifier hs-var">elems</span></a><span> </span><span class="hs-operator hs-var">!!</span><span> </span><a href="#local-6989586621679036871"><span class="hs-identifier hs-var">i</span></a><span class="hs-special">)</span><span>
</span><a name="line-437"></a><span>
</span><a name="line-438"></a><span class="hs-comment">-- | Apply a transformation function the current search string</span><span>
</span><a name="line-439"></a><span class="hs-identifier">transformSearchString</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027786"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-440"></a><a name="transformSearchString"><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier">transformSearchString</span></a></a><span> </span><a name="local-6989586621679036872"><a href="#local-6989586621679036872"><span class="hs-identifier">f</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-441"></a><span>  </span><a name="local-6989586621679036873"><a href="#local-6989586621679036873"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-442"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036874"><a href="#local-6989586621679036874"><span class="hs-identifier">oldSearchString</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">td_searchString</span><span> </span><a href="#local-6989586621679036873"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-443"></a><span>      </span><a name="local-6989586621679036875"><a href="#local-6989586621679036875"><span class="hs-identifier">newSearchString</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036872"><span class="hs-identifier hs-var">f</span></a><span> </span><a href="#local-6989586621679036874"><span class="hs-identifier hs-var">oldSearchString</span></a><span>
</span><a name="line-444"></a><span>  </span><span class="hs-identifier hs-var">when</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036875"><span class="hs-identifier hs-var">newSearchString</span></a><span> </span><span class="hs-operator hs-var">/=</span><span> </span><a href="#local-6989586621679036874"><span class="hs-identifier hs-var">oldSearchString</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-445"></a><span>    </span><span class="hs-comment">-- FIXME curpos might end up outside new bounds</span><span>
</span><a name="line-446"></a><span>    </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036876"><a href="#local-6989586621679036876"><span class="hs-identifier">s'</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036873"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_searchString</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036875"><span class="hs-identifier hs-var">newSearchString</span></a><span> </span><span class="hs-special">}</span><span>
</span><a name="line-447"></a><span>    </span><a name="local-6989586621679036877"><a href="#local-6989586621679036877"><span class="hs-identifier">m</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier hs-var">liftX</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#generateElementmap"><span class="hs-identifier hs-var">generateElementmap</span></a><span> </span><a href="#local-6989586621679036876"><span class="hs-identifier hs-var">s'</span></a><span>
</span><a name="line-448"></a><span>    </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036878"><a href="#local-6989586621679036878"><span class="hs-identifier">s''</span></a></a><span>    </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036876"><span class="hs-identifier hs-var">s'</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036877"><span class="hs-identifier hs-var">m</span></a><span> </span><span class="hs-special">}</span><span>
</span><a name="line-449"></a><span>        </span><a name="local-6989586621679036879"><a href="#local-6989586621679036879"><span class="hs-identifier">oldLen</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">length</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036873"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-450"></a><span>        </span><a name="local-6989586621679036880"><a href="#local-6989586621679036880"><span class="hs-identifier">newLen</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">length</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679036878"><span class="hs-identifier hs-var">s''</span></a><span>
</span><a name="line-451"></a><span>    </span><span class="hs-comment">-- All the elements in the previous element map should be</span><span>
</span><a name="line-452"></a><span>    </span><span class="hs-comment">-- grayed out, except for those which will be covered by</span><span>
</span><a name="line-453"></a><span>    </span><span class="hs-comment">-- elements in the new element map.</span><span>
</span><a name="line-454"></a><span>    </span><span class="hs-identifier hs-var">when</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036880"><span class="hs-identifier hs-var">newLen</span></a><span> </span><span class="hs-operator hs-var">&lt;</span><span> </span><a href="#local-6989586621679036879"><span class="hs-identifier hs-var">oldLen</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#grayoutElements"><span class="hs-identifier hs-var">grayoutElements</span></a><span> </span><a href="#local-6989586621679036880"><span class="hs-identifier hs-var">newLen</span></a><span>
</span><a name="line-455"></a><span>    </span><span class="hs-identifier hs-var">put</span><span> </span><a href="#local-6989586621679036878"><span class="hs-identifier hs-var">s''</span></a><span>
</span><a name="line-456"></a><span>    </span><a href="GridSelect.Extras.html#updateAllElements"><span class="hs-identifier hs-var">updateAllElements</span></a><span>
</span><a name="line-457"></a><span>
</span><a name="line-458"></a><span class="hs-comment">-- | By default gridselect used the defaultNavigation action, which</span><span>
</span><a name="line-459"></a><span class="hs-comment">-- binds left,right,up,down and vi-style h,l,j,k navigation. Return</span><span>
</span><a name="line-460"></a><span class="hs-comment">-- quits gridselect, returning the selected element, while Escape</span><span>
</span><a name="line-461"></a><span class="hs-comment">-- cancels the selection. Slash enters the substring search mode. In</span><span>
</span><a name="line-462"></a><span class="hs-comment">-- substring search mode, every string-associated keystroke is</span><span>
</span><a name="line-463"></a><span class="hs-comment">-- added to a search string, which narrows down the object</span><span>
</span><a name="line-464"></a><span class="hs-comment">-- selection. Substring search mode comes back to regular navigation</span><span>
</span><a name="line-465"></a><span class="hs-comment">-- via Return, while Escape cancels the search. If you want that</span><span>
</span><a name="line-466"></a><span class="hs-comment">-- navigation style, add 'defaultNavigation' as 'gs_navigate' to your</span><span>
</span><a name="line-467"></a><span class="hs-comment">-- 'GSConfig' object. This is done by 'buildDefaultGSConfig' automatically.</span><span>
</span><a name="line-468"></a><span class="hs-identifier">defaultNavigation</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027785"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027785"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-469"></a><a name="defaultNavigation"><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier">defaultNavigation</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#makeXEventhandler"><span class="hs-identifier hs-var">makeXEventhandler</span></a><span>
</span><a name="line-470"></a><span>  </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#shadowWithKeymap"><span class="hs-identifier hs-var">shadowWithKeymap</span></a><span> </span><a href="#local-6989586621679036881"><span class="hs-identifier hs-var">navKeyMap</span></a><span> </span><a href="#local-6989586621679036882"><span class="hs-identifier hs-var">navDefaultHandler</span></a><span>
</span><a name="line-471"></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-472"></a><span>  </span><a name="local-6989586621679036881"><a href="#local-6989586621679036881"><span class="hs-identifier">navKeyMap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">M.fromList</span><span>
</span><a name="line-473"></a><span>    </span><span class="hs-special">[</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Escape</span><span class="hs-special">)</span><span>     </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#cancel"><span class="hs-identifier hs-var">cancel</span></a><span class="hs-special">)</span><span>
</span><a name="line-474"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Return</span><span class="hs-special">)</span><span>     </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#select"><span class="hs-identifier hs-var">select</span></a><span class="hs-special">)</span><span>
</span><a name="line-475"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_slash</span><span class="hs-special">)</span><span>      </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#substringSearch"><span class="hs-identifier hs-var">substringSearch</span></a><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-476"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Left</span><span class="hs-special">)</span><span>       </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-477"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_h</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-478"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Right</span><span class="hs-special">)</span><span>      </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-479"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_l</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-480"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Down</span><span class="hs-special">)</span><span>       </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-481"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_j</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-482"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Up</span><span class="hs-special">)</span><span>         </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-483"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_k</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-484"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Tab</span><span class="hs-special">)</span><span>        </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#moveNext"><span class="hs-identifier hs-var">moveNext</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-485"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_n</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#moveNext"><span class="hs-identifier hs-var">moveNext</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-486"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-var">shiftMask</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Tab</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#movePrev"><span class="hs-identifier hs-var">movePrev</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-487"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_p</span><span class="hs-special">)</span><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#movePrev"><span class="hs-identifier hs-var">movePrev</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-488"></a><span>    </span><span class="hs-special">]</span><span>
</span><a name="line-489"></a><span>  </span><span class="hs-comment">-- The navigation handler ignores unknown key symbols, therefore we const</span><span>
</span><a name="line-490"></a><span>  </span><a name="local-6989586621679036882"><a href="#local-6989586621679036882"><span class="hs-identifier">navDefaultHandler</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">const</span><span> </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span>
</span><a name="line-491"></a><span>
</span><a name="line-492"></a><span class="hs-comment">-- | This navigation style combines navigation and search into one mode at the cost of losing vi style</span><span>
</span><a name="line-493"></a><span class="hs-comment">-- navigation. With this style, there is no substring search submode,</span><span>
</span><a name="line-494"></a><span class="hs-comment">-- but every typed character is added to the substring search.</span><span>
</span><a name="line-495"></a><span class="hs-identifier">navNSearch</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027784"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027784"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-496"></a><a name="navNSearch"><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier">navNSearch</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#makeXEventhandler"><span class="hs-identifier hs-var">makeXEventhandler</span></a><span>
</span><a name="line-497"></a><span>  </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#shadowWithKeymap"><span class="hs-identifier hs-var">shadowWithKeymap</span></a><span> </span><a href="#local-6989586621679036883"><span class="hs-identifier hs-var">navNSearchKeyMap</span></a><span> </span><a href="#local-6989586621679036884"><span class="hs-identifier hs-var">navNSearchDefaultHandler</span></a><span>
</span><a name="line-498"></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-499"></a><span>  </span><a name="local-6989586621679036883"><a href="#local-6989586621679036883"><span class="hs-identifier">navNSearchKeyMap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">M.fromList</span><span>
</span><a name="line-500"></a><span>    </span><span class="hs-special">[</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Escape</span><span class="hs-special">)</span><span>     </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#cancel"><span class="hs-identifier hs-var">cancel</span></a><span class="hs-special">)</span><span>
</span><a name="line-501"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Return</span><span class="hs-special">)</span><span>     </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#select"><span class="hs-identifier hs-var">select</span></a><span class="hs-special">)</span><span>
</span><a name="line-502"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Left</span><span class="hs-special">)</span><span>       </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-503"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Right</span><span class="hs-special">)</span><span>      </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span class="hs-special">,</span><span> </span><span class="hs-number">0</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-504"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Down</span><span class="hs-special">)</span><span>       </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-505"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Up</span><span class="hs-special">)</span><span>         </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#move"><span class="hs-identifier hs-var">move</span></a><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-glyph">-</span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-506"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Tab</span><span class="hs-special">)</span><span>        </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#moveNext"><span class="hs-identifier hs-var">moveNext</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-507"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-var">shiftMask</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Tab</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#movePrev"><span class="hs-identifier hs-var">movePrev</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span class="hs-special">)</span><span>
</span><a name="line-508"></a><span>    </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_BackSpace</span><span class="hs-special">)</span><span>
</span><a name="line-509"></a><span>      </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier hs-var">transformSearchString</span></a><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679036885"><a href="#local-6989586621679036885"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679036885"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-keyword">then</span><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">init</span><span> </span><a href="#local-6989586621679036885"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-510"></a><span>        </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span>
</span><a name="line-511"></a><span>      </span><span class="hs-special">)</span><span>
</span><a name="line-512"></a><span>    </span><span class="hs-special">]</span><span>
</span><a name="line-513"></a><span>  </span><span class="hs-comment">-- The navigation handler ignores unknown key symbols, therefore we const</span><span>
</span><a name="line-514"></a><span>  </span><a name="local-6989586621679036884"><a href="#local-6989586621679036884"><span class="hs-identifier">navNSearchDefaultHandler</span></a></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">_</span><span class="hs-special">,</span><span> </span><a name="local-6989586621679036886"><a href="#local-6989586621679036886"><span class="hs-identifier">s</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">_</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-515"></a><span>    </span><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier hs-var">transformSearchString</span></a><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var">++</span><span> </span><a href="#local-6989586621679036886"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-516"></a><span>    </span><a href="GridSelect.Extras.html#navNSearch"><span class="hs-identifier hs-var">navNSearch</span></a><span>
</span><a name="line-517"></a><span>
</span><a name="line-518"></a><span class="hs-comment">-- | Navigation submode used for substring search. It returns to the</span><span>
</span><a name="line-519"></a><span class="hs-comment">-- first argument navigation style when the user hits Return.</span><span>
</span><a name="line-520"></a><span class="hs-identifier">substringSearch</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027783"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027783"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679027783"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679027783"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-521"></a><a name="substringSearch"><a href="GridSelect.Extras.html#substringSearch"><span class="hs-identifier">substringSearch</span></a></a><span> </span><a name="local-6989586621679036887"><a href="#local-6989586621679036887"><span class="hs-identifier">returnNavigation</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">fix</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679036888"><a href="#local-6989586621679036888"><span class="hs-identifier">me</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span>
</span><a name="line-522"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036889"><a href="#local-6989586621679036889"><span class="hs-identifier">searchKeyMap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">M.fromList</span><span>
</span><a name="line-523"></a><span>        </span><span class="hs-special">[</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Escape</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier hs-var">transformSearchString</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">const</span><span> </span><span class="hs-string">&quot;&quot;</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="#local-6989586621679036887"><span class="hs-identifier hs-var">returnNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-524"></a><span>        </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_Return</span><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036887"><span class="hs-identifier hs-var">returnNavigation</span></a><span class="hs-special">)</span><span>
</span><a name="line-525"></a><span>        </span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><span> </span><span class="hs-special">(</span><span class="hs-number">0</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">xK_BackSpace</span><span class="hs-special">)</span><span>
</span><a name="line-526"></a><span>          </span><span class="hs-special">,</span><span> </span><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier hs-var">transformSearchString</span></a><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><a name="local-6989586621679036891"><a href="#local-6989586621679036891"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679036891"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-keyword">then</span><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">init</span><span> </span><a href="#local-6989586621679036891"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><a href="#local-6989586621679036888"><span class="hs-identifier hs-var">me</span></a><span>
</span><a name="line-527"></a><span>          </span><span class="hs-special">)</span><span>
</span><a name="line-528"></a><span>        </span><span class="hs-special">]</span><span>
</span><a name="line-529"></a><span>      </span><a name="local-6989586621679036890"><a href="#local-6989586621679036890"><span class="hs-identifier">searchDefaultHandler</span></a></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">_</span><span class="hs-special">,</span><span> </span><a name="local-6989586621679036892"><a href="#local-6989586621679036892"><span class="hs-identifier">s</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">_</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-530"></a><span>        </span><a href="GridSelect.Extras.html#transformSearchString"><span class="hs-identifier hs-var">transformSearchString</span></a><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var">++</span><span> </span><a href="#local-6989586621679036892"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-531"></a><span>        </span><a href="#local-6989586621679036888"><span class="hs-identifier hs-var">me</span></a><span>
</span><a name="line-532"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><a href="GridSelect.Extras.html#makeXEventhandler"><span class="hs-identifier hs-var">makeXEventhandler</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#shadowWithKeymap"><span class="hs-identifier hs-var">shadowWithKeymap</span></a><span> </span><a href="#local-6989586621679036889"><span class="hs-identifier hs-var">searchKeyMap</span></a><span> </span><a href="#local-6989586621679036890"><span class="hs-identifier hs-var">searchDefaultHandler</span></a><span>
</span><a name="line-533"></a><span>
</span><a name="line-534"></a><span>
</span><a name="line-535"></a><span class="hs-comment">-- FIXME probably move that into Utils?</span><span>
</span><a name="line-536"></a><span class="hs-comment">-- Conversion scheme as in http://en.wikipedia.org/wiki/HSV_color_space</span><span>
</span><a name="line-537"></a><span class="hs-identifier">hsv2rgb</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Fractional</span><span> </span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">=&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Integer</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679027256"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-538"></a><a name="hsv2rgb"><a href="GridSelect.Extras.html#hsv2rgb"><span class="hs-identifier">hsv2rgb</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679036893"><a href="#local-6989586621679036893"><span class="hs-identifier">h</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036894"><a href="#local-6989586621679036894"><span class="hs-identifier">s</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036895"><a href="#local-6989586621679036895"><span class="hs-identifier">v</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-539"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036896"><a href="#local-6989586621679036896"><span class="hs-identifier">hi</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">div</span><span> </span><a href="#local-6989586621679036893"><span class="hs-identifier hs-var">h</span></a><span> </span><span class="hs-number">60</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">mod</span><span class="hs-special">`</span><span> </span><span class="hs-number">6</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-540"></a><span>      </span><a name="local-6989586621679036897"><a href="#local-6989586621679036897"><span class="hs-identifier">f</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679036893"><span class="hs-identifier hs-var">h</span></a><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">60</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679036896"><span class="hs-identifier hs-var">hi</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Fractional</span><span> </span><a href="#local-6989586621679036901"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">=&gt;</span><span> </span><a href="#local-6989586621679036901"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-541"></a><span>      </span><a name="local-6989586621679036898"><a href="#local-6989586621679036898"><span class="hs-identifier">q</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036897"><span class="hs-identifier hs-var">f</span></a><span class="hs-special">)</span><span>
</span><a name="line-542"></a><span>      </span><a name="local-6989586621679036899"><a href="#local-6989586621679036899"><span class="hs-identifier">p</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036894"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-543"></a><span>      </span><a name="local-6989586621679036900"><a href="#local-6989586621679036900"><span class="hs-identifier">t</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679036897"><span class="hs-identifier hs-var">f</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679036894"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-544"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><span class="hs-keyword">case</span><span> </span><a href="#local-6989586621679036896"><span class="hs-identifier hs-var">hi</span></a><span> </span><span class="hs-keyword">of</span><span>
</span><a name="line-545"></a><span>        </span><span class="hs-number">0</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036900"><span class="hs-identifier hs-var">t</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">)</span><span>
</span><a name="line-546"></a><span>        </span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036898"><span class="hs-identifier hs-var">q</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">)</span><span>
</span><a name="line-547"></a><span>        </span><span class="hs-number">2</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036900"><span class="hs-identifier hs-var">t</span></a><span class="hs-special">)</span><span>
</span><a name="line-548"></a><span>        </span><span class="hs-number">3</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036898"><span class="hs-identifier hs-var">q</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">)</span><span>
</span><a name="line-549"></a><span>        </span><span class="hs-number">4</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036900"><span class="hs-identifier hs-var">t</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">)</span><span>
</span><a name="line-550"></a><span>        </span><span class="hs-number">5</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036895"><span class="hs-identifier hs-var">v</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036899"><span class="hs-identifier hs-var">p</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036898"><span class="hs-identifier hs-var">q</span></a><span class="hs-special">)</span><span>
</span><a name="line-551"></a><span>        </span><span class="hs-identifier">_</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-var">error</span><span> </span><span class="hs-string">&quot;The world is ending. x mod a &gt;= a.&quot;</span><span>
</span><a name="line-552"></a><span>
</span><a name="line-553"></a><span class="hs-comment">-- | Default colorizer for Strings</span><span>
</span><a name="line-554"></a><span class="hs-identifier">stringColorizer</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-555"></a><a name="stringColorizer"><a href="GridSelect.Extras.html#stringColorizer"><span class="hs-identifier">stringColorizer</span></a></a><span> </span><a name="local-6989586621679036917"><a href="#local-6989586621679036917"><span class="hs-identifier">s</span></a></a><span> </span><a name="local-6989586621679036918"><a href="#local-6989586621679036918"><span class="hs-identifier">active</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-556"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679036919"><a href="#local-6989586621679036919"><span class="hs-identifier">seed</span></a></a><span> </span><a name="local-6989586621679036923"><a href="#local-6989586621679036923"><span class="hs-identifier">x</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">toInteger</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">sum</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-special">(</span><span class="hs-special">(</span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679036923"><span class="hs-identifier hs-var">x</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">fromEnum</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679036917"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Integer</span><span>
</span><a name="line-557"></a><span>      </span><span class="hs-special">(</span><a name="local-6989586621679036920"><a href="#local-6989586621679036920"><span class="hs-identifier">r</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036921"><a href="#local-6989586621679036921"><span class="hs-identifier">g</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036922"><a href="#local-6989586621679036922"><span class="hs-identifier">b</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#hsv2rgb"><span class="hs-identifier hs-var">hsv2rgb</span></a><span>
</span><a name="line-558"></a><span>        </span><span class="hs-special">(</span><span> </span><a href="#local-6989586621679036919"><span class="hs-identifier hs-var">seed</span></a><span> </span><span class="hs-number">83</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">mod</span><span class="hs-special">`</span><span> </span><span class="hs-number">360</span><span>
</span><a name="line-559"></a><span>        </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036919"><span class="hs-identifier hs-var">seed</span></a><span> </span><span class="hs-number">191</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">mod</span><span class="hs-special">`</span><span> </span><span class="hs-number">1000</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2500</span><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-number">0.4</span><span>
</span><a name="line-560"></a><span>        </span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036919"><span class="hs-identifier hs-var">seed</span></a><span> </span><span class="hs-number">121</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">mod</span><span class="hs-special">`</span><span> </span><span class="hs-number">1000</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2500</span><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-number">0.4</span><span>
</span><a name="line-561"></a><span>        </span><span class="hs-special">)</span><span>
</span><a name="line-562"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679036918"><span class="hs-identifier hs-var">active</span></a><span>
</span><a name="line-563"></a><span>        </span><span class="hs-keyword">then</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#faff69&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;black&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-564"></a><span>        </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">return</span><span>
</span><a name="line-565"></a><span>          </span><span class="hs-special">(</span><span> </span><span class="hs-string">&quot;#&quot;</span><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">concatMap</span><span>
</span><a name="line-566"></a><span>            </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#twodigitHex"><span class="hs-identifier hs-var">twodigitHex</span></a><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">round</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Double</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-special">(</span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-number">256</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-567"></a><span>            </span><span class="hs-special">[</span><a href="#local-6989586621679036920"><span class="hs-identifier hs-var">r</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036921"><span class="hs-identifier hs-var">g</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036922"><span class="hs-identifier hs-var">b</span></a><span class="hs-special">]</span><span>
</span><a name="line-568"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;white&quot;</span><span>
</span><a name="line-569"></a><span>          </span><span class="hs-special">)</span><span>
</span><a name="line-570"></a><span>
</span><a name="line-571"></a><span class="hs-comment">-- | Colorize a window depending on it's className.</span><span>
</span><a name="line-572"></a><span class="hs-identifier">fromClassName</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-573"></a><a name="fromClassName"><a href="GridSelect.Extras.html#fromClassName"><span class="hs-identifier">fromClassName</span></a></a><span> </span><a name="local-6989586621679036924"><a href="#local-6989586621679036924"><span class="hs-identifier">w</span></a></a><span> </span><a name="local-6989586621679036925"><a href="#local-6989586621679036925"><span class="hs-identifier">active</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">runQuery</span><span> </span><span class="hs-identifier hs-var">className</span><span> </span><a href="#local-6989586621679036924"><span class="hs-identifier hs-var">w</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;=</span><span> </span><span class="hs-identifier hs-var">flip</span><span> </span><a href="GridSelect.Extras.html#defaultColorizer"><span class="hs-identifier hs-var">defaultColorizer</span></a><span> </span><a href="#local-6989586621679036925"><span class="hs-identifier hs-var">active</span></a><span>
</span><a name="line-574"></a><span>
</span><a name="line-575"></a><span class="hs-identifier">twodigitHex</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Word8</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-576"></a><a name="twodigitHex"><a href="GridSelect.Extras.html#twodigitHex"><span class="hs-identifier">twodigitHex</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">printf</span><span> </span><span class="hs-string">&quot;%02x&quot;</span><span>
</span><a name="line-577"></a><span>
</span><a name="line-578"></a><span class="hs-comment">-- | A colorizer that picks a color inside a range,</span><span>
</span><a name="line-579"></a><span class="hs-comment">-- and depending on the window's class.</span><span>
</span><a name="line-580"></a><span class="hs-identifier">colorRangeFromClassName</span><span>
</span><a name="line-581"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-comment">-- ^ Beginning of the color range</span><span>
</span><a name="line-582"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-comment">-- ^ End of the color range</span><span>
</span><a name="line-583"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-comment">-- ^ Background of the active window</span><span>
</span><a name="line-584"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-comment">-- ^ Inactive text color</span><span>
</span><a name="line-585"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-comment">-- ^ Active text color</span><span>
</span><a name="line-586"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Window</span><span>
</span><a name="line-587"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span>
</span><a name="line-588"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-589"></a><a name="colorRangeFromClassName"><a href="GridSelect.Extras.html#colorRangeFromClassName"><span class="hs-identifier">colorRangeFromClassName</span></a></a><span> </span><a name="local-6989586621679036985"><a href="#local-6989586621679036985"><span class="hs-identifier">startC</span></a></a><span> </span><a name="local-6989586621679036986"><a href="#local-6989586621679036986"><span class="hs-identifier">endC</span></a></a><span> </span><a name="local-6989586621679036987"><a href="#local-6989586621679036987"><span class="hs-identifier">activeC</span></a></a><span> </span><a name="local-6989586621679036988"><a href="#local-6989586621679036988"><span class="hs-identifier">inactiveT</span></a></a><span> </span><a name="local-6989586621679036989"><a href="#local-6989586621679036989"><span class="hs-identifier">activeT</span></a></a><span> </span><a name="local-6989586621679036990"><a href="#local-6989586621679036990"><span class="hs-identifier">w</span></a></a><span> </span><a name="local-6989586621679036991"><a href="#local-6989586621679036991"><span class="hs-identifier">active</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-590"></a><span>  </span><a name="local-6989586621679036996"><a href="#local-6989586621679036996"><span class="hs-identifier">classname</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">runQuery</span><span> </span><span class="hs-identifier hs-var">className</span><span> </span><a href="#local-6989586621679036990"><span class="hs-identifier hs-var">w</span></a><span>
</span><a name="line-591"></a><span>  </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679036991"><span class="hs-identifier hs-var">active</span></a><span>
</span><a name="line-592"></a><span>    </span><span class="hs-keyword">then</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679036992"><span class="hs-identifier hs-var">rgbToHex</span></a><span> </span><a href="#local-6989586621679036987"><span class="hs-identifier hs-var">activeC</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036992"><span class="hs-identifier hs-var">rgbToHex</span></a><span> </span><a href="#local-6989586621679036989"><span class="hs-identifier hs-var">activeT</span></a><span class="hs-special">)</span><span>
</span><a name="line-593"></a><span>    </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">return</span><span>
</span><a name="line-594"></a><span>      </span><span class="hs-special">(</span><a href="#local-6989586621679036992"><span class="hs-identifier hs-var">rgbToHex</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#mix"><span class="hs-identifier hs-var">mix</span></a><span> </span><a href="#local-6989586621679036985"><span class="hs-identifier hs-var">startC</span></a><span> </span><a href="#local-6989586621679036986"><span class="hs-identifier hs-var">endC</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="GridSelect.Extras.html#stringToRatio"><span class="hs-identifier hs-var">stringToRatio</span></a><span> </span><a href="#local-6989586621679036996"><span class="hs-identifier hs-var">classname</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679036992"><span class="hs-identifier hs-var">rgbToHex</span></a><span> </span><a href="#local-6989586621679036988"><span class="hs-identifier hs-var">inactiveT</span></a><span class="hs-special">)</span><span>
</span><a name="line-595"></a><span> </span><span class="hs-keyword">where</span><span>
</span><a name="line-596"></a><span>  </span><span class="hs-identifier">rgbToHex</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-597"></a><span>  </span><a name="local-6989586621679036992"><a href="#local-6989586621679036992"><span class="hs-identifier">rgbToHex</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679036993"><a href="#local-6989586621679036993"><span class="hs-identifier">r</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036994"><a href="#local-6989586621679036994"><span class="hs-identifier">g</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036995"><a href="#local-6989586621679036995"><span class="hs-identifier">b</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-char">'#'</span><span> </span><span class="hs-glyph">:</span><span> </span><a href="GridSelect.Extras.html#twodigitHex"><span class="hs-identifier hs-var">twodigitHex</span></a><span> </span><a href="#local-6989586621679036993"><span class="hs-identifier hs-var">r</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><a href="GridSelect.Extras.html#twodigitHex"><span class="hs-identifier hs-var">twodigitHex</span></a><span> </span><a href="#local-6989586621679036994"><span class="hs-identifier hs-var">g</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><a href="GridSelect.Extras.html#twodigitHex"><span class="hs-identifier hs-var">twodigitHex</span></a><span> </span><a href="#local-6989586621679036995"><span class="hs-identifier hs-var">b</span></a><span>
</span><a name="line-598"></a><span>
</span><a name="line-599"></a><span class="hs-comment">-- | Creates a mix of two colors according to a ratio</span><span>
</span><a name="line-600"></a><span class="hs-comment">-- (1 -&gt; first color, 0 -&gt; second color).</span><span>
</span><a name="line-601"></a><span class="hs-identifier">mix</span><span>
</span><a name="line-602"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span>
</span><a name="line-603"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span>
</span><a name="line-604"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Double</span><span>
</span><a name="line-605"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Word8</span><span class="hs-special">)</span><span>
</span><a name="line-606"></a><a name="mix"><a href="GridSelect.Extras.html#mix"><span class="hs-identifier">mix</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679036997"><a href="#local-6989586621679036997"><span class="hs-identifier">r1</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036998"><a href="#local-6989586621679036998"><span class="hs-identifier">g1</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679036999"><a href="#local-6989586621679036999"><span class="hs-identifier">b1</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-special">(</span><a name="local-6989586621679037000"><a href="#local-6989586621679037000"><span class="hs-identifier">r2</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679037001"><a href="#local-6989586621679037001"><span class="hs-identifier">g2</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679037002"><a href="#local-6989586621679037002"><span class="hs-identifier">b2</span></a></a><span class="hs-special">)</span><span> </span><a name="local-6989586621679037003"><a href="#local-6989586621679037003"><span class="hs-identifier">r</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679037004"><span class="hs-identifier hs-var">mix'</span></a><span> </span><a href="#local-6989586621679036997"><span class="hs-identifier hs-var">r1</span></a><span> </span><a href="#local-6989586621679037000"><span class="hs-identifier hs-var">r2</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679037004"><span class="hs-identifier hs-var">mix'</span></a><span> </span><a href="#local-6989586621679036998"><span class="hs-identifier hs-var">g1</span></a><span> </span><a href="#local-6989586621679037001"><span class="hs-identifier hs-var">g2</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679037004"><span class="hs-identifier hs-var">mix'</span></a><span> </span><a href="#local-6989586621679036999"><span class="hs-identifier hs-var">b1</span></a><span> </span><a href="#local-6989586621679037002"><span class="hs-identifier hs-var">b2</span></a><span class="hs-special">)</span><span>
</span><a name="line-607"></a><span>  </span><span class="hs-keyword">where</span><span> </span><a name="local-6989586621679037004"><a href="#local-6989586621679037004"><span class="hs-identifier">mix'</span></a></a><span> </span><a name="local-6989586621679037005"><a href="#local-6989586621679037005"><span class="hs-identifier">a</span></a></a><span> </span><a name="local-6989586621679037006"><a href="#local-6989586621679037006"><span class="hs-identifier">b</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">truncate</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fi</span><span> </span><a href="#local-6989586621679037005"><span class="hs-identifier hs-var">a</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679037003"><span class="hs-identifier hs-var">r</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">+</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fi</span><span> </span><a href="#local-6989586621679037006"><span class="hs-identifier hs-var">b</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679037003"><span class="hs-identifier hs-var">r</span></a><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-608"></a><span>
</span><a name="line-609"></a><span class="hs-comment">-- | Generates a Double from a string, trying to</span><span>
</span><a name="line-610"></a><span class="hs-comment">-- achieve a random distribution.</span><span>
</span><a name="line-611"></a><span class="hs-comment">-- We create a random seed from the sum of all characters</span><span>
</span><a name="line-612"></a><span class="hs-comment">-- in the string, and use it to generate a ratio between 0 and 1</span><span>
</span><a name="line-613"></a><span class="hs-identifier">stringToRatio</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Double</span><span>
</span><a name="line-614"></a><a name="stringToRatio"><a href="GridSelect.Extras.html#stringToRatio"><span class="hs-identifier">stringToRatio</span></a></a><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-number">0</span><span>
</span><a name="line-615"></a><span class="hs-identifier">stringToRatio</span><span> </span><a name="local-6989586621679037007"><a href="#local-6989586621679037007"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-616"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679037008"><a href="#local-6989586621679037008"><span class="hs-identifier">gen</span></a></a><span>       </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">mkStdGen</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">sum</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">fromEnum</span><span> </span><a href="#local-6989586621679037007"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-617"></a><span>      </span><a name="local-6989586621679037009"><a href="#local-6989586621679037009"><span class="hs-identifier">range</span></a></a><span>     </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-glyph">\</span><span class="hs-special">(</span><a name="local-6989586621679037012"><a href="#local-6989586621679037012"><span class="hs-identifier">a</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679037013"><a href="#local-6989586621679037013"><span class="hs-identifier">b</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679037013"><span class="hs-identifier hs-var">b</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679037012"><span class="hs-identifier hs-var">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">genRange</span><span> </span><a href="#local-6989586621679037008"><span class="hs-identifier hs-var">gen</span></a><span>
</span><a name="line-618"></a><span>      </span><a name="local-6989586621679037010"><a href="#local-6989586621679037010"><span class="hs-identifier">randomInt</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">foldr1</span><span> </span><a href="#local-6989586621679037011"><span class="hs-identifier hs-var">combine</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">replicate</span><span> </span><span class="hs-number">20</span><span> </span><span class="hs-identifier hs-var">next</span><span>
</span><a name="line-619"></a><span>      </span><a name="local-6989586621679037011"><a href="#local-6989586621679037011"><span class="hs-identifier">combine</span></a></a><span> </span><a name="local-6989586621679037014"><a href="#local-6989586621679037014"><span class="hs-identifier">f1</span></a></a><span> </span><a name="local-6989586621679037015"><a href="#local-6989586621679037015"><span class="hs-identifier">f2</span></a></a><span> </span><a name="local-6989586621679037016"><a href="#local-6989586621679037016"><span class="hs-identifier">g</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">let</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">_</span><span class="hs-special">,</span><span> </span><a name="local-6989586621679037017"><a href="#local-6989586621679037017"><span class="hs-identifier">g'</span></a></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679037014"><span class="hs-identifier hs-var">f1</span></a><span> </span><a href="#local-6989586621679037016"><span class="hs-identifier hs-var">g</span></a><span> </span><span class="hs-keyword">in</span><span> </span><a href="#local-6989586621679037015"><span class="hs-identifier hs-var">f2</span></a><span> </span><a href="#local-6989586621679037017"><span class="hs-identifier hs-var">g'</span></a><span>
</span><a name="line-620"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><span class="hs-identifier hs-var">fi</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fst</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679037010"><span class="hs-identifier hs-var">randomInt</span></a><span> </span><a href="#local-6989586621679037008"><span class="hs-identifier hs-var">gen</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-identifier hs-var">fi</span><span> </span><a href="#local-6989586621679037009"><span class="hs-identifier hs-var">range</span></a><span>
</span><a name="line-621"></a><span>
</span><a name="line-622"></a><span class="hs-comment">-- | Brings up a 2D grid of elements in the center of the screen, and one can</span><span>
</span><a name="line-623"></a><span class="hs-comment">-- select an element with cursors keys. The selected element is returned.</span><span>
</span><a name="line-624"></a><span class="hs-identifier">gridselect</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679026447"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679026447"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679026447"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-625"></a><a name="gridselect"><a href="GridSelect.Extras.html#gridselect"><span class="hs-identifier">gridselect</span></a></a><span> </span><span class="hs-identifier">_</span><span>        </span><span class="hs-special">[</span><span class="hs-special">]</span><span>       </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-626"></a><span class="hs-identifier">gridselect</span><span> </span><a name="local-6989586621679037018"><a href="#local-6989586621679037018"><span class="hs-identifier">gsconfig</span></a></a><span> </span><a name="local-6989586621679037019"><a href="#local-6989586621679037019"><span class="hs-identifier">elements</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">withDisplay</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679037020"><a href="#local-6989586621679037020"><span class="hs-identifier">dpy</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-627"></a><span>  </span><a name="local-6989586621679037021"><a href="#local-6989586621679037021"><span class="hs-identifier">rootw</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">asks</span><span> </span><span class="hs-identifier">theRoot</span><span>
</span><a name="line-628"></a><span>  </span><a name="local-6989586621679037022"><a href="#local-6989586621679037022"><span class="hs-identifier">scr</span></a></a><span>   </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">screenRect</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">W.screenDetail</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">W.current</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">windowset</span><span>
</span><a name="line-629"></a><span>  </span><a name="local-6989586621679038367"><a href="#local-6989586621679038367"><span class="hs-identifier">win</span></a></a><span>   </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">mkUnmanagedWindow</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-630"></a><span>                                      </span><span class="hs-special">(</span><span class="hs-identifier hs-var">defaultScreenOfDisplay</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span class="hs-special">)</span><span>
</span><a name="line-631"></a><span>                                      </span><a href="#local-6989586621679037021"><span class="hs-identifier hs-var">rootw</span></a><span>
</span><a name="line-632"></a><span>                                      </span><span class="hs-special">(</span><span class="hs-identifier">rect_x</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-633"></a><span>                                      </span><span class="hs-special">(</span><span class="hs-identifier">rect_y</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-634"></a><span>                                      </span><span class="hs-special">(</span><span class="hs-identifier">rect_width</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-635"></a><span>                                      </span><span class="hs-special">(</span><span class="hs-identifier">rect_height</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-636"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">mapWindow</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-637"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">selectInput</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-638"></a><span>                       </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-639"></a><span>                       </span><span class="hs-special">(</span><span class="hs-identifier hs-var">exposureMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">keyPressMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">buttonReleaseMask</span><span class="hs-special">)</span><span>
</span><a name="line-640"></a><span>  </span><a name="local-6989586621679038432"><a href="#local-6989586621679038432"><span class="hs-identifier">status</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">io</span><span>
</span><a name="line-641"></a><span>    </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">grabKeyboard</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span> </span><span class="hs-identifier hs-var">True</span><span> </span><span class="hs-identifier hs-var">grabModeAsync</span><span> </span><span class="hs-identifier hs-var">grabModeAsync</span><span> </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-642"></a><span>  </span><span class="hs-identifier hs-var">io</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">grabPointer</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-643"></a><span>                   </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-644"></a><span>                   </span><span class="hs-identifier hs-var">True</span><span>
</span><a name="line-645"></a><span>                   </span><span class="hs-identifier hs-var">buttonReleaseMask</span><span>
</span><a name="line-646"></a><span>                   </span><span class="hs-identifier hs-var">grabModeAsync</span><span>
</span><a name="line-647"></a><span>                   </span><span class="hs-identifier hs-var">grabModeAsync</span><span>
</span><a name="line-648"></a><span>                   </span><span class="hs-identifier hs-var">none</span><span>
</span><a name="line-649"></a><span>                   </span><span class="hs-identifier hs-var">none</span><span>
</span><a name="line-650"></a><span>                   </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-651"></a><span>  </span><a name="local-6989586621679038433"><a href="#local-6989586621679038433"><span class="hs-identifier">font</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initXMF</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_font</span><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-652"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679038434"><a href="#local-6989586621679038434"><span class="hs-identifier">screenWidth</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">toInteger</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">rect_width</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span>
</span><a name="line-653"></a><span>      </span><a name="local-6989586621679038435"><a href="#local-6989586621679038435"><span class="hs-identifier">screenHeight</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">toInteger</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">rect_height</span><span> </span><a href="#local-6989586621679037022"><span class="hs-identifier hs-var">scr</span></a><span>
</span><a name="line-654"></a><span>  </span><a name="local-6989586621679038446"><a href="#local-6989586621679038446"><span class="hs-identifier">selectedElement</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679038432"><span class="hs-identifier hs-var">status</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-identifier hs-var">grabSuccess</span><span>
</span><a name="line-655"></a><span>    </span><span class="hs-keyword">then</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-656"></a><span>      </span><span class="hs-keyword">let</span><span>
</span><a name="line-657"></a><span>        </span><a name="local-6989586621679038436"><a href="#local-6989586621679038436"><span class="hs-identifier">restriction</span></a></a><span> </span><a name="local-6989586621679038443"><a href="#local-6989586621679038443"><span class="hs-identifier">ss</span></a></a><span> </span><a name="local-6989586621679038444"><a href="#local-6989586621679038444"><span class="hs-identifier">cs</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-658"></a><span>          </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679038443"><span class="hs-identifier hs-var">ss</span></a><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679038444"><span class="hs-identifier hs-var">cs</span></a><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Double</span><span>
</span><a name="line-659"></a><span>        </span><a name="local-6989586621679038437"><a href="#local-6989586621679038437"><span class="hs-identifier">restrictX</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">floor</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679038436"><span class="hs-identifier hs-var">restriction</span></a><span> </span><a href="#local-6989586621679038434"><span class="hs-identifier hs-var">screenWidth</span></a><span> </span><span class="hs-identifier">gs_cellwidth</span><span>
</span><a name="line-660"></a><span>        </span><a name="local-6989586621679038438"><a href="#local-6989586621679038438"><span class="hs-identifier">restrictY</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">floor</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679038436"><span class="hs-identifier hs-var">restriction</span></a><span> </span><a href="#local-6989586621679038435"><span class="hs-identifier hs-var">screenHeight</span></a><span> </span><span class="hs-identifier">gs_cellheight</span><span>
</span><a name="line-661"></a><span>        </span><a name="local-6989586621679038439"><a href="#local-6989586621679038439"><span class="hs-identifier">originPosX</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-662"></a><span>          </span><span class="hs-identifier hs-var">floor</span><span>
</span><a name="line-663"></a><span>            </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_originFractX</span><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-664"></a><span>            </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-665"></a><span>            </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><a href="#local-6989586621679038437"><span class="hs-identifier hs-var">restrictX</span></a><span>
</span><a name="line-666"></a><span>        </span><a name="local-6989586621679038440"><a href="#local-6989586621679038440"><span class="hs-identifier">originPosY</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-667"></a><span>          </span><span class="hs-identifier hs-var">floor</span><span>
</span><a name="line-668"></a><span>            </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_originFractY</span><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-669"></a><span>            </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-670"></a><span>            </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><a href="#local-6989586621679038438"><span class="hs-identifier hs-var">restrictY</span></a><span>
</span><a name="line-671"></a><span>        </span><a name="local-6989586621679038441"><a href="#local-6989586621679038441"><span class="hs-identifier">coords</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#diamondRestrict"><span class="hs-identifier hs-var">diamondRestrict</span></a><span> </span><a href="#local-6989586621679038437"><span class="hs-identifier hs-var">restrictX</span></a><span> </span><a href="#local-6989586621679038438"><span class="hs-identifier hs-var">restrictY</span></a><span> </span><a href="#local-6989586621679038439"><span class="hs-identifier hs-var">originPosX</span></a><span> </span><a href="#local-6989586621679038440"><span class="hs-identifier hs-var">originPosY</span></a><span>
</span><a name="line-672"></a><span>        </span><a name="local-6989586621679038442"><a href="#local-6989586621679038442"><span class="hs-identifier">s</span></a></a><span>      </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span>
</span><a name="line-673"></a><span>          </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_curpos</span><span>       </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">head</span><span> </span><a href="#local-6989586621679038441"><span class="hs-identifier hs-var">coords</span></a><span>
</span><a name="line-674"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_availSlots</span><span>   </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038441"><span class="hs-identifier hs-var">coords</span></a><span>
</span><a name="line-675"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_elements</span><span>     </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679037019"><span class="hs-identifier hs-var">elements</span></a><span>
</span><a name="line-676"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span>     </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-677"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_font</span><span>         </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038433"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-678"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneX</span><span>        </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038434"><span class="hs-identifier hs-var">screenWidth</span></a><span>
</span><a name="line-679"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneY</span><span>        </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038435"><span class="hs-identifier hs-var">screenHeight</span></a><span>
</span><a name="line-680"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_drawingWin</span><span>   </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-681"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_searchString</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">&quot;&quot;</span><span>
</span><a name="line-682"></a><span>          </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_elementmap</span><span>   </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span>
</span><a name="line-683"></a><span>          </span><span class="hs-special">}</span><span>
</span><a name="line-684"></a><span>      </span><a name="local-6989586621679038445"><a href="#local-6989586621679038445"><span class="hs-identifier">m</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#generateElementmap"><span class="hs-identifier hs-var">generateElementmap</span></a><span> </span><a href="#local-6989586621679038442"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-685"></a><span>      </span><a href="GridSelect.Extras.html#evalTwoD"><span class="hs-identifier hs-var">evalTwoD</span></a><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#updateAllElements"><span class="hs-identifier hs-var">updateAllElements</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><span class="hs-identifier">gs_navigate</span><span> </span><a href="#local-6989586621679037018"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-686"></a><span>               </span><span class="hs-special">(</span><a href="#local-6989586621679038442"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679038445"><span class="hs-identifier hs-var">m</span></a><span> </span><span class="hs-special">}</span><span class="hs-special">)</span><span>
</span><a name="line-687"></a><span>    </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-688"></a><span>  </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-689"></a><span>    </span><span class="hs-identifier hs-var">unmapWindow</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-690"></a><span>    </span><span class="hs-identifier hs-var">destroyWindow</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679038367"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-691"></a><span>    </span><span class="hs-identifier hs-var">ungrabPointer</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-692"></a><span>    </span><span class="hs-identifier hs-var">sync</span><span> </span><a href="#local-6989586621679037020"><span class="hs-identifier hs-var">dpy</span></a><span> </span><span class="hs-identifier hs-var">False</span><span>
</span><a name="line-693"></a><span>  </span><span class="hs-identifier hs-var">releaseXMF</span><span> </span><a href="#local-6989586621679038433"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-694"></a><span>  </span><span class="hs-identifier hs-var">return</span><span> </span><a href="#local-6989586621679038446"><span class="hs-identifier hs-var">selectedElement</span></a><span>
</span><a name="line-695"></a><span>
</span><a name="line-696"></a><span class="hs-comment">-- | Like `gridSelect' but with the current windows and their titles as elements</span><span>
</span><a name="line-697"></a><span class="hs-identifier">gridselectWindow</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><span class="hs-identifier hs-type">Window</span><span class="hs-special">)</span><span>
</span><a name="line-698"></a><a name="gridselectWindow"><a href="GridSelect.Extras.html#gridselectWindow"><span class="hs-identifier">gridselectWindow</span></a></a><span> </span><a name="local-6989586621679038447"><a href="#local-6989586621679038447"><span class="hs-identifier">gsconf</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#windowMap"><span class="hs-identifier hs-var">windowMap</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;=</span><span> </span><a href="GridSelect.Extras.html#gridselect"><span class="hs-identifier hs-var">gridselect</span></a><span> </span><a href="#local-6989586621679038447"><span class="hs-identifier hs-var">gsconf</span></a><span>
</span><a name="line-699"></a><span>
</span><a name="line-700"></a><span class="hs-comment">-- | Brings up a 2D grid of windows in the center of the screen, and one can</span><span>
</span><a name="line-701"></a><span class="hs-comment">-- select a window with cursors keys. The selected window is then passed to</span><span>
</span><a name="line-702"></a><span class="hs-comment">-- a callback function.</span><span>
</span><a name="line-703"></a><span class="hs-identifier">withSelectedWindow</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-704"></a><a name="withSelectedWindow"><a href="GridSelect.Extras.html#withSelectedWindow"><span class="hs-identifier">withSelectedWindow</span></a></a><span> </span><a name="local-6989586621679038448"><a href="#local-6989586621679038448"><span class="hs-identifier">callback</span></a></a><span> </span><a name="local-6989586621679038449"><a href="#local-6989586621679038449"><span class="hs-identifier">conf</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-705"></a><span>  </span><a name="local-6989586621679038450"><a href="#local-6989586621679038450"><span class="hs-identifier">mbWindow</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#gridselectWindow"><span class="hs-identifier hs-var">gridselectWindow</span></a><span> </span><a href="#local-6989586621679038449"><span class="hs-identifier hs-var">conf</span></a><span>
</span><a name="line-706"></a><span>  </span><span class="hs-identifier hs-var">Data.Foldable.forM_</span><span> </span><a href="#local-6989586621679038450"><span class="hs-identifier hs-var">mbWindow</span></a><span> </span><a href="#local-6989586621679038448"><span class="hs-identifier hs-var">callback</span></a><span>
</span><a name="line-707"></a><span class="hs-comment">--    case mbWindow of</span><span>
</span><a name="line-708"></a><span class="hs-comment">--        Just w -&gt; callback w</span><span>
</span><a name="line-709"></a><span class="hs-comment">--        Nothing -&gt; return ()</span><span>
</span><a name="line-710"></a><span>
</span><a name="line-711"></a><span class="hs-identifier">windowMap</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">Window</span><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-712"></a><a name="windowMap"><a href="GridSelect.Extras.html#windowMap"><span class="hs-identifier">windowMap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-713"></a><span>  </span><a name="local-6989586621679038453"><a href="#local-6989586621679038453"><span class="hs-identifier">ws</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-identifier">windowset</span><span>
</span><a name="line-714"></a><span>  </span><span class="hs-identifier hs-var">mapM</span><span> </span><a href="#local-6989586621679038451"><span class="hs-identifier hs-var">keyValuePair</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">W.allWindows</span><span> </span><a href="#local-6989586621679038453"><span class="hs-identifier hs-var">ws</span></a><span class="hs-special">)</span><span>
</span><a name="line-715"></a><span>  </span><span class="hs-keyword">where</span><span> </span><a name="local-6989586621679038451"><a href="#local-6989586621679038451"><span class="hs-identifier">keyValuePair</span></a></a><span> </span><a name="local-6989586621679038452"><a href="#local-6989586621679038452"><span class="hs-identifier">w</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">(</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679038452"><span class="hs-identifier hs-var">w</span></a><span class="hs-special">)</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">fmap</span><span class="hs-special">`</span><span> </span><a href="GridSelect.Extras.html#decorateName%27"><span class="hs-identifier hs-var">decorateName'</span></a><span> </span><a href="#local-6989586621679038452"><span class="hs-identifier hs-var">w</span></a><span>
</span><a name="line-716"></a><span>
</span><a name="line-717"></a><span class="hs-identifier">decorateName'</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-identifier hs-type">String</span><span>
</span><a name="line-718"></a><a name="decorateName%27"><a href="GridSelect.Extras.html#decorateName%27"><span class="hs-identifier">decorateName'</span></a></a><span> </span><a name="local-6989586621679038900"><a href="#local-6989586621679038900"><span class="hs-identifier">w</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">show</span><span> </span><span class="hs-operator hs-var">&lt;$&gt;</span><span> </span><span class="hs-identifier hs-var">getName</span><span> </span><a href="#local-6989586621679038900"><span class="hs-identifier hs-var">w</span></a><span>
</span><a name="line-719"></a><span>
</span><a name="line-720"></a><span class="hs-comment">-- | Builds a default gs config from a colorizer function.</span><span>
</span><a name="line-721"></a><span class="hs-identifier">buildDefaultGSConfig</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679026446"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679026446"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-722"></a><a name="buildDefaultGSConfig"><a href="GridSelect.Extras.html#buildDefaultGSConfig"><span class="hs-identifier">buildDefaultGSConfig</span></a></a><span> </span><a name="local-6989586621679039744"><a href="#local-6989586621679039744"><span class="hs-identifier">col</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-var">GSConfig</span></a><span> </span><span class="hs-number">50</span><span>
</span><a name="line-723"></a><span>                                    </span><span class="hs-number">130</span><span>
</span><a name="line-724"></a><span>                                    </span><span class="hs-number">10</span><span>
</span><a name="line-725"></a><span>                                    </span><a href="#local-6989586621679039744"><span class="hs-identifier hs-var">col</span></a><span>
</span><a name="line-726"></a><span>                                    </span><span class="hs-string">&quot;xft:Sans-8&quot;</span><span>
</span><a name="line-727"></a><span>                                    </span><a href="GridSelect.Extras.html#defaultNavigation"><span class="hs-identifier hs-var">defaultNavigation</span></a><span>
</span><a name="line-728"></a><span>                                    </span><a href="GridSelect.Extras.html#noRearranger"><span class="hs-identifier hs-var">noRearranger</span></a><span>
</span><a name="line-729"></a><span>                                    </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span>
</span><a name="line-730"></a><span>                                    </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span>
</span><a name="line-731"></a><span>                                    </span><span class="hs-string">&quot;white&quot;</span><span>
</span><a name="line-732"></a><span>
</span><a name="line-733"></a><span class="hs-comment">-- | Brings selected window to the current workspace.</span><span>
</span><a name="line-734"></a><span class="hs-identifier">bringSelected</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-735"></a><a name="bringSelected"><a href="GridSelect.Extras.html#bringSelected"><span class="hs-identifier">bringSelected</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#withSelectedWindow"><span class="hs-identifier hs-var">withSelectedWindow</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679039745"><a href="#local-6989586621679039745"><span class="hs-identifier">w</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-736"></a><span>  </span><span class="hs-identifier hs-var">windows</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">bringWindow</span><span> </span><a href="#local-6989586621679039745"><span class="hs-identifier hs-var">w</span></a><span class="hs-special">)</span><span>
</span><a name="line-737"></a><span>  </span><span class="hs-identifier hs-var">XMonad.focus</span><span> </span><a href="#local-6989586621679039745"><span class="hs-identifier hs-var">w</span></a><span>
</span><a name="line-738"></a><span>  </span><span class="hs-identifier hs-var">windows</span><span> </span><span class="hs-identifier hs-var">W.shiftMaster</span><span>
</span><a name="line-739"></a><span>
</span><a name="line-740"></a><span class="hs-comment">-- | Switches to selected window's workspace and focuses that window.</span><span>
</span><a name="line-741"></a><span class="hs-identifier">goToSelected</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">Window</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-742"></a><a name="goToSelected"><a href="GridSelect.Extras.html#goToSelected"><span class="hs-identifier">goToSelected</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#withSelectedWindow"><span class="hs-identifier hs-var">withSelectedWindow</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">windows</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier hs-var">W.focusWindow</span><span>
</span><a name="line-743"></a><span>
</span><a name="line-744"></a><span class="hs-comment">-- | Select an application to spawn from a given list</span><span>
</span><a name="line-745"></a><span class="hs-identifier">spawnSelected</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-identifier hs-type">String</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-746"></a><a name="spawnSelected"><a href="GridSelect.Extras.html#spawnSelected"><span class="hs-identifier">spawnSelected</span></a></a><span> </span><a name="local-6989586621679039746"><a href="#local-6989586621679039746"><span class="hs-identifier">conf</span></a></a><span> </span><a name="local-6989586621679039747"><a href="#local-6989586621679039747"><span class="hs-identifier">lst</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#gridselect"><span class="hs-identifier hs-var">gridselect</span></a><span> </span><a href="#local-6989586621679039746"><span class="hs-identifier hs-var">conf</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">zip</span><span> </span><a href="#local-6989586621679039747"><span class="hs-identifier hs-var">lst</span></a><span> </span><a href="#local-6989586621679039747"><span class="hs-identifier hs-var">lst</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;=</span><span> </span><span class="hs-identifier hs-var">flip</span><span> </span><span class="hs-identifier hs-var">whenJust</span><span> </span><span class="hs-identifier hs-var">spawn</span><span>
</span><a name="line-747"></a><span>
</span><a name="line-748"></a><span class="hs-comment">-- | Select an action and run it in the X monad</span><span>
</span><a name="line-749"></a><span class="hs-identifier">runSelectedAction</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-750"></a><a name="runSelectedAction"><a href="GridSelect.Extras.html#runSelectedAction"><span class="hs-identifier">runSelectedAction</span></a></a><span> </span><a name="local-6989586621679039748"><a href="#local-6989586621679039748"><span class="hs-identifier">conf</span></a></a><span> </span><a name="local-6989586621679039749"><a href="#local-6989586621679039749"><span class="hs-identifier">actions</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-751"></a><span>  </span><a name="local-6989586621679039750"><a href="#local-6989586621679039750"><span class="hs-identifier">selectedActionM</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#gridselect"><span class="hs-identifier hs-var">gridselect</span></a><span> </span><a href="#local-6989586621679039748"><span class="hs-identifier hs-var">conf</span></a><span> </span><a href="#local-6989586621679039749"><span class="hs-identifier hs-var">actions</span></a><span>
</span><a name="line-752"></a><span>  </span><span class="hs-identifier hs-var">fromMaybe</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679039750"><span class="hs-identifier hs-var">selectedActionM</span></a><span>
</span><a name="line-753"></a><span class="hs-comment">--    case selectedActionM of</span><span>
</span><a name="line-754"></a><span class="hs-comment">--        Just selectedAction -&gt; selectedAction</span><span>
</span><a name="line-755"></a><span class="hs-comment">--        Nothing -&gt; return ()</span><span>
</span><a name="line-756"></a><span>
</span><a name="line-757"></a><span class="hs-comment">-- | Select a workspace and view it using the given function</span><span>
</span><a name="line-758"></a><span class="hs-comment">-- (normally 'W.view' or 'W.greedyView')</span><span>
</span><a name="line-759"></a><span class="hs-comment">--</span><span>
</span><a name="line-760"></a><span class="hs-comment">-- Another option is to shift the current window to the selected workspace:</span><span>
</span><a name="line-761"></a><span class="hs-comment">--</span><span>
</span><a name="line-762"></a><span class="hs-comment">-- &gt; gridselectWorkspace (\ws -&gt; W.greedyView ws . W.shift ws)</span><span>
</span><a name="line-763"></a><span class="hs-identifier">gridselectWorkspace</span><span>
</span><a name="line-764"></a><span>  </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">WorkspaceId</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">WorkspaceId</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">WindowSet</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">WindowSet</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-765"></a><a name="gridselectWorkspace"><a href="GridSelect.Extras.html#gridselectWorkspace"><span class="hs-identifier">gridselectWorkspace</span></a></a><span> </span><a name="local-6989586621679039751"><a href="#local-6989586621679039751"><span class="hs-identifier">conf</span></a></a><span> </span><a name="local-6989586621679039752"><a href="#local-6989586621679039752"><span class="hs-identifier">viewFunc</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-766"></a><span>  </span><a href="GridSelect.Extras.html#gridselectWorkspace%27"><span class="hs-identifier hs-var">gridselectWorkspace'</span></a><span> </span><a href="#local-6989586621679039751"><span class="hs-identifier hs-var">conf</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">windows</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><a href="#local-6989586621679039752"><span class="hs-identifier hs-var">viewFunc</span></a><span class="hs-special">)</span><span>
</span><a name="line-767"></a><span>
</span><a name="line-768"></a><span class="hs-comment">-- | Select a workspace and run an arbitrary action on it.</span><span>
</span><a name="line-769"></a><span class="hs-identifier">gridselectWorkspace'</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-identifier hs-type">WorkspaceId</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">WorkspaceId</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-770"></a><a name="gridselectWorkspace%27"><a href="GridSelect.Extras.html#gridselectWorkspace%27"><span class="hs-identifier">gridselectWorkspace'</span></a></a><span> </span><a name="local-6989586621679039753"><a href="#local-6989586621679039753"><span class="hs-identifier">conf</span></a></a><span> </span><a name="local-6989586621679039754"><a href="#local-6989586621679039754"><span class="hs-identifier">func</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">withWindowSet</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679039755"><a href="#local-6989586621679039755"><span class="hs-identifier">ws</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-771"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679039756"><a href="#local-6989586621679039756"><span class="hs-identifier">wss</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-772"></a><span>        </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier">W.tag</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">W.hidden</span><span> </span><a href="#local-6989586621679039755"><span class="hs-identifier hs-var">ws</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier">W.workspace</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">W.current</span><span> </span><a href="#local-6989586621679039755"><span class="hs-identifier hs-var">ws</span></a><span> </span><span class="hs-glyph">:</span><span> </span><span class="hs-identifier">W.visible</span><span> </span><a href="#local-6989586621679039755"><span class="hs-identifier hs-var">ws</span></a><span class="hs-special">)</span><span>
</span><a name="line-773"></a><span>  </span><a href="GridSelect.Extras.html#gridselect"><span class="hs-identifier hs-var">gridselect</span></a><span> </span><a href="#local-6989586621679039753"><span class="hs-identifier hs-var">conf</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">zip</span><span> </span><a href="#local-6989586621679039756"><span class="hs-identifier hs-var">wss</span></a><span> </span><a href="#local-6989586621679039756"><span class="hs-identifier hs-var">wss</span></a><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">&gt;&gt;=</span><span> </span><span class="hs-identifier hs-var">flip</span><span> </span><span class="hs-identifier hs-var">whenJust</span><span> </span><a href="#local-6989586621679039754"><span class="hs-identifier hs-var">func</span></a><span>
</span><a name="line-774"></a><span>
</span><a name="line-775"></a><span class="hs-comment">-- $rearrangers</span><span>
</span><a name="line-776"></a><span class="hs-comment">--</span><span>
</span><a name="line-777"></a><span class="hs-comment">-- Rearrangers allow for arbitrary post-filter rearranging of the grid</span><span>
</span><a name="line-778"></a><span class="hs-comment">-- elements.</span><span>
</span><a name="line-779"></a><span class="hs-comment">--</span><span>
</span><a name="line-780"></a><span class="hs-comment">-- For example, to be able to switch to a new dynamic workspace by typing</span><span>
</span><a name="line-781"></a><span class="hs-comment">-- in its name, you can use the following keybinding action:</span><span>
</span><a name="line-782"></a><span class="hs-comment">--</span><span>
</span><a name="line-783"></a><span class="hs-comment">-- &gt; import XMonad.Actions.DynamicWorkspaces (addWorkspace)</span><span>
</span><a name="line-784"></a><span class="hs-comment">-- &gt;</span><span>
</span><a name="line-785"></a><span class="hs-comment">-- &gt; gridselectWorkspace' defaultGSConfig</span><span>
</span><a name="line-786"></a><span class="hs-comment">-- &gt;                          { gs_navigate   = navNSearch</span><span>
</span><a name="line-787"></a><span class="hs-comment">-- &gt;                          , gs_rearranger = searchStringRearrangerGenerator id</span><span>
</span><a name="line-788"></a><span class="hs-comment">-- &gt;                          }</span><span>
</span><a name="line-789"></a><span class="hs-comment">-- &gt;                      addWorkspace</span><span>
</span><a name="line-790"></a><span>
</span><a name="line-791"></a><span class="hs-comment">-- | A function taking the search string and a list of elements, and</span><span>
</span><a name="line-792"></a><span class="hs-comment">-- returning a potentially rearranged list of elements.</span><span>
</span><a name="line-793"></a><span class="hs-keyword">type</span><span> </span><a name="Rearranger"><a href="GridSelect.Extras.html#Rearranger"><span class="hs-identifier">Rearranger</span></a></a><span> </span><a name="local-6989586621679021758"><a href="#local-6989586621679021758"><span class="hs-identifier">a</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679021758"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679021758"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-794"></a><span>
</span><a name="line-795"></a><span class="hs-comment">-- | A rearranger that leaves the elements unmodified.</span><span>
</span><a name="line-796"></a><span class="hs-identifier">noRearranger</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#Rearranger"><span class="hs-identifier hs-type">Rearranger</span></a><span> </span><a href="#local-6989586621679026445"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-797"></a><a name="noRearranger"><a href="GridSelect.Extras.html#noRearranger"><span class="hs-identifier">noRearranger</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span>
</span><a name="line-798"></a><span>
</span><a name="line-799"></a><span class="hs-comment">-- | A generator for rearrangers that append a single element based on the</span><span>
</span><a name="line-800"></a><span class="hs-comment">-- search string, if doing so would not be redundant (empty string or value</span><span>
</span><a name="line-801"></a><span class="hs-comment">-- already present).</span><span>
</span><a name="line-802"></a><span class="hs-identifier">searchStringRearrangerGenerator</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679026444"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#Rearranger"><span class="hs-identifier hs-type">Rearranger</span></a><span> </span><a href="#local-6989586621679026444"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-803"></a><a name="searchStringRearrangerGenerator"><a href="GridSelect.Extras.html#searchStringRearrangerGenerator"><span class="hs-identifier">searchStringRearrangerGenerator</span></a></a><span> </span><a name="local-6989586621679039757"><a href="#local-6989586621679039757"><span class="hs-identifier">f</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-804"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679039758"><a href="#local-6989586621679039758"><span class="hs-identifier">r</span></a></a><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><a name="local-6989586621679039759"><a href="#local-6989586621679039759"><span class="hs-identifier">xs</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><a href="#local-6989586621679039759"><span class="hs-identifier hs-var">xs</span></a><span>
</span><a name="line-805"></a><span>      </span><span class="hs-identifier">r</span><span> </span><a name="local-6989586621679039760"><a href="#local-6989586621679039760"><span class="hs-identifier">s</span></a></a><span> </span><a name="local-6989586621679039761"><a href="#local-6989586621679039761"><span class="hs-identifier">xs</span></a></a><span> </span><span class="hs-glyph">|</span><span> </span><a href="#local-6989586621679039760"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">elem</span><span class="hs-special">`</span><span> </span><span class="hs-identifier hs-var">map</span><span> </span><span class="hs-identifier hs-var">fst</span><span> </span><a href="#local-6989586621679039761"><span class="hs-identifier hs-var">xs</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><a href="#local-6989586621679039761"><span class="hs-identifier hs-var">xs</span></a><span>
</span><a name="line-806"></a><span>             </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span>           </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679039761"><span class="hs-identifier hs-var">xs</span></a><span> </span><span class="hs-operator hs-var">++</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><a href="#local-6989586621679039760"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">,</span><span> </span><a href="#local-6989586621679039757"><span class="hs-identifier hs-var">f</span></a><span> </span><a href="#local-6989586621679039760"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span>
</span><a name="line-807"></a><span>  </span><span class="hs-keyword">in</span><span>  </span><a href="#local-6989586621679039758"><span class="hs-identifier hs-var">r</span></a><span>
</span><a name="line-808"></a><span>
</span><a name="line-809"></a><span>
</span><a name="line-810"></a><span>
</span><a name="line-811"></a><span class="hs-comment">----------------------------------------------------------------------------------------------</span><span>
</span><a name="line-812"></a><span class="hs-comment">--                                        custom part                                       --</span><span>
</span><a name="line-813"></a><span class="hs-comment">----------------------------------------------------------------------------------------------</span><span>
</span><a name="line-814"></a><span>
</span><a name="line-815"></a><span>
</span><a name="line-816"></a><span class="hs-comment">-- | A custom colorizer that colors depending on the title of the grid column</span><span>
</span><a name="line-817"></a><span class="hs-identifier">myCustomColorizer</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679026443"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span>
</span><a name="line-818"></a><a name="myCustomColorizer"><a href="GridSelect.Extras.html#myCustomColorizer"><span class="hs-identifier">myCustomColorizer</span></a></a><span> </span><a name="local-6989586621679039762"><a href="#local-6989586621679039762"><span class="hs-identifier">text</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><a name="local-6989586621679039763"><a href="#local-6989586621679039763"><span class="hs-identifier">p</span></a></a><span>
</span><a name="line-819"></a><span>  </span><span class="hs-glyph">|</span><span> </span><a href="#local-6989586621679039763"><span class="hs-identifier hs-var">p</span></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">pure</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#f44336&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;#1a1a1a&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-820"></a><span>  </span><span class="hs-glyph">|</span><span> </span><span class="hs-identifier hs-var">otherwise</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">if</span><span> </span><span class="hs-string">&quot;MIT&quot;</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">isInfixOf</span><span class="hs-special">`</span><span> </span><a href="#local-6989586621679039762"><span class="hs-identifier hs-var">text</span></a><span>
</span><a name="line-821"></a><span>    </span><span class="hs-keyword">then</span><span> </span><span class="hs-identifier hs-var">pure</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#4caf50&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;#1a1a1a&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-822"></a><span>    </span><span class="hs-keyword">else</span><span> </span><span class="hs-keyword">if</span><span> </span><span class="hs-string">&quot;BIG&quot;</span><span> </span><span class="hs-special">`</span><span class="hs-identifier hs-var">isInfixOf</span><span class="hs-special">`</span><span> </span><a href="#local-6989586621679039762"><span class="hs-identifier hs-var">text</span></a><span>
</span><a name="line-823"></a><span>      </span><span class="hs-keyword">then</span><span> </span><span class="hs-identifier hs-var">pure</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#2196f3&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;#1a1a1a&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-824"></a><span>      </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">pure</span><span> </span><span class="hs-special">(</span><span class="hs-string">&quot;#1a1a1a&quot;</span><span class="hs-special">,</span><span> </span><span class="hs-string">&quot;gray&quot;</span><span class="hs-special">)</span><span>
</span><a name="line-825"></a><span>
</span><a name="line-826"></a><span>
</span><a name="line-827"></a><span class="hs-comment">-- | Select an action and run it in the X monad. Furthermore display a message on top of the screen.</span><span>
</span><a name="line-828"></a><span class="hs-identifier">runSelectedActionWithMessageAndIcon</span><span>
</span><a name="line-829"></a><span>  </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">[</span><span class="hs-identifier hs-type">Bool</span><span class="hs-special">]</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-830"></a><a name="runSelectedActionWithMessageAndIcon"><a href="GridSelect.Extras.html#runSelectedActionWithMessageAndIcon"><span class="hs-identifier">runSelectedActionWithMessageAndIcon</span></a></a><span> </span><a name="local-6989586621679039764"><a href="#local-6989586621679039764"><span class="hs-identifier">conf</span></a></a><span> </span><a name="local-6989586621679039765"><a href="#local-6989586621679039765"><span class="hs-identifier">message</span></a></a><span> </span><a name="local-6989586621679039766"><a href="#local-6989586621679039766"><span class="hs-identifier">icon</span></a></a><span> </span><a name="local-6989586621679039767"><a href="#local-6989586621679039767"><span class="hs-identifier">actions</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-831"></a><span>  </span><a name="local-6989586621679039768"><a href="#local-6989586621679039768"><span class="hs-identifier">selectedActionM</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#gridselectWithMessageAndIcon"><span class="hs-identifier hs-var">gridselectWithMessageAndIcon</span></a><span> </span><a href="#local-6989586621679039764"><span class="hs-identifier hs-var">conf</span></a><span> </span><a href="#local-6989586621679039765"><span class="hs-identifier hs-var">message</span></a><span> </span><a href="#local-6989586621679039766"><span class="hs-identifier hs-var">icon</span></a><span> </span><a href="#local-6989586621679039767"><span class="hs-identifier hs-var">actions</span></a><span>
</span><a name="line-832"></a><span>  </span><span class="hs-identifier hs-var">fromMaybe</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><a href="#local-6989586621679039768"><span class="hs-identifier hs-var">selectedActionM</span></a><span>
</span><a name="line-833"></a><span class="hs-comment">--    case selectedActionM of</span><span>
</span><a name="line-834"></a><span class="hs-comment">--        Just selectedAction -&gt; selectedAction</span><span>
</span><a name="line-835"></a><span class="hs-comment">--        Nothing -&gt; return ()</span><span>
</span><a name="line-836"></a><span>
</span><a name="line-837"></a><span>
</span><a name="line-838"></a><span class="hs-comment">-- | Brings up a 2D grid of elements in the center of the screen, and one can</span><span>
</span><a name="line-839"></a><span class="hs-comment">-- select an element with cursors keys. The selected element is returned.</span><span>
</span><a name="line-840"></a><span class="hs-identifier">gridselectWithMessageAndIcon</span><span>
</span><a name="line-841"></a><span>  </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#GSConfig"><span class="hs-identifier hs-type">GSConfig</span></a><span> </span><a href="#local-6989586621679026442"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">[</span><span class="hs-identifier hs-type">Bool</span><span class="hs-special">]</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-special">[</span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><a href="#local-6989586621679026442"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">Maybe</span><span> </span><a href="#local-6989586621679026442"><span class="hs-identifier hs-type">a</span></a><span class="hs-special">)</span><span>
</span><a name="line-842"></a><a name="gridselectWithMessageAndIcon"><a href="GridSelect.Extras.html#gridselectWithMessageAndIcon"><span class="hs-identifier">gridselectWithMessageAndIcon</span></a></a><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-identifier">_</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-843"></a><span class="hs-identifier">gridselectWithMessageAndIcon</span><span> </span><a name="local-6989586621679039769"><a href="#local-6989586621679039769"><span class="hs-identifier">gsconfig</span></a></a><span> </span><a name="local-6989586621679039770"><a href="#local-6989586621679039770"><span class="hs-identifier">message</span></a></a><span> </span><a name="local-6989586621679039771"><a href="#local-6989586621679039771"><span class="hs-identifier">icon</span></a></a><span> </span><a name="local-6989586621679039772"><a href="#local-6989586621679039772"><span class="hs-identifier">elements</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-844"></a><span>  </span><span class="hs-identifier hs-var">withDisplay</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-glyph">\</span><a name="local-6989586621679039773"><a href="#local-6989586621679039773"><span class="hs-identifier">dpy</span></a></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-845"></a><span>    </span><a name="local-6989586621679039774"><a href="#local-6989586621679039774"><span class="hs-identifier">rootw</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">asks</span><span> </span><span class="hs-identifier">theRoot</span><span>
</span><a name="line-846"></a><span>    </span><a name="local-6989586621679039775"><a href="#local-6989586621679039775"><span class="hs-identifier">scr</span></a></a><span>   </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">gets</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">screenRect</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">W.screenDetail</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">W.current</span><span> </span><span class="hs-operator hs-var">.</span><span> </span><span class="hs-identifier">windowset</span><span>
</span><a name="line-847"></a><span>    </span><a name="local-6989586621679039776"><a href="#local-6989586621679039776"><span class="hs-identifier">win</span></a></a><span>   </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">mkUnmanagedWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-848"></a><span>                                        </span><span class="hs-special">(</span><span class="hs-identifier hs-var">defaultScreenOfDisplay</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span class="hs-special">)</span><span>
</span><a name="line-849"></a><span>                                        </span><a href="#local-6989586621679039774"><span class="hs-identifier hs-var">rootw</span></a><span>
</span><a name="line-850"></a><span>                                        </span><span class="hs-special">(</span><span class="hs-identifier">rect_x</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-851"></a><span>                                        </span><span class="hs-special">(</span><span class="hs-identifier">rect_y</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-852"></a><span>                                        </span><span class="hs-special">(</span><span class="hs-identifier">rect_width</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-853"></a><span>                                        </span><span class="hs-special">(</span><span class="hs-identifier">rect_height</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span class="hs-special">)</span><span>
</span><a name="line-854"></a><span>    </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">mapWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-855"></a><span>
</span><a name="line-856"></a><span>    </span><a name="local-6989586621679039777"><a href="#local-6989586621679039777"><span class="hs-identifier">message_win</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">createNewWindow</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-var">Rectangle</span><span> </span><span class="hs-number">450</span><span> </span><span class="hs-number">50</span><span> </span><span class="hs-number">1000</span><span> </span><span class="hs-number">60</span><span class="hs-special">)</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span> </span><span class="hs-string">&quot;&quot;</span><span> </span><span class="hs-identifier hs-var">True</span><span>
</span><a name="line-857"></a><span>    </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">mapWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039777"><span class="hs-identifier hs-var">message_win</span></a><span>
</span><a name="line-858"></a><span>    </span><a name="local-6989586621679039778"><a href="#local-6989586621679039778"><span class="hs-identifier">fs</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initXMF</span><span> </span><span class="hs-string">&quot;xft:Inconsolata:size=14&quot;</span><span>
</span><a name="line-859"></a><span>    </span><span class="hs-identifier hs-var">paintTextAndIcons</span><span> </span><a href="#local-6989586621679039777"><span class="hs-identifier hs-var">message_win</span></a><span>
</span><a name="line-860"></a><span>                      </span><a href="#local-6989586621679039778"><span class="hs-identifier hs-var">fs</span></a><span>
</span><a name="line-861"></a><span>                      </span><span class="hs-number">1000</span><span>
</span><a name="line-862"></a><span>                      </span><span class="hs-number">60</span><span>
</span><a name="line-863"></a><span>                      </span><span class="hs-number">1</span><span>
</span><a name="line-864"></a><span>                      </span><span class="hs-string">&quot;#1a1a1a&quot;</span><span>
</span><a name="line-865"></a><span>                      </span><span class="hs-string">&quot;gray&quot;</span><span>
</span><a name="line-866"></a><span>                      </span><span class="hs-string">&quot;gray&quot;</span><span>
</span><a name="line-867"></a><span>                      </span><span class="hs-string">&quot;#1a1a1a&quot;</span><span>
</span><a name="line-868"></a><span>                      </span><span class="hs-special">[</span><span class="hs-identifier hs-var">AlignCenter</span><span class="hs-special">]</span><span>
</span><a name="line-869"></a><span>                      </span><span class="hs-special">[</span><a href="#local-6989586621679039770"><span class="hs-identifier hs-var">message</span></a><span class="hs-special">]</span><span>
</span><a name="line-870"></a><span>                      </span><span class="hs-special">[</span><span class="hs-identifier hs-var">CenterLeft</span><span> </span><span class="hs-number">10</span><span class="hs-special">]</span><span>
</span><a name="line-871"></a><span>                      </span><span class="hs-special">[</span><a href="#local-6989586621679039771"><span class="hs-identifier hs-var">icon</span></a><span class="hs-special">]</span><span>
</span><a name="line-872"></a><span>
</span><a name="line-873"></a><span>    </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">selectInput</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-874"></a><span>                         </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-875"></a><span>                         </span><span class="hs-special">(</span><span class="hs-identifier hs-var">exposureMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">keyPressMask</span><span> </span><span class="hs-operator hs-var">.|.</span><span> </span><span class="hs-identifier hs-var">buttonReleaseMask</span><span class="hs-special">)</span><span>
</span><a name="line-876"></a><span>    </span><a name="local-6989586621679039779"><a href="#local-6989586621679039779"><span class="hs-identifier">status</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">io</span><span>
</span><a name="line-877"></a><span>      </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">grabKeyboard</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span> </span><span class="hs-identifier hs-var">True</span><span> </span><span class="hs-identifier hs-var">grabModeAsync</span><span> </span><span class="hs-identifier hs-var">grabModeAsync</span><span> </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-878"></a><span>    </span><span class="hs-identifier hs-var">io</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier hs-var">grabPointer</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span>
</span><a name="line-879"></a><span>                     </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-880"></a><span>                     </span><span class="hs-identifier hs-var">True</span><span>
</span><a name="line-881"></a><span>                     </span><span class="hs-identifier hs-var">buttonReleaseMask</span><span>
</span><a name="line-882"></a><span>                     </span><span class="hs-identifier hs-var">grabModeAsync</span><span>
</span><a name="line-883"></a><span>                     </span><span class="hs-identifier hs-var">grabModeAsync</span><span>
</span><a name="line-884"></a><span>                     </span><span class="hs-identifier hs-var">none</span><span>
</span><a name="line-885"></a><span>                     </span><span class="hs-identifier hs-var">none</span><span>
</span><a name="line-886"></a><span>                     </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-887"></a><span>    </span><a name="local-6989586621679039780"><a href="#local-6989586621679039780"><span class="hs-identifier">font</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">initXMF</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_font</span><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-888"></a><span>    </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679039781"><a href="#local-6989586621679039781"><span class="hs-identifier">screenWidth</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">toInteger</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">rect_width</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span>
</span><a name="line-889"></a><span>        </span><a name="local-6989586621679039782"><a href="#local-6989586621679039782"><span class="hs-identifier">screenHeight</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">toInteger</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-identifier">rect_height</span><span> </span><a href="#local-6989586621679039775"><span class="hs-identifier hs-var">scr</span></a><span>
</span><a name="line-890"></a><span>    </span><a name="local-6989586621679039793"><a href="#local-6989586621679039793"><span class="hs-identifier">selectedElement</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-keyword">if</span><span> </span><a href="#local-6989586621679039779"><span class="hs-identifier hs-var">status</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><span class="hs-identifier hs-var">grabSuccess</span><span>
</span><a name="line-891"></a><span>      </span><span class="hs-keyword">then</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-892"></a><span>        </span><span class="hs-keyword">let</span><span>
</span><a name="line-893"></a><span>          </span><a name="local-6989586621679039783"><a href="#local-6989586621679039783"><span class="hs-identifier">restriction</span></a></a><span> </span><a name="local-6989586621679039790"><a href="#local-6989586621679039790"><span class="hs-identifier">ss</span></a></a><span> </span><a name="local-6989586621679039791"><a href="#local-6989586621679039791"><span class="hs-identifier">cs</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-894"></a><span>            </span><span class="hs-special">(</span><span class="hs-identifier hs-var">fromInteger</span><span> </span><a href="#local-6989586621679039790"><span class="hs-identifier hs-var">ss</span></a><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-identifier hs-var">fromInteger</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679039791"><span class="hs-identifier hs-var">cs</span></a><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-number">1</span><span class="hs-special">)</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span> </span><span class="hs-glyph">::</span><span> </span><span class="hs-identifier hs-type">Double</span><span>
</span><a name="line-895"></a><span>          </span><a name="local-6989586621679039784"><a href="#local-6989586621679039784"><span class="hs-identifier">restrictX</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">floor</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679039783"><span class="hs-identifier hs-var">restriction</span></a><span> </span><a href="#local-6989586621679039781"><span class="hs-identifier hs-var">screenWidth</span></a><span> </span><span class="hs-identifier">gs_cellwidth</span><span>
</span><a name="line-896"></a><span>          </span><a name="local-6989586621679039785"><a href="#local-6989586621679039785"><span class="hs-identifier">restrictY</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">floor</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><a href="#local-6989586621679039783"><span class="hs-identifier hs-var">restriction</span></a><span> </span><a href="#local-6989586621679039782"><span class="hs-identifier hs-var">screenHeight</span></a><span> </span><span class="hs-identifier">gs_cellheight</span><span>
</span><a name="line-897"></a><span>          </span><a name="local-6989586621679039786"><a href="#local-6989586621679039786"><span class="hs-identifier">originPosX</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-898"></a><span>            </span><span class="hs-identifier hs-var">floor</span><span>
</span><a name="line-899"></a><span>              </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_originFractX</span><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-900"></a><span>              </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-901"></a><span>              </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><a href="#local-6989586621679039784"><span class="hs-identifier hs-var">restrictX</span></a><span>
</span><a name="line-902"></a><span>          </span><a name="local-6989586621679039787"><a href="#local-6989586621679039787"><span class="hs-identifier">originPosY</span></a></a><span> </span><span class="hs-glyph">=</span><span>
</span><a name="line-903"></a><span>            </span><span class="hs-identifier hs-var">floor</span><span>
</span><a name="line-904"></a><span>              </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-special">(</span><span class="hs-identifier">gs_originFractY</span><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span> </span><span class="hs-glyph">-</span><span> </span><span class="hs-special">(</span><span class="hs-number">1</span><span> </span><span class="hs-operator hs-var">/</span><span> </span><span class="hs-number">2</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-905"></a><span>              </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-906"></a><span>              </span><span class="hs-operator hs-var">*</span><span> </span><span class="hs-identifier hs-var">fromIntegral</span><span> </span><a href="#local-6989586621679039785"><span class="hs-identifier hs-var">restrictY</span></a><span>
</span><a name="line-907"></a><span>          </span><a name="local-6989586621679039788"><a href="#local-6989586621679039788"><span class="hs-identifier">coords</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#diamondRestrict"><span class="hs-identifier hs-var">diamondRestrict</span></a><span> </span><a href="#local-6989586621679039784"><span class="hs-identifier hs-var">restrictX</span></a><span> </span><a href="#local-6989586621679039785"><span class="hs-identifier hs-var">restrictY</span></a><span> </span><a href="#local-6989586621679039786"><span class="hs-identifier hs-var">originPosX</span></a><span> </span><a href="#local-6989586621679039787"><span class="hs-identifier hs-var">originPosY</span></a><span>
</span><a name="line-908"></a><span>          </span><a name="local-6989586621679039789"><a href="#local-6989586621679039789"><span class="hs-identifier">s</span></a></a><span>      </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span>
</span><a name="line-909"></a><span>            </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_curpos</span><span>       </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">head</span><span> </span><a href="#local-6989586621679039788"><span class="hs-identifier hs-var">coords</span></a><span>
</span><a name="line-910"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_availSlots</span><span>   </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039788"><span class="hs-identifier hs-var">coords</span></a><span>
</span><a name="line-911"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_elements</span><span>     </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039772"><span class="hs-identifier hs-var">elements</span></a><span>
</span><a name="line-912"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span>     </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-913"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_font</span><span>         </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039780"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-914"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneX</span><span>        </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039781"><span class="hs-identifier hs-var">screenWidth</span></a><span>
</span><a name="line-915"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneY</span><span>        </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039782"><span class="hs-identifier hs-var">screenHeight</span></a><span>
</span><a name="line-916"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_drawingWin</span><span>   </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-917"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_searchString</span><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-string">&quot;&quot;</span><span>
</span><a name="line-918"></a><span>            </span><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_elementmap</span><span>   </span><span class="hs-glyph">=</span><span> </span><span class="hs-special">[</span><span class="hs-special">]</span><span>
</span><a name="line-919"></a><span>            </span><span class="hs-special">}</span><span>
</span><a name="line-920"></a><span>        </span><a name="local-6989586621679039792"><a href="#local-6989586621679039792"><span class="hs-identifier">m</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="GridSelect.Extras.html#generateElementmap"><span class="hs-identifier hs-var">generateElementmap</span></a><span> </span><a href="#local-6989586621679039789"><span class="hs-identifier hs-var">s</span></a><span>
</span><a name="line-921"></a><span>        </span><a href="GridSelect.Extras.html#evalTwoD"><span class="hs-identifier hs-var">evalTwoD</span></a><span> </span><span class="hs-special">(</span><a href="GridSelect.Extras.html#updateAllElements2"><span class="hs-identifier hs-var">updateAllElements2</span></a><span> </span><span class="hs-operator hs-var">&gt;&gt;</span><span> </span><span class="hs-identifier">gs_navigate</span><span> </span><a href="#local-6989586621679039769"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-922"></a><span>                 </span><span class="hs-special">(</span><a href="#local-6989586621679039789"><span class="hs-identifier hs-var">s</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_elementmap</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="#local-6989586621679039792"><span class="hs-identifier hs-var">m</span></a><span> </span><span class="hs-special">}</span><span class="hs-special">)</span><span>
</span><a name="line-923"></a><span>      </span><span class="hs-keyword">else</span><span> </span><span class="hs-identifier hs-var">return</span><span> </span><span class="hs-identifier hs-var">Nothing</span><span>
</span><a name="line-924"></a><span>    </span><span class="hs-identifier hs-var">liftIO</span><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-925"></a><span class="hs-comment">--      unmapWindow dpy message_win</span><span>
</span><a name="line-926"></a><span>      </span><span class="hs-identifier hs-var">destroyWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039777"><span class="hs-identifier hs-var">message_win</span></a><span>
</span><a name="line-927"></a><span>
</span><a name="line-928"></a><span>      </span><span class="hs-identifier hs-var">unmapWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-929"></a><span>      </span><span class="hs-identifier hs-var">destroyWindow</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><a href="#local-6989586621679039776"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-930"></a><span>      </span><span class="hs-identifier hs-var">ungrabPointer</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><span class="hs-identifier hs-var">currentTime</span><span>
</span><a name="line-931"></a><span>      </span><span class="hs-identifier hs-var">sync</span><span> </span><a href="#local-6989586621679039773"><span class="hs-identifier hs-var">dpy</span></a><span> </span><span class="hs-identifier hs-var">False</span><span>
</span><a name="line-932"></a><span>    </span><span class="hs-identifier hs-var">releaseXMF</span><span> </span><a href="#local-6989586621679039780"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-933"></a><span>    </span><span class="hs-identifier hs-var">return</span><span> </span><a href="#local-6989586621679039793"><span class="hs-identifier hs-var">selectedElement</span></a><span>
</span><a name="line-934"></a><span>
</span><a name="line-935"></a><span>
</span><a name="line-936"></a><span class="hs-identifier">updateAllElements2</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679026441"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-937"></a><a name="updateAllElements2"><a href="GridSelect.Extras.html#updateAllElements2"><span class="hs-identifier">updateAllElements2</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-938"></a><span>  </span><a name="local-6989586621679039794"><a href="#local-6989586621679039794"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-939"></a><span>  </span><a href="GridSelect.Extras.html#updateElements2"><span class="hs-identifier hs-var">updateElements2</span></a><span> </span><span class="hs-special">(</span><span class="hs-identifier">td_elementmap</span><span> </span><a href="#local-6989586621679039794"><span class="hs-identifier hs-var">s</span></a><span class="hs-special">)</span><span>
</span><a name="line-940"></a><span>
</span><a name="line-941"></a><span>
</span><a name="line-942"></a><span class="hs-identifier">updateElements2</span><span> </span><span class="hs-glyph">::</span><span> </span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679026440"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679026440"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-943"></a><a name="updateElements2"><a href="GridSelect.Extras.html#updateElements2"><span class="hs-identifier">updateElements2</span></a></a><span> </span><a name="local-6989586621679039795"><a href="#local-6989586621679039795"><span class="hs-identifier">elementmap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-944"></a><span>  </span><a name="local-6989586621679039796"><a href="#local-6989586621679039796"><span class="hs-identifier">s</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-945"></a><span>  </span><a href="GridSelect.Extras.html#updateElementsWithColorizer2"><span class="hs-identifier hs-var">updateElementsWithColorizer2</span></a><span> </span><a href="GridSelect.Extras.html#myCustomColorizer"><span class="hs-identifier hs-var">myCustomColorizer</span></a><span> </span><a href="#local-6989586621679039795"><span class="hs-identifier hs-var">elementmap</span></a><span>
</span><a name="line-946"></a><span>
</span><a name="line-947"></a><span>
</span><a name="line-948"></a><span class="hs-identifier">updateElementsWithColorizer2</span><span>
</span><a name="line-949"></a><span>  </span><span class="hs-glyph">::</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><a href="#local-6989586621679026439"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">Bool</span><span> </span><span class="hs-glyph">-&gt;</span><span> </span><span class="hs-identifier hs-type">X</span><span> </span><span class="hs-special">(</span><span class="hs-identifier hs-type">String</span><span class="hs-special">,</span><span> </span><span class="hs-identifier hs-type">String</span><span class="hs-special">)</span><span class="hs-special">)</span><span>
</span><a name="line-950"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoDElementMap"><span class="hs-identifier hs-type">TwoDElementMap</span></a><span> </span><a href="#local-6989586621679026439"><span class="hs-identifier hs-type">a</span></a><span>
</span><a name="line-951"></a><span>  </span><span class="hs-glyph">-&gt;</span><span> </span><a href="GridSelect.Extras.html#TwoD"><span class="hs-identifier hs-type">TwoD</span></a><span> </span><a href="#local-6989586621679026439"><span class="hs-identifier hs-type">a</span></a><span> </span><span class="hs-special">(</span><span class="hs-special">)</span><span>
</span><a name="line-952"></a><a name="updateElementsWithColorizer2"><a href="GridSelect.Extras.html#updateElementsWithColorizer2"><span class="hs-identifier">updateElementsWithColorizer2</span></a></a><span> </span><a name="local-6989586621679039797"><a href="#local-6989586621679039797"><span class="hs-identifier">colorizer</span></a></a><span> </span><a name="local-6989586621679039798"><a href="#local-6989586621679039798"><span class="hs-identifier">elementmap</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-953"></a><span>  </span><a href="GridSelect.Extras.html#TwoDState"><span class="hs-identifier hs-var">TwoDState</span></a><span> </span><span class="hs-special">{</span><span> </span><span class="hs-identifier">td_curpos</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039799"><a href="#local-6989586621679039799"><span class="hs-identifier">curpos</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_drawingWin</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039800"><a href="#local-6989586621679039800"><span class="hs-identifier">win</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_gsconfig</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039801"><a href="#local-6989586621679039801"><span class="hs-identifier">gsconfig</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_font</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039802"><a href="#local-6989586621679039802"><span class="hs-identifier">font</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneX</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039803"><a href="#local-6989586621679039803"><span class="hs-identifier">paneX</span></a></a><span class="hs-special">,</span><span> </span><span class="hs-identifier">td_paneY</span><span> </span><span class="hs-glyph">=</span><span> </span><a name="local-6989586621679039804"><a href="#local-6989586621679039804"><span class="hs-identifier">paneY</span></a></a><span> </span><span class="hs-special">}</span><span> </span><span class="hs-glyph">&lt;-</span><span>
</span><a name="line-954"></a><span>    </span><span class="hs-identifier hs-var">get</span><span>
</span><a name="line-955"></a><span>  </span><span class="hs-keyword">let</span><span> </span><a name="local-6989586621679039805"><a href="#local-6989586621679039805"><span class="hs-identifier">cellwidth</span></a></a><span>  </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">gs_cellwidth</span><span> </span><a href="#local-6989586621679039801"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-956"></a><span>      </span><a name="local-6989586621679039806"><a href="#local-6989586621679039806"><span class="hs-identifier">cellheight</span></a></a><span> </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier">gs_cellheight</span><span> </span><a href="#local-6989586621679039801"><span class="hs-identifier hs-var">gsconfig</span></a><span>
</span><a name="line-957"></a><span>      </span><a name="local-6989586621679039807"><a href="#local-6989586621679039807"><span class="hs-identifier">paneX'</span></a></a><span>     </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">div</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679039803"><span class="hs-identifier hs-var">paneX</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679039805"><span class="hs-identifier hs-var">cellwidth</span></a><span class="hs-special">)</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-958"></a><span>      </span><a name="local-6989586621679039808"><a href="#local-6989586621679039808"><span class="hs-identifier">paneY'</span></a></a><span>     </span><span class="hs-glyph">=</span><span> </span><span class="hs-identifier hs-var">div</span><span> </span><span class="hs-special">(</span><a href="#local-6989586621679039804"><span class="hs-identifier hs-var">paneY</span></a><span> </span><span class="hs-glyph">-</span><span> </span><a href="#local-6989586621679039806"><span class="hs-identifier hs-var">cellheight</span></a><span class="hs-special">)</span><span> </span><span class="hs-number">2</span><span>
</span><a name="line-959"></a><span>      </span><a name="local-6989586621679039809"><a href="#local-6989586621679039809"><span class="hs-identifier">updateElement</span></a></a><span> </span><span class="hs-special">(</span><a name="local-6989586621679039810"><a href="#local-6989586621679039810"><span class="hs-identifier">pos</span></a></a><span class="hs-glyph">@</span><span class="hs-special">(</span><a name="local-6989586621679039811"><a href="#local-6989586621679039811"><span class="hs-identifier">x</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679039812"><a href="#local-6989586621679039812"><span class="hs-identifier">y</span></a></a><span class="hs-special">)</span><span class="hs-special">,</span><span> </span><span class="hs-special">(</span><a name="local-6989586621679039813"><a href="#local-6989586621679039813"><span class="hs-identifier">text</span></a></a><span class="hs-special">,</span><span> </span><a name="local-6989586621679039814"><a href="#local-6989586621679039814"><span class="hs-identifier">element</span></a></a><span class="hs-special">)</span><span class="hs-special">)</span><span> </span><span class="hs-glyph">=</span><span> </span><a href="GridSelect.Extras.html#liftX"><span class="hs-identifier hs-var">liftX</span></a><span> </span><span class="hs-operator hs-var">$</span><span> </span><span class="hs-keyword">do</span><span>
</span><a name="line-960"></a><span class="hs-comment">--            colors &lt;- colorizer element (pos == curpos)</span><span>
</span><a name="line-961"></a><span>        </span><a name="local-6989586621679039815"><a href="#local-6989586621679039815"><span class="hs-identifier">colors</span></a></a><span> </span><span class="hs-glyph">&lt;-</span><span> </span><a href="#local-6989586621679039797"><span class="hs-identifier hs-var">colorizer</span></a><span> </span><a href="#local-6989586621679039813"><span class="hs-identifier hs-var">text</span></a><span> </span><a href="#local-6989586621679039814"><span class="hs-identifier hs-var">element</span></a><span> </span><span class="hs-special">(</span><a href="#local-6989586621679039810"><span class="hs-identifier hs-var">pos</span></a><span> </span><span class="hs-operator hs-var">==</span><span> </span><a href="#local-6989586621679039799"><span class="hs-identifier hs-var">curpos</span></a><span class="hs-special">)</span><span>
</span><a name="line-962"></a><span>        </span><a href="GridSelect.Extras.html#drawWinBox"><span class="hs-identifier hs-var">drawWinBox</span></a><span> </span><a href="#local-6989586621679039800"><span class="hs-identifier hs-var">win</span></a><span>
</span><a name="line-963"></a><span>                   </span><a href="#local-6989586621679039802"><span class="hs-identifier hs-var">font</span></a><span>
</span><a name="line-964"></a><span>                   </span><a href="#local-6989586621679039815"><span class="hs-identifier hs-var">colors</span></a><span>
</span><a name="line-965"></a><span>                   </span><span class="hs-special">(</span><span class="hs-identifier">gs_bordercolor</span><span> </span><a href="#local-6989586621679039801"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-966"></a><span>                   </span><a href="#local-6989586621679039806"><span class="hs-identifier hs-var">cellheight</span></a><span>
</span><a name="line-967"></a><span>                   </span><a href="#local-6989586621679039805"><span class="hs-identifier hs-var">cellwidth</span></a><span>
</span><a name="line-968"></a><span>                   </span><a href="#local-6989586621679039813"><span class="hs-identifier hs-var">text</span></a><span>
</span><a name="line-969"></a><span>                   </span><span class="hs-special">(</span><a href="#local-6989586621679039807"><span class="hs-identifier hs-var">paneX'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679039811"><span class="hs-identifier hs-var">x</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679039805"><span class="hs-identifier hs-var">cellwidth</span></a><span class="hs-special">)</span><span>
</span><a name="line-970"></a><span>                   </span><span class="hs-special">(</span><a href="#local-6989586621679039808"><span class="hs-identifier hs-var">paneY'</span></a><span> </span><span class="hs-operator hs-var">+</span><span> </span><a href="#local-6989586621679039812"><span class="hs-identifier hs-var">y</span></a><span> </span><span class="hs-operator hs-var">*</span><span> </span><a href="#local-6989586621679039806"><span class="hs-identifier hs-var">cellheight</span></a><span class="hs-special">)</span><span>
</span><a name="line-971"></a><span>                   </span><span class="hs-special">(</span><span class="hs-identifier">gs_cellpadding</span><span> </span><a href="#local-6989586621679039801"><span class="hs-identifier hs-var">gsconfig</span></a><span class="hs-special">)</span><span>
</span><a name="line-972"></a><span>  </span><span class="hs-identifier hs-var">mapM_</span><span> </span><a href="#local-6989586621679039809"><span class="hs-identifier hs-var">updateElement</span></a><span> </span><a href="#local-6989586621679039798"><span class="hs-identifier hs-var">elementmap</span></a><span>
</span><a name="line-973"></a></pre></body></html>