diff --git a/CHANGES.md b/CHANGES.md index 083d8d2d..5d4534e0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -54,9 +54,16 @@ into `foo/bar`, instead of `~/bar` as expected. * `XMonad.Actions.DynamicWorkspaceOrder` + Add a version of `withNthWorkspace` that takes a `[WorkspaceId] -> - [WorkspaceId]` transformation to apply over the list of workspace tags - resulting from the dynamic order. + [WorkspaceId]` transformation to apply over the list of workspace tags + resulting from the dynamic order. + + * `XMonad.Actions.GroupNavigation` + + Add a utility function `isOnAnyVisibleWS :: Query Bool` to allow easy + cycling between all windows on all visible workspaces. + ## 0.15 diff --git a/XMonad/Actions/GroupNavigation.hs b/XMonad/Actions/GroupNavigation.hs index 408a5cd7..eb465da9 100644 --- a/XMonad/Actions/GroupNavigation.hs +++ b/XMonad/Actions/GroupNavigation.hs @@ -16,7 +16,7 @@ -- query. -- -- Also provides a method for jumping back to the most recently used --- window in any given group. +-- window in any given group, and predefined groups. -- ---------------------------------------------------------------------- @@ -27,6 +27,10 @@ module XMonad.Actions.GroupNavigation ( -- * Usage , nextMatchOrDo , nextMatchWithThis , historyHook + + -- * Utilities + -- $utilities + , isOnAnyVisibleWS ) where import Control.Monad.Reader @@ -142,7 +146,7 @@ orderedWorkspaceList ss wsids = rotateTo isCurWS wspcs' where wspcs = SS.workspaces ss wspcsMap = Fold.foldl' (\m ws -> Map.insert (SS.tag ws) ws m) Map.empty wspcs - wspcs' = fmap (\wsid -> wspcsMap ! wsid) wsids + wspcs' = fmap (wspcsMap !) wsids isCurWS ws = SS.tag ws == SS.tag (SS.workspace $ SS.current ss) --- History navigation, requires a layout modifier ------------------- @@ -167,7 +171,7 @@ updateHistory :: HistoryDB -> X HistoryDB updateHistory (HistoryDB oldcur oldhist) = withWindowSet $ \ss -> do let newcur = SS.peek ss wins = Set.fromList $ SS.allWindows ss - newhist = flt (flip Set.member wins) (ins oldcur oldhist) + newhist = flt (`Set.member` wins) (ins oldcur oldhist) return $ HistoryDB newcur (del newcur newhist) where ins x xs = maybe xs (<| xs) x @@ -216,3 +220,22 @@ findM cond xs = findM' cond (viewl xs) if isMatch then return (Just x') else findM qry xs' + + +-- $utilities +-- #utilities# +-- Below are handy queries for use with 'nextMatch', 'nextMatchOrDo', +-- and 'nextMatchWithThis'. + +-- | A query that matches all windows on visible workspaces. This is +-- useful for configurations with multiple screens, and matches even +-- invisible windows. +isOnAnyVisibleWS :: Query Bool +isOnAnyVisibleWS = do + w <- ask + ws <- liftX $ gets windowset + let allVisible = concat $ maybe [] W.integrate . W.stack . W.workspace <$> W.current ws:W.visible ws + visibleWs = w `elem` allVisible + unfocused = maybe True (w /=) $ W.peek ws + return $ visibleWs && unfocused +