module XMonad.Actions.Warp (
banish,
banishScreen,
Corner(..),
warpToScreen,
warpToWindow
) where
import XMonad.Prelude
import XMonad
import XMonad.StackSet as W
data Corner = UpperLeft | UpperRight | LowerLeft | LowerRight
banish :: Corner -> X ()
banish :: Corner -> X ()
banish Corner
direction = case Corner
direction of
Corner
LowerRight -> Rational -> Rational -> X ()
warpToWindow Rational
1 Rational
1
Corner
LowerLeft -> Rational -> Rational -> X ()
warpToWindow Rational
0 Rational
1
Corner
UpperLeft -> Rational -> Rational -> X ()
warpToWindow Rational
0 Rational
0
Corner
UpperRight -> Rational -> Rational -> X ()
warpToWindow Rational
1 Rational
0
banishScreen :: Corner -> X ()
banishScreen :: Corner -> X ()
banishScreen Corner
direction = case Corner
direction of
Corner
LowerRight -> Rational -> Rational -> X ()
warpToCurrentScreen Rational
1 Rational
1
Corner
LowerLeft -> Rational -> Rational -> X ()
warpToCurrentScreen Rational
0 Rational
1
Corner
UpperLeft -> Rational -> Rational -> X ()
warpToCurrentScreen Rational
0 Rational
0
Corner
UpperRight -> Rational -> Rational -> X ()
warpToCurrentScreen Rational
1 Rational
0
where
warpToCurrentScreen :: Rational -> Rational -> X ()
warpToCurrentScreen Rational
h Rational
v =
do ws <- (XState -> WindowSet) -> X WindowSet
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets XState -> WindowSet
windowset
warpToScreen (W.screen $ current ws) h v
windows (const ws)
fraction :: (Integral a, Integral b) => Rational -> a -> b
fraction :: forall a b. (Integral a, Integral b) => Rational -> a -> b
fraction Rational
f a
x = Rational -> b
forall b. Integral b => Rational -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Rational
f Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* a -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
warp :: Window -> Position -> Position -> X ()
warp :: Window -> Position -> Position -> X ()
warp Window
w Position
x Position
y = (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 -> 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
-> Dimension
-> Dimension
-> Position
-> Position
-> IO ()
warpPointer Display
d Window
none Window
w Position
0 Position
0 Dimension
0 Dimension
0 Position
x Position
y
warpToWindow :: Rational -> Rational -> X ()
warpToWindow :: Rational -> Rational -> X ()
warpToWindow Rational
h Rational
v = (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 -> (Window -> X ()) -> X ()
withFocused ((Window -> X ()) -> X ()) -> (Window -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \Window
w ->
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 ->
Window -> Position -> Position -> X ()
warp Window
w (Rational -> CInt -> Position
forall a b. (Integral a, Integral b) => Rational -> a -> b
fraction Rational
h (WindowAttributes -> CInt
wa_width WindowAttributes
wa)) (Rational -> CInt -> Position
forall a b. (Integral a, Integral b) => Rational -> a -> b
fraction Rational
v (WindowAttributes -> CInt
wa_height WindowAttributes
wa))
warpToScreen :: ScreenId -> Rational -> Rational -> X ()
warpToScreen :: ScreenId -> Rational -> Rational -> X ()
warpToScreen ScreenId
n Rational
h Rational
v = do
root <- (XConf -> Window) -> X Window
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks XConf -> Window
theRoot
StackSet{current = x, visible = xs} <- gets windowset
whenJust (fmap (screenRect . W.screenDetail) . find ((n==) . W.screen) $ x : xs)
$ \Rectangle
r ->
Window -> Position -> Position -> X ()
warp Window
root (Rectangle -> Position
rect_x Rectangle
r Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Rational -> Dimension -> Position
forall a b. (Integral a, Integral b) => Rational -> a -> b
fraction Rational
h (Rectangle -> Dimension
rect_width Rectangle
r))
(Rectangle -> Position
rect_y Rectangle
r Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Rational -> Dimension -> Position
forall a b. (Integral a, Integral b) => Rational -> a -> b
fraction Rational
v (Rectangle -> Dimension
rect_height Rectangle
r))