From 0b79840152525619eecf9bbafa66657031178991 Mon Sep 17 00:00:00 2001 From: Roman Cheplyaka Date: Wed, 16 Jan 2008 21:50:20 +0100 Subject: add XMonad.Actions.CycleSelectedLayouts darcs-hash:20080116205020-3ebed-4cbcc5e67871dddb863909b153205417ebe1ce94.gz --- XMonad/Actions/CycleSelectedLayouts.hs | 51 ++++++++++++++++++++++++++++++++++ xmonad-contrib.cabal | 1 + 2 files changed, 52 insertions(+) create mode 100644 XMonad/Actions/CycleSelectedLayouts.hs diff --git a/XMonad/Actions/CycleSelectedLayouts.hs b/XMonad/Actions/CycleSelectedLayouts.hs new file mode 100644 index 0000000..63f07ca --- /dev/null +++ b/XMonad/Actions/CycleSelectedLayouts.hs @@ -0,0 +1,51 @@ +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Actions.CycleSelectedLayouts +-- Copyright : (c) Roman Cheplyaka +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : Roman Cheplyaka +-- 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 diff --git a/xmonad-contrib.cabal b/xmonad-contrib.cabal index bd8fda6..24dae39 100644 --- a/xmonad-contrib.cabal +++ b/xmonad-contrib.cabal @@ -61,6 +61,7 @@ library XMonad.Actions.Commands XMonad.Actions.ConstrainedResize XMonad.Actions.CopyWindow + XMonad.Actions.CycleSelectedLayouts XMonad.Actions.CycleWS XMonad.Actions.DeManage XMonad.Actions.DwmPromote -- cgit v1.2.3