FloatSnap - calculate gaps instead of snapping against unmanaged windows

This patch will remove snapping against unmanaged windows, but instead calculate a new rectangle with all gaps (computed by ManageDocks) removed. This new rectangle is used to snap against. (Both the inside and outside of the rectangle.)

This will remedy the issue of snapping against multiple layers of the same window, additionally there will be no snap-points between windows on the same side. So if you are running two dzen side by side with half the screen each. You will not automatically have a snap-point in the middle.

Naturally, this patch will change which function is exported from ManageDocks.
This commit is contained in:
Anders Engstrom 2009-05-26 22:29:42 +00:00
parent f6479ee0a8
commit c5b5db500b
2 changed files with 14 additions and 19 deletions

View File

@ -24,13 +24,12 @@ module XMonad.Actions.FloatSnap (
snapMagicMouseResize) where
import XMonad
import Control.Monad(filterM)
import Control.Applicative((<$>))
import Data.List (sort)
import Data.Maybe (listToMaybe,fromJust,isNothing)
import qualified XMonad.StackSet as W
import XMonad.Hooks.ManageDocks (Direction(..),getStrut)
import XMonad.Hooks.ManageDocks (Direction(..),calcGap)
-- $usage
-- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
@ -277,13 +276,13 @@ getSnap :: Bool -> Maybe Int -> Display -> Window -> X ((Maybe Int,Maybe Int,Boo
getSnap horiz collidedist d w = do
wa <- io $ getWindowAttributes d w
screen <- W.current <$> gets windowset
unManaged <- unManagedDocks
let sr = screenRect $ W.screenDetail screen
wl = (unManaged ++) . W.integrate' . W.stack $ W.workspace screen
wl = W.integrate' . W.stack $ W.workspace screen
gr <- fmap ($sr) $ calcGap [L,R,U,D]
wla <- filter (collides wa) `fmap` (io $ mapM (getWindowAttributes d) $ filter (/=w) wl)
return ( neighbours (back wa sr wla) (wpos wa)
, neighbours (front wa sr wla) (wpos wa + wdim wa)
return ( neighbours (back wa sr gr wla) (wpos wa)
, neighbours (front wa sr gr wla) (wpos wa + wdim wa)
)
where
@ -292,13 +291,15 @@ getSnap horiz collidedist d w = do
(wpos, wdim, rpos, rdim) = constructors horiz
(refwpos, refwdim, _, _) = constructors $ not horiz
back wa sr wla = dropWhile (< rpos sr) $
takeWhile (< rpos sr + rdim sr) $
sort $ (rpos sr):foldr (\a as -> (wpos a):(wpos a + wdim a + wborder a + wborder wa):as) [] wla
back wa sr gr wla = dropWhile (< rpos sr) $
takeWhile (< rpos sr + rdim sr) $
sort $ (rpos sr):(rpos gr):(rpos gr + rdim gr):
foldr (\a as -> (wpos a):(wpos a + wdim a + wborder a + wborder wa):as) [] wla
front wa sr wla = dropWhile (<= rpos sr) $
takeWhile (<= rpos sr + rdim sr) $
sort $ (rpos sr + rdim sr - 2*(wborder wa)):foldr (\a as -> (wpos a - wborder a - wborder wa):(wpos a + wdim a):as) [] wla
front wa sr gr wla = dropWhile (<= rpos sr) $
takeWhile (<= rpos sr + rdim sr) $
sort $ (rpos gr - 2*wborder wa):(rpos gr + rdim gr - 2*wborder wa):(rpos sr + rdim sr - 2*wborder wa):
foldr (\a as -> (wpos a - wborder a - wborder wa):(wpos a + wdim a):as) [] wla
neighbours l v = ( listToMaybe $ reverse $ takeWhile (< v) l
, listToMaybe $ dropWhile (<= v) l
@ -310,12 +311,6 @@ getSnap horiz collidedist d w = do
Just dist -> ( refwpos oa - wborder oa < refwpos wa + refwdim wa + wborder wa + dist
&& refwpos wa - wborder wa - dist < refwpos oa + refwdim oa + wborder oa )
unManagedDocks :: X [Window]
unManagedDocks = withWindowSet $ \ws -> withDisplay $ \disp ->
fmap (filter (`notElem` W.allWindows ws)) .
filterM (fmap (not . null) . getStrut) . (\(_,_,x) -> x)
=<< io . queryTree disp
=<< asks theRoot
constructors :: Bool -> (WindowAttributes -> Int, WindowAttributes -> Int, Rectangle -> Int, Rectangle -> Int)
constructors True = ( fromIntegral.wa_x

View File

@ -21,7 +21,7 @@ module XMonad.Hooks.ManageDocks (
ToggleStruts(..), Direction(..),
-- for XMonad.Actions.FloatSnap
getStrut
calcGap
) where