content: {-# OPTIONS_GHC -fno-warn-missing-signatures #-}
  {-# LANGUAGE MultiParamTypeClasses, Rank2Types #-}
  
  -----------------------------------------------------------------------------
  -- |
  -- Module      :  XMonad.Layout.Groups.Wmii
  -- Copyright   :  Quentin Moser <moserq@gmail.com>
  -- License     :  BSD-style (see LICENSE)
  --
  -- Maintainer  :  orphaned
  -- Stability   :  stable
  -- Portability :  unportable
  --
  -- A wmii-like layout algorithm.
  --
  -----------------------------------------------------------------------------
  
  module XMonad.Layout.Groups.Wmii ( -- * Usage
                                     -- $usage
  
                                     wmii
                                   , zoomGroupIn
                                   , zoomGroupOut
                                   , zoomGroupReset
                                   , toggleGroupFull
                                   , groupToNextLayout
                                   , groupToFullLayout
                                   , groupToTabbedLayout
                                   , groupToVerticalLayout
  
                                     -- * Useful re-exports
                                   , shrinkText
                                   , def
                                   , defaultTheme
                                   , module XMonad.Layout.Groups.Helpers ) where
  
  import XMonad hiding ((|||))
  
  import qualified XMonad.Layout.Groups as G
  import XMonad.Layout.Groups.Examples
  import XMonad.Layout.Groups.Helpers
  
  import XMonad.Layout.Tabbed
  import XMonad.Layout.Named
  import XMonad.Layout.Renamed
  import XMonad.Layout.LayoutCombinators
  import XMonad.Layout.MessageControl
  import XMonad.Layout.Simplest
  
  
  -- $usage
  -- This module provides a layout inspired by the one used by the wmii
  -- (<http://wmii.suckless.org>) window manager.
  -- Windows are arranged into groups in a horizontal row, and each group can lay out
  -- its windows
  --
  --   * by maximizing the focused one
  --
  --   * by tabbing them (wmii uses a stacked layout, but I'm too lazy to write it)
  --
  --   * by arranging them in a column.
  --
  -- As the groups are arranged in a 'ZoomRow', the relative width of each group can be
  -- increased or decreased at will. Groups can also be set to use the whole screen
  -- whenever they have focus.
  --
  -- You can use the contents of this module by adding
  --
  -- > import XMonad.Layout.Groups.Wmii
  --
  -- to the top of your @.\/.xmonad\/xmonad.hs@, and adding 'wmii'
  -- (with a 'Shrinker' and decoration 'Theme' as
  -- parameters) to your layout hook, for example:
  --
  -- > myLayout = wmii shrinkText def
  --
  -- To be able to zoom in and out of groups, change their inner layout, etc.,
  -- create key bindings for the relevant actions:
  --
  -- > ((modMask, xK_f), toggleGroupFull)
  --
  -- and so on.
  --
  -- For more information on how to extend your layout hook and key bindings, see
  -- "XMonad.Doc.Extending".
  --
  -- Finally, you will probably want to be able to move focus and windows
  -- between groups in a consistent fashion. For this, you should take a look
  -- at the "XMonad.Layout.Groups.Helpers" module, whose contents are re-exported
  -- by this module.
  
  -- | A layout inspired by wmii
  wmii s t = G.group innerLayout zoomRowG
      where column = named "Column" $ Tall 0 (3/100) (1/2)
            tabs = named "Tabs" $ Simplest
            innerLayout = renamed [CutWordsLeft 3]
                          $ addTabs s t
                          $ ignore NextLayout
                          $ ignore (JumpToLayout "") $ unEscape
                             $ column ||| tabs ||| Full
  
  -- | Increase the width of the focused group
  zoomGroupIn :: X ()
  zoomGroupIn = zoomColumnIn
  
  -- | Decrease the size of the focused group
  zoomGroupOut :: X ()
  zoomGroupOut = zoomColumnOut
  
  -- | Reset the size of the focused group to the default
  zoomGroupReset :: X ()
  zoomGroupReset = zoomColumnReset
  
  -- | Toggle whether the currently focused group should be maximized
  -- whenever it has focus.
  toggleGroupFull :: X ()
  toggleGroupFull = toggleGroupFull
  
  -- | Rotate the layouts in the focused group.
  groupToNextLayout :: X ()
  groupToNextLayout = sendMessage $ escape NextLayout
  
  -- | Switch the focused group to the \"maximized\" layout.
  groupToFullLayout :: X ()
  groupToFullLayout = sendMessage $ escape $ JumpToLayout "Full"
  
  -- | Switch the focused group to the \"tabbed\" layout.
  groupToTabbedLayout :: X ()
  groupToTabbedLayout = sendMessage $ escape $ JumpToLayout "Tabs"
  
  -- | Switch the focused group to the \"column\" layout.
  groupToVerticalLayout :: X ()
  groupToVerticalLayout = sendMessage $ escape $ JumpToLayout "Column"
  
  