X.U.WorkspaceCompare xinerama compare with physical order

Like the old xinerama workspace comparison, but order by physical location just like X.A.PhysicalScreens. Useful if using xinerama sort for statusbar together with physicalscreens.
This commit is contained in:
Anders Engstrom
2010-03-08 11:54:02 +00:00
parent 5e6c03c2ca
commit 0c9619e5cd

View File

@@ -8,15 +8,18 @@
-- Stability : unstable -- Stability : unstable
-- Portability : unportable -- Portability : unportable
-- --
-----------------------------------------------------------------------------
module XMonad.Util.WorkspaceCompare ( WorkspaceCompare, WorkspaceSort module XMonad.Util.WorkspaceCompare ( WorkspaceCompare, WorkspaceSort
, getWsIndex , getWsIndex
, getWsCompare , getWsCompare
, getWsCompareByTag , getWsCompareByTag
, getXineramaPhysicalWsCompare
, getXineramaWsCompare , getXineramaWsCompare
, mkWsSort , mkWsSort
, getSortByIndex , getSortByIndex
, getSortByTag , getSortByTag
, getSortByXineramaPhysicalRule
, getSortByXineramaRule ) where , getSortByXineramaRule ) where
import XMonad import XMonad
@@ -57,10 +60,17 @@ getWsCompareByTag = return compare
-- and screen id. It produces the same ordering as -- and screen id. It produces the same ordering as
-- 'XMonad.Hooks.DynamicLog.pprWindowSetXinerama'. -- 'XMonad.Hooks.DynamicLog.pprWindowSetXinerama'.
getXineramaWsCompare :: X WorkspaceCompare getXineramaWsCompare :: X WorkspaceCompare
getXineramaWsCompare = do getXineramaWsCompare = getXineramaWsCompare' False
-- | A comparison function like 'getXineramaWsCompare', but uses physical locations for screens.
getXineramaPhysicalWsCompare :: X WorkspaceCompare
getXineramaPhysicalWsCompare = getXineramaWsCompare' True
getXineramaWsCompare' :: Bool -> X WorkspaceCompare
getXineramaWsCompare' phy = do
w <- gets windowset w <- gets windowset
return $ \ a b -> case (isOnScreen a w, isOnScreen b w) of return $ \ a b -> case (isOnScreen a w, isOnScreen b w) of
(True, True) -> comparing (tagToSid (onScreen w)) a b (True, True) -> cmpPosition phy w a b
(False, False) -> compare a b (False, False) -> compare a b
(True, False) -> LT (True, False) -> LT
(False, True) -> GT (False, True) -> GT
@@ -68,6 +78,10 @@ getXineramaWsCompare = do
onScreen w = S.current w : S.visible w onScreen w = S.current w : S.visible w
isOnScreen a w = a `elem` map (S.tag . S.workspace) (onScreen w) isOnScreen a w = a `elem` map (S.tag . S.workspace) (onScreen w)
tagToSid s x = S.screen $ fromJust $ find ((== x) . S.tag . S.workspace) s tagToSid s x = S.screen $ fromJust $ find ((== x) . S.tag . S.workspace) s
cmpPosition False w a b = comparing (tagToSid $ onScreen w) a b
cmpPosition True w a b = comparing (rect.(tagToSid $ onScreen w)) a b
where rect i = let (Rectangle x y _ _) = screens !! fromIntegral i in (y,x)
screens = map (screenRect . S.screenDetail) $ sortBy (comparing S.screen) $ S.current w : S.visible w
-- | Create a workspace sorting function from a workspace comparison -- | Create a workspace sorting function from a workspace comparison
-- function. -- function.
@@ -92,3 +106,7 @@ getSortByTag = mkWsSort getWsCompareByTag
getSortByXineramaRule :: X WorkspaceSort getSortByXineramaRule :: X WorkspaceSort
getSortByXineramaRule = mkWsSort getXineramaWsCompare getSortByXineramaRule = mkWsSort getXineramaWsCompare
-- | Like 'getSortByXineramaRule', but uses physical locations for screens.
getSortByXineramaPhysicalRule :: X WorkspaceSort
getSortByXineramaPhysicalRule = mkWsSort getXineramaPhysicalWsCompare