mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-07-26 01:31:52 -07:00
Merge pull request #186 from ankaan/multicolumns-layouthints-windoworderfix
Fix render order of LayoutHints and MultiColumns
This commit is contained in:
13
CHANGES.md
13
CHANGES.md
@@ -58,6 +58,19 @@
|
||||
|
||||
### 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`
|
||||
|
||||
- The vertical centring of text in each cell has been improved.
|
||||
|
@@ -44,6 +44,7 @@ import Data.Monoid(All(..))
|
||||
|
||||
import Data.Set (Set)
|
||||
import qualified Data.Set as Set
|
||||
import Data.Maybe(fromJust)
|
||||
|
||||
-- $usage
|
||||
-- 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
|
||||
(arrs,ol) <- runLayout ws r
|
||||
flip (,) ol
|
||||
. changeOrder (W.focus st : (filter (/= W.focus st) $ map fst arrs))
|
||||
. head . reverse . sortBy (compare `on` (fitting . map snd))
|
||||
. map (applyHints st r) . applyOrder r
|
||||
<$> 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
|
||||
applyHints :: W.Stack Window -> Rectangle -> [((Window, Rectangle),(D -> D))] -> [(Window, Rectangle)]
|
||||
applyHints _ _ [] = []
|
||||
|
@@ -77,10 +77,9 @@ data MultiCol a = MultiCol
|
||||
} deriving (Show,Read,Eq)
|
||||
|
||||
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
|
||||
w = W.integrate s
|
||||
wlen = length w
|
||||
wlen = length $ W.integrate s
|
||||
-- Make sure the list of columns is big enough and update active column
|
||||
nw = multiColNWin l ++ repeat (multiColDefWin l)
|
||||
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
|
||||
then Nothing
|
||||
else Just l'
|
||||
combine (W.Stack foc left right) rs = zip (foc : reverse left ++ right) $ raiseFocused (length left) rs
|
||||
handleMessage l m =
|
||||
return $ msum [fmap resize (fromMessage m)
|
||||
,fmap incmastern (fromMessage m)]
|
||||
@@ -104,6 +104,10 @@ instance LayoutClass MultiCol a where
|
||||
a = multiColActive l
|
||||
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.
|
||||
getCol :: Int -> [Int] -> Int
|
||||
|
Reference in New Issue
Block a user