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