aboutsummaryrefslogtreecommitdiffstats
path: root/RotView.hs
diff options
context:
space:
mode:
Diffstat (limited to 'RotView.hs')
-rw-r--r--RotView.hs23
1 files changed, 13 insertions, 10 deletions
diff --git a/RotView.hs b/RotView.hs
index 9d53cc4..7505bb2 100644
--- a/RotView.hs
+++ b/RotView.hs
@@ -12,21 +12,24 @@ import qualified Data.Map as M
import Control.Monad.State
import Operations ( view )
-import XMonad ( X, WorkspaceId, workspace )
-import StackSet ( StackSet, focus )
-import qualified StackSet as W ( current )
+import XMonad ( X, WorkspaceId, workspace, whenJust )
+import StackSet ( StackSet )
+import Data.Maybe ( listToMaybe )
+import qualified StackSet as W ( stacks, current, visibleWorkspaces, index )
rotView :: Bool -> X ()
rotView b = do ws <- gets workspace
let m = W.current ws
+ vis = W.visibleWorkspaces ws
allws = if b then allWorkspaces ws else reverse $ allWorkspaces ws
- n1 = safehead allws m
- rot (f:fs) | f == m = safehead fs n1
- | otherwise = rot fs
- rot [] = n1
- safehead fs f = case fs of { [] -> f; f':_ -> f'; }
- view (rot allws)
+ pivoted = uncurry (flip (++)) . span (/=m) $ allws
+ interesting i = not (i `elem` vis) && not (isEmpty i ws)
+ nextws = listToMaybe . filter interesting $ pivoted
+ whenJust nextws view
-- | A list of all the workspaces.
allWorkspaces :: StackSet WorkspaceId j a -> [WorkspaceId]
-allWorkspaces = M.keys . focus
+allWorkspaces = M.keys . W.stacks
+
+isEmpty :: WorkspaceId -> StackSet WorkspaceId j a -> Bool
+isEmpty i = maybe True null . W.index i