----------------------------------------------------------------------------- -- | -- Module : XMonad.Actions.RotView -- Copyright : (c) David Roundy -- License : BSD3-style (see LICENSE) -- -- Maintainer : David Roundy -- Stability : unstable -- Portability : unportable -- -- Provides bindings to cycle through non-empty workspaces. -- ----------------------------------------------------------------------------- module XMonad.Actions.RotView ( -- * Usage -- $usage rotView ) where import Control.Monad.State ( gets ) import Data.List ( sortBy, find ) import Data.Maybe ( isJust ) import Data.Ord ( comparing ) import XMonad import XMonad.StackSet hiding (filter) import XMonad.Operations -- $usage -- You can use this module with the following in your Config.hs file: -- -- > import XMonad.Actions.RotView -- -- > , ((modMask .|. shiftMask, xK_Right), rotView True) -- > , ((modMask .|. shiftMask, xK_Left), rotView False) -- %import XMonad.Actions.RotView -- %keybind , ((modMask .|. shiftMask, xK_Right), rotView True) -- %keybind , ((modMask .|. shiftMask, xK_Left), rotView False) rotView :: Bool -> X () rotView forward = do ws <- gets windowset let currentTag = tag . workspace . current $ ws sortWs = sortBy (comparing tag) isNotEmpty = isJust . stack sorted = sortWs (hidden ws) pivoted = let (a,b) = span ((< currentTag) . tag) sorted in b ++ a pivoted' | forward = pivoted | otherwise = reverse pivoted nextws = find isNotEmpty pivoted' whenJust nextws (windows . view . tag)