mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-08-01 12:41:52 -07:00
Make X.A.CycleWS not rely on hidden WS order
This commit is contained in:
@@ -78,11 +78,11 @@ module XMonad.Actions.CycleWS (
|
|||||||
|
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Monad ( unless )
|
import Data.List ( find, findIndex )
|
||||||
import Data.List ( findIndex )
|
|
||||||
import Data.Maybe ( isNothing, isJust )
|
import Data.Maybe ( isNothing, isJust )
|
||||||
|
|
||||||
import XMonad hiding (workspaces)
|
import XMonad hiding (workspaces)
|
||||||
|
import qualified XMonad.Hooks.WorkspaceHistory as WH
|
||||||
import XMonad.StackSet hiding (filter)
|
import XMonad.StackSet hiding (filter)
|
||||||
import XMonad.Util.Types
|
import XMonad.Util.Types
|
||||||
import XMonad.Util.WorkspaceCompare
|
import XMonad.Util.WorkspaceCompare
|
||||||
@@ -119,6 +119,10 @@ import XMonad.Util.WorkspaceCompare
|
|||||||
--
|
--
|
||||||
-- For detailed instructions on editing your key bindings, see
|
-- For detailed instructions on editing your key bindings, see
|
||||||
-- "XMonad.Doc.Extending#Editing_key_bindings".
|
-- "XMonad.Doc.Extending#Editing_key_bindings".
|
||||||
|
--
|
||||||
|
-- When using the toggle functions, in order to ensure that the workspace
|
||||||
|
-- to which you switch is the previously viewed workspace, use the
|
||||||
|
-- 'logHook' in "XMonad.Hooks.WorkspaceHistory".
|
||||||
|
|
||||||
{- $moving
|
{- $moving
|
||||||
|
|
||||||
@@ -158,9 +162,7 @@ toggleWS = toggleWS' []
|
|||||||
-- > -- Ignore the scratchpad workspace while toggling:
|
-- > -- Ignore the scratchpad workspace while toggling:
|
||||||
-- > ("M-b", toggleWS' ["NSP"])
|
-- > ("M-b", toggleWS' ["NSP"])
|
||||||
toggleWS' :: [WorkspaceId] -> X ()
|
toggleWS' :: [WorkspaceId] -> X ()
|
||||||
toggleWS' skips = do
|
toggleWS' skips = lastViewedHiddenExcept skips >>= flip whenJust (windows . view)
|
||||||
hs' <- cleanHiddens skips
|
|
||||||
unless (null hs') (windows . view . tag $ head hs')
|
|
||||||
|
|
||||||
-- | 'XMonad.StackSet.greedyView' a workspace, or if already there, view
|
-- | 'XMonad.StackSet.greedyView' a workspace, or if already there, view
|
||||||
-- the previously displayed workspace ala weechat. Change @greedyView@ to
|
-- the previously displayed workspace ala weechat. Change @greedyView@ to
|
||||||
@@ -184,10 +186,9 @@ toggleOrView = toggleOrDoSkip [] greedyView
|
|||||||
toggleOrDoSkip :: [WorkspaceId] -> (WorkspaceId -> WindowSet -> WindowSet)
|
toggleOrDoSkip :: [WorkspaceId] -> (WorkspaceId -> WindowSet -> WindowSet)
|
||||||
-> WorkspaceId -> X ()
|
-> WorkspaceId -> X ()
|
||||||
toggleOrDoSkip skips f toWS = do
|
toggleOrDoSkip skips f toWS = do
|
||||||
hs' <- cleanHiddens skips
|
|
||||||
cur <- gets (currentTag . windowset)
|
cur <- gets (currentTag . windowset)
|
||||||
if toWS == cur
|
if toWS == cur
|
||||||
then unless (null hs') (windows . f . tag $ head hs')
|
then lastViewedHiddenExcept skips >>= flip whenJust (windows . f)
|
||||||
else windows (f toWS)
|
else windows (f toWS)
|
||||||
|
|
||||||
-- | List difference ('\\') for workspaces and tags. Removes workspaces
|
-- | List difference ('\\') for workspaces and tags. Removes workspaces
|
||||||
@@ -195,8 +196,16 @@ toggleOrDoSkip skips f toWS = do
|
|||||||
skipTags :: (Eq i) => [Workspace i l a] -> [i] -> [Workspace i l a]
|
skipTags :: (Eq i) => [Workspace i l a] -> [i] -> [Workspace i l a]
|
||||||
skipTags wss ids = filter ((`notElem` ids) . tag) wss
|
skipTags wss ids = filter ((`notElem` ids) . tag) wss
|
||||||
|
|
||||||
cleanHiddens :: [WorkspaceId] -> X [WindowSpace]
|
-- | Ignoring the skips, find the best candidate for the last viewed hidden
|
||||||
cleanHiddens skips = gets $ (flip skipTags) skips . hidden . windowset
|
-- workspace.
|
||||||
|
lastViewedHiddenExcept :: [WorkspaceId] -> X (Maybe WorkspaceId)
|
||||||
|
lastViewedHiddenExcept skips = do
|
||||||
|
hs <- gets $ map tag . flip skipTags skips . hidden . windowset
|
||||||
|
vs <- WH.workspaceHistory
|
||||||
|
return $ choose hs (find (`elem` hs) vs)
|
||||||
|
where choose [] _ = Nothing
|
||||||
|
choose (h:_) Nothing = Just h
|
||||||
|
choose _ vh@(Just _) = vh
|
||||||
|
|
||||||
switchWorkspace :: Int -> X ()
|
switchWorkspace :: Int -> X ()
|
||||||
switchWorkspace d = wsBy d >>= windows . greedyView
|
switchWorkspace d = wsBy d >>= windows . greedyView
|
||||||
|
Reference in New Issue
Block a user