module XMonad.Actions.FlexibleResize (
XMonad.Actions.FlexibleResize.mouseResizeWindow,
XMonad.Actions.FlexibleResize.mouseResizeEdgeWindow
) where
import XMonad
import XMonad.Prelude (fi)
import Foreign.C.Types
mouseResizeWindow
:: Window
-> X ()
mouseResizeWindow :: Window -> X ()
mouseResizeWindow = Rational -> Window -> X ()
mouseResizeEdgeWindow Rational
0
mouseResizeEdgeWindow
:: Rational
-> Window
-> X ()
mouseResizeEdgeWindow :: Rational -> Window -> X ()
mouseResizeEdgeWindow Rational
edge Window
w = X Bool -> X () -> X ()
whenX (Window -> X Bool
isClient Window
w) (X () -> X ()) -> X () -> X ()
forall a b. (a -> b) -> a -> b
$ (Display -> X ()) -> X ()
forall a. (Display -> X a) -> X a
withDisplay ((Display -> X ()) -> X ()) -> (Display -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \Display
d ->
Display -> Window -> (WindowAttributes -> X ()) -> X ()
withWindowAttributes Display
d Window
w ((WindowAttributes -> X ()) -> X ())
-> (WindowAttributes -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \WindowAttributes
wa -> do
sh <- IO SizeHints -> X SizeHints
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO SizeHints -> X SizeHints) -> IO SizeHints -> X SizeHints
forall a b. (a -> b) -> a -> b
$ Display -> Window -> IO SizeHints
getWMNormalHints Display
d Window
w
(_, _, _, _, _, ix, iy, _) <- io $ queryPointer d w
let
pos_x = CInt -> Position
forall a b. (Integral a, Num b) => a -> b
fi (CInt -> Position) -> CInt -> Position
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_x WindowAttributes
wa
pos_y = CInt -> Position
forall a b. (Integral a, Num b) => a -> b
fi (CInt -> Position) -> CInt -> Position
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_y WindowAttributes
wa
width = CInt -> Position
forall a b. (Integral a, Num b) => a -> b
fi (CInt -> Position) -> CInt -> Position
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_width WindowAttributes
wa
height = CInt -> Position
forall a b. (Integral a, Num b) => a -> b
fi (CInt -> Position) -> CInt -> Position
forall a b. (a -> b) -> a -> b
$ WindowAttributes -> CInt
wa_height WindowAttributes
wa
west = CInt -> Position -> Maybe Bool
findPos CInt
ix Position
width
north = CInt -> Position -> Maybe Bool
findPos CInt
iy Position
height
(cx, fx, gx) = mkSel west width pos_x
(cy, fy, gy) = mkSel north height pos_y
io $ warpPointer d none w 0 0 0 0 cx cy
mouseDrag (\Position
ex Position
ey -> do let (Dimension
nw,Dimension
nh) = SizeHints -> (Dimension, Dimension) -> (Dimension, Dimension)
forall a.
Integral a =>
SizeHints -> (a, a) -> (Dimension, Dimension)
applySizeHintsContents SizeHints
sh (Position -> Dimension
gx Position
ex, Position -> Dimension
gy Position
ey)
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display
-> Window
-> Position
-> Position
-> Dimension
-> Dimension
-> IO ()
moveResizeWindow Display
d Window
w (Dimension -> Position
fx Dimension
nw) (Dimension -> Position
fy Dimension
nh) Dimension
nw Dimension
nh
Window -> X ()
float Window
w)
(float w)
where
findPos :: CInt -> Position -> Maybe Bool
findPos :: CInt -> Position -> Maybe Bool
findPos CInt
m Position
s
| Rational
p Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
0.5 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
edgeRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
2 = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True
| Rational
p Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
0.5 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
edgeRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
2 = Maybe Bool
forall a. Maybe a
Nothing
| Bool
otherwise = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False
where
p :: Rational
p = CInt -> Rational
forall a b. (Integral a, Num b) => a -> b
fi CInt
m Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Position -> Rational
forall a b. (Integral a, Num b) => a -> b
fi Position
s
mkSel :: Maybe Bool -> Position -> Position -> (Position, Dimension -> Position, Position -> Dimension)
mkSel :: Maybe Bool
-> Position
-> Position
-> (Position, Dimension -> Position, Position -> Dimension)
mkSel Maybe Bool
b Position
k Position
p = case Maybe Bool
b of
Just Bool
True -> (Position
0, (Position -> Position
forall a b. (Integral a, Num b) => a -> b
fi Position
k Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position -> Position
forall a b. (Integral a, Num b) => a -> b
fi Position
p Position -> Position -> Position
forall a. Num a => a -> a -> a
-)(Position -> Position)
-> (Dimension -> Position) -> Dimension -> Position
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Dimension -> Position
forall a b. (Integral a, Num b) => a -> b
fi, (Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi Position
k Dimension -> Dimension -> Dimension
forall a. Num a => a -> a -> a
+ Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi Position
p Dimension -> Dimension -> Dimension
forall a. Num a => a -> a -> a
-)(Dimension -> Dimension)
-> (Position -> Dimension) -> Position -> Dimension
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi)
Maybe Bool
Nothing -> (Position
k Position -> Position -> Position
forall a. Integral a => a -> a -> a
`div` Position
2, Position -> Dimension -> Position
forall a b. a -> b -> a
const Position
p, Dimension -> Position -> Dimension
forall a b. a -> b -> a
const (Dimension -> Position -> Dimension)
-> Dimension -> Position -> Dimension
forall a b. (a -> b) -> a -> b
$ Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi Position
k)
Just Bool
False -> (Position
k, Position -> Dimension -> Position
forall a b. a -> b -> a
const Position
p, Dimension -> Dimension -> Dimension
forall a. Num a => a -> a -> a
subtract (Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi Position
p) (Dimension -> Dimension)
-> (Position -> Dimension) -> Position -> Dimension
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> Dimension
forall a b. (Integral a, Num b) => a -> b
fi)