Merge pull request #186 from ankaan/multicolumns-layouthints-windoworderfix

Fix render order of LayoutHints and MultiColumns
This commit is contained in:
Peter J. Jones
2017-05-24 16:52:41 -07:00
committed by GitHub
3 changed files with 26 additions and 3 deletions

View File

@@ -58,6 +58,19 @@
### Bug Fixes and Minor Changes ### Bug Fixes and Minor Changes
* `XMonad.Layout.LayoutHints`
Preserve the window order of the modified layout, except for the focused
window that is placed on top. This fixes an issue where the border of the
focused window in certain situations could be rendered below borders of
unfocused windows. It also has a lower risk of interfering with the
modified layout.
* `XMonad.Layout.MultiColumns`
The focused window is placed above the other windows if they would be made to
overlap due to a layout modifier. (As long as it preserves the window order.)
* `XMonad.Actions.GridSelect` * `XMonad.Actions.GridSelect`
- The vertical centring of text in each cell has been improved. - The vertical centring of text in each cell has been improved.

View File

@@ -44,6 +44,7 @@ import Data.Monoid(All(..))
import Data.Set (Set) import Data.Set (Set)
import qualified Data.Set as Set import qualified Data.Set as Set
import Data.Maybe(fromJust)
-- $usage -- $usage
-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@: -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
@@ -147,10 +148,15 @@ instance LayoutModifier LayoutHintsToCenter Window where
modifyLayout _ ws@(W.Workspace _ _ (Just st)) r = do modifyLayout _ ws@(W.Workspace _ _ (Just st)) r = do
(arrs,ol) <- runLayout ws r (arrs,ol) <- runLayout ws r
flip (,) ol flip (,) ol
. changeOrder (W.focus st : (filter (/= W.focus st) $ map fst arrs))
. head . reverse . sortBy (compare `on` (fitting . map snd)) . head . reverse . sortBy (compare `on` (fitting . map snd))
. map (applyHints st r) . applyOrder r . map (applyHints st r) . applyOrder r
<$> mapM (\x -> fmap ((,) x) $ mkAdjust (fst x)) arrs <$> mapM (\x -> fmap ((,) x) $ mkAdjust (fst x)) arrs
changeOrder :: [Window] -> [(Window, Rectangle)] -> [(Window, Rectangle)]
changeOrder w wr = zip w' $ map (fromJust . flip lookup wr) w'
where w' = filter (`elem` map fst wr) w
-- apply hints to first, grow adjacent windows -- apply hints to first, grow adjacent windows
applyHints :: W.Stack Window -> Rectangle -> [((Window, Rectangle),(D -> D))] -> [(Window, Rectangle)] applyHints :: W.Stack Window -> Rectangle -> [((Window, Rectangle),(D -> D))] -> [(Window, Rectangle)]
applyHints _ _ [] = [] applyHints _ _ [] = []

View File

@@ -77,10 +77,9 @@ data MultiCol a = MultiCol
} deriving (Show,Read,Eq) } deriving (Show,Read,Eq)
instance LayoutClass MultiCol a where instance LayoutClass MultiCol a where
doLayout l r s = return (zip w rlist, resl) doLayout l r s = return (combine s rlist, resl)
where rlist = doL (multiColNWin l') (multiColSize l') r wlen where rlist = doL (multiColNWin l') (multiColSize l') r wlen
w = W.integrate s wlen = length $ W.integrate s
wlen = length w
-- Make sure the list of columns is big enough and update active column -- Make sure the list of columns is big enough and update active column
nw = multiColNWin l ++ repeat (multiColDefWin l) nw = multiColNWin l ++ repeat (multiColDefWin l)
l' = l { multiColNWin = take (max (length $ multiColNWin l) $ getCol (wlen-1) nw + 1) nw l' = l { multiColNWin = take (max (length $ multiColNWin l) $ getCol (wlen-1) nw + 1) nw
@@ -90,6 +89,7 @@ instance LayoutClass MultiCol a where
resl = if l'==l resl = if l'==l
then Nothing then Nothing
else Just l' else Just l'
combine (W.Stack foc left right) rs = zip (foc : reverse left ++ right) $ raiseFocused (length left) rs
handleMessage l m = handleMessage l m =
return $ msum [fmap resize (fromMessage m) return $ msum [fmap resize (fromMessage m)
,fmap incmastern (fromMessage m)] ,fmap incmastern (fromMessage m)]
@@ -104,6 +104,10 @@ instance LayoutClass MultiCol a where
a = multiColActive l a = multiColActive l
description _ = "MultiCol" description _ = "MultiCol"
raiseFocused :: Int -> [a] -> [a]
raiseFocused n xs = actual ++ before ++ after
where (before,rest) = splitAt n xs
(actual,after) = splitAt 1 rest
-- | Get which column a window is in, starting at 0. -- | Get which column a window is in, starting at 0.
getCol :: Int -> [Int] -> Int getCol :: Int -> [Int] -> Int