    -----------------------------------------------------------------------------
    -- |
    -- Module      :  XMonad.Prompt.Layout
    -- Description :  A layout-selection prompt.
    -- Copyright   :  (C) 2007 Andrea Rossato, David Roundy
    -- License     :  BSD3
    --
    -- Maintainer  :
    -- Stability   :  unstable
    -- Portability :  unportable
    --
    -- A layout-selection prompt for XMonad
    --
    -----------------------------------------------------------------------------

    module XMonad.Prompt.Layout (
                                 -- * Usage
                                 -- $usage
                                 layoutPrompt
                                ) where

    import XMonad.Prelude ( sort, nub )
    import XMonad hiding ( workspaces )
    import XMonad.Prompt
    import XMonad.Prompt.Workspace ( Wor(..) )
    import XMonad.StackSet ( workspaces, layout )

    -- $usage
    -- You can use this module with the following in your @xmonad.hs@:
    --
    -- > import XMonad.Prompt
    -- > import XMonad.Prompt.Layout
    --
    -- >   , ((modm .|. shiftMask, xK_m     ), layoutPrompt def)
    --
    -- For detailed instruction on editing the key binding see
    -- <https://xmonad.org/TUTORIAL.html#customizing-xmonad the tutorial>.
    --
    -- WARNING: This prompt won't display all possible layouts, because the
    -- code to enable this was rejected from xmonad core.  It only displays
    -- layouts that are actually in use.  Also, you can only select layouts if
    -- you are using NewSelect, rather than the Select defined in xmonad core
    -- (which doesn't have this feature).  So all in all, this module is really
    -- more a proof-of-principle than something you can actually use
    -- productively.

    layoutPrompt :: XPConfig -> X ()
    layoutPrompt :: XPConfig -> X ()
    layoutPrompt XPConfig
    c = do [String]
    ls <- (XState -> [String]) -> X [String]
    forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
    gets ((Workspace String (Layout Window) Window -> String)
    -> [Workspace String (Layout Window) Window] -> [String]
    forall a b. (a -> b) -> [a] -> [b]
    map (Layout Window -> String
    forall (layout :: * -> *) a.
    LayoutClass layout a =>
    layout a -> String
    description (Layout Window -> String)
    -> (Workspace String (Layout Window) Window -> Layout Window)
    -> Workspace String (Layout Window) Window
    -> String
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Workspace String (Layout Window) Window -> Layout Window
    forall i l a. Workspace i l a -> l
    layout) ([Workspace String (Layout Window) Window] -> [String])
    -> (XState -> [Workspace String (Layout Window) Window])
    -> XState
    -> [String]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . StackSet String (Layout Window) Window ScreenId ScreenDetail
    -> [Workspace String (Layout Window) Window]
    forall i l a s sd. StackSet i l a s sd -> [Workspace i l a]
    workspaces (StackSet String (Layout Window) Window ScreenId ScreenDetail
     -> [Workspace String (Layout Window) Window])
    -> (XState
        -> StackSet String (Layout Window) Window ScreenId ScreenDetail)
    -> XState
    -> [Workspace String (Layout Window) Window]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . XState
    -> StackSet String (Layout Window) Window ScreenId ScreenDetail
    windowset)
                        Wor -> XPConfig -> ComplFunction -> (String -> X ()) -> X ()
    forall p.
    XPrompt p =>
    p -> XPConfig -> ComplFunction -> (String -> X ()) -> X ()
    mkXPrompt (String -> Wor
    Wor String
    "") XPConfig
    c (XPConfig -> [String] -> ComplFunction
    mkComplFunFromList' XPConfig
    c ([String] -> ComplFunction) -> [String] -> ComplFunction
    forall a b. (a -> b) -> a -> b
    $ [String] -> [String]
    forall a. Ord a => [a] -> [a]
    sort ([String] -> [String]) -> [String] -> [String]
    forall a b. (a -> b) -> a -> b
    $ [String] -> [String]
    forall a. Eq a => [a] -> [a]
    nub [String]
    ls) (JumpToLayout -> X ()
    forall a. Message a => a -> X ()
    sendMessage (JumpToLayout -> X ())
    -> (String -> JumpToLayout) -> String -> X ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> JumpToLayout
    JumpToLayout)