aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Actions/FloatSnap.hs
diff options
context:
space:
mode:
authorAnders Engstrom <ankaan@gmail.com>2009-05-27 00:29:42 +0200
committerAnders Engstrom <ankaan@gmail.com>2009-05-27 00:29:42 +0200
commit3d040ddf0bdbf190c071918e3adb7be6db00b4e7 (patch)
tree7cb7554765e24848e873a85352911d95348c2c8d /XMonad/Actions/FloatSnap.hs
parentaa6bc9f3e9cd1d4436ce14a3da099beee252c3aa (diff)
downloadXMonadContrib-3d040ddf0bdbf190c071918e3adb7be6db00b4e7.tar.gz
XMonadContrib-3d040ddf0bdbf190c071918e3adb7be6db00b4e7.tar.xz
XMonadContrib-3d040ddf0bdbf190c071918e3adb7be6db00b4e7.zip
FloatSnap - calculate gaps instead of snapping against unmanaged windows
Ignore-this: 4378f4c6c4f383c9a35acb503409d865 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. darcs-hash:20090526222942-8978f-2d110fbeb4777d6b019b7f0f647eb2251196b5e8.gz
Diffstat (limited to '')
-rw-r--r--XMonad/Actions/FloatSnap.hs31
1 files changed, 13 insertions, 18 deletions
diff --git a/XMonad/Actions/FloatSnap.hs b/XMonad/Actions/FloatSnap.hs
index 24f4ebc..cc618cd 100644
--- a/XMonad/Actions/FloatSnap.hs
+++ b/XMonad/Actions/FloatSnap.hs
@@ -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