File: CycleSelectedLayouts.hs

package info (click to toggle)
xmonad-contrib 0.7-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 980 kB
  • ctags: 18
  • sloc: haskell: 6,515; sh: 223; ansic: 78; makefile: 73
file content (51 lines) | stat: -rw-r--r-- 1,787 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-----------------------------------------------------------------------------
-- |
-- Module      :  XMonad.Actions.CycleSelectedLayouts
-- Copyright   :  (c) Roman Cheplyaka
-- License     :  BSD3-style (see LICENSE)
--
-- Maintainer  :  Roman Cheplyaka <roma@ro-che.info>
-- Stability   :  unstable
-- Portability :  unportable
--
-- This module allows to cycle through the given subset of layouts.
--
-----------------------------------------------------------------------------

module XMonad.Actions.CycleSelectedLayouts (
    -- * Usage
    -- $usage
    cycleThroughLayouts) where

import XMonad
import Data.List (findIndex)
import Data.Maybe (fromMaybe)
import XMonad.Layout.LayoutCombinators (JumpToLayout(..))
import qualified XMonad.StackSet as S

-- $usage
-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
-- 
-- > import XMonad hiding ((|||))
-- > import XMonad.Layout.LayoutCombinators ((|||))
-- > import XMonad.Actions.CycleSelectedLayouts
--
-- >   , ((modMask x,  xK_t ),   cycleThroughLayouts ["Tall", "Mirror Tall"])
--
-- Make sure you are using NewSelect from XMonad.Layout.LayoutCombinators,
-- rather than the Select defined in xmonad core.

cycleToNext :: (Eq a) => [a] -> a -> Maybe a
cycleToNext lst a = do
    -- not beautiful but simple and readable
    ind <- findIndex (a==) lst
    return $ lst !! if ind == length lst - 1 then 0 else ind+1

-- | If the current layout is in the list, cycle to the next layout. Otherwise,
--   apply the first layout from list.
cycleThroughLayouts :: [String] -> X ()
cycleThroughLayouts lst = do
    winset <- gets windowset
    let ld = description . S.layout . S.workspace . S.current $ winset
    let newld = fromMaybe (head lst) (cycleToNext lst ld)
    sendMessage $ JumpToLayout newld