{-# LANGUAGE LambdaCase #-}
module XMonad.Hooks.ManageHelpers (
Side(..),
composeOne,
(-?>), (/=?), (^?), (~?), ($?), (<==?), (</=?), (-->>), (-?>>),
currentWs,
windowTag,
isInProperty,
isKDETrayWindow,
isFullscreen,
isMinimized,
isDialog,
isNotification,
pid,
desktop,
transientTo,
maybeToDefinite,
MaybeManageHook,
transience,
transience',
clientLeader,
sameBy,
shiftToSame,
shiftToSame',
doRectFloat,
doFullFloat,
doCenterFloat,
doSideFloat,
doFloatAt,
doFloatDep,
doHideIgnore,
doSink,
doLower,
doRaise,
doFocus,
Match,
) where
import XMonad
import XMonad.Prelude
import qualified XMonad.StackSet as W
import XMonad.Util.WindowProperties (getProp32s)
import System.Posix (ProcessID)
data Side = SC | NC | CE | CW | SE | SW | NE | NW | C
deriving (ReadPrec [Side]
ReadPrec Side
Int -> ReadS Side
ReadS [Side]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Side]
$creadListPrec :: ReadPrec [Side]
readPrec :: ReadPrec Side
$creadPrec :: ReadPrec Side
readList :: ReadS [Side]
$creadList :: ReadS [Side]
readsPrec :: Int -> ReadS Side
$creadsPrec :: Int -> ReadS Side
Read, Int -> Side -> ShowS
[Side] -> ShowS
Side -> WorkspaceId
forall a.
(Int -> a -> ShowS)
-> (a -> WorkspaceId) -> ([a] -> ShowS) -> Show a
showList :: [Side] -> ShowS
$cshowList :: [Side] -> ShowS
show :: Side -> WorkspaceId
$cshow :: Side -> WorkspaceId
showsPrec :: Int -> Side -> ShowS
$cshowsPrec :: Int -> Side -> ShowS
Show, Side -> Side -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Side -> Side -> Bool
$c/= :: Side -> Side -> Bool
== :: Side -> Side -> Bool
$c== :: Side -> Side -> Bool
Eq)
type MaybeManageHook = Query (Maybe (Endo WindowSet))
data Match a = Match Bool a
composeOne :: (Monoid a, Monad m) => [m (Maybe a)] -> m a
composeOne :: forall a (m :: * -> *). (Monoid a, Monad m) => [m (Maybe a)] -> m a
composeOne = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall {m :: * -> *} {b}. Monad m => m (Maybe b) -> m b -> m b
try (forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Monoid a => a
mempty)
where
try :: m (Maybe b) -> m b -> m b
try m (Maybe b)
q m b
z = do
Maybe b
x <- m (Maybe b)
q
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m b
z forall (m :: * -> *) a. Monad m => a -> m a
return Maybe b
x
infixr 0 -?>, -->>, -?>>
(/=?) :: (Eq a, Functor m) => m a -> a -> m Bool
m a
q /=? :: forall a (m :: * -> *). (Eq a, Functor m) => m a -> a -> m Bool
/=? a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. Eq a => a -> a -> Bool
/= a
x) m a
q
(^?) :: (Eq a, Functor m) => m [a] -> [a] -> m Bool
m [a]
q ^? :: forall a (m :: * -> *). (Eq a, Functor m) => m [a] -> [a] -> m Bool
^? [a]
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([a]
x forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) m [a]
q
(~?) :: (Eq a, Functor m) => m [a] -> [a] -> m Bool
m [a]
q ~? :: forall a (m :: * -> *). (Eq a, Functor m) => m [a] -> [a] -> m Bool
~? [a]
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([a]
x forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf`) m [a]
q
($?) :: (Eq a, Functor m) => m [a] -> [a] -> m Bool
m [a]
q $? :: forall a (m :: * -> *). (Eq a, Functor m) => m [a] -> [a] -> m Bool
$? [a]
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([a]
x forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf`) m [a]
q
(<==?) :: (Eq a, Functor m) => m a -> a -> m (Match a)
m a
q <==? :: forall a (m :: * -> *).
(Eq a, Functor m) =>
m a -> a -> m (Match a)
<==? a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {a}. Eq a => a -> a -> Match a
`eq` a
x) m a
q
where
eq :: a -> a -> Match a
eq a
q' a
x' = forall a. Bool -> a -> Match a
Match (a
q' forall a. Eq a => a -> a -> Bool
== a
x') a
q'
(</=?) :: (Eq a, Functor m) => m a -> a -> m (Match a)
m a
q </=? :: forall a (m :: * -> *).
(Eq a, Functor m) =>
m a -> a -> m (Match a)
</=? a
x = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall {a}. Eq a => a -> a -> Match a
`neq` a
x) m a
q
where
neq :: a -> a -> Match a
neq a
q' a
x' = forall a. Bool -> a -> Match a
Match (a
q' forall a. Eq a => a -> a -> Bool
/= a
x') a
q'
(-?>) :: (Functor m, Monad m) => m Bool -> m a -> m (Maybe a)
m Bool
p -?> :: forall (m :: * -> *) a.
(Functor m, Monad m) =>
m Bool -> m a -> m (Maybe a)
-?> m a
f = do
Bool
x <- m Bool
p
if Bool
x then forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just m a
f else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
(-->>) :: (Monoid b, Monad m) => m (Match a) -> (a -> m b) -> m b
m (Match a)
p -->> :: forall b (m :: * -> *) a.
(Monoid b, Monad m) =>
m (Match a) -> (a -> m b) -> m b
-->> a -> m b
f = do
Match Bool
b a
m <- m (Match a)
p
if Bool
b then a -> m b
f a
m else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Monoid a => a
mempty
(-?>>) :: (Functor m, Monad m) => m (Match a) -> (a -> m b) -> m (Maybe b)
m (Match a)
p -?>> :: forall (m :: * -> *) a b.
(Functor m, Monad m) =>
m (Match a) -> (a -> m b) -> m (Maybe b)
-?>> a -> m b
f = do
Match Bool
b a
m <- m (Match a)
p
if Bool
b then forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just (a -> m b
f a
m) else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
currentWs :: Query WorkspaceId
currentWs :: Query WorkspaceId
currentWs = forall a. X a -> Query a
liftX (forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i l a s sd. StackSet i l a s sd -> i
W.currentTag)
windowTag :: Query (Maybe WorkspaceId)
windowTag :: Query (Maybe WorkspaceId)
windowTag = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd. Eq a => a -> StackSet i l a s sd -> Maybe i
W.findTag Window
w
isKDETrayWindow :: Query Bool
isKDETrayWindow :: Query Bool
isKDETrayWindow = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ do
Maybe [CLong]
r <- WorkspaceId -> Window -> X (Maybe [CLong])
getProp32s WorkspaceId
"_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR" Window
w
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe [CLong]
r of
Just [CLong
_] -> Bool
True
Maybe [CLong]
_ -> Bool
False
isInProperty :: String -> String -> Query Bool
isInProperty :: WorkspaceId -> WorkspaceId -> Query Bool
isInProperty WorkspaceId
p WorkspaceId
v = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ do
Window
va <- WorkspaceId -> X Window
getAtom WorkspaceId
v
Maybe [CLong]
r <- WorkspaceId -> Window -> X (Maybe [CLong])
getProp32s WorkspaceId
p Window
w
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ case Maybe [CLong]
r of
Just [CLong]
xs -> forall a b. (Integral a, Num b) => a -> b
fromIntegral Window
va forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [CLong]
xs
Maybe [CLong]
_ -> Bool
False
isFullscreen :: Query Bool
isFullscreen :: Query Bool
isFullscreen = WorkspaceId -> WorkspaceId -> Query Bool
isInProperty WorkspaceId
"_NET_WM_STATE" WorkspaceId
"_NET_WM_STATE_FULLSCREEN"
isMinimized :: Query Bool
isMinimized :: Query Bool
isMinimized = WorkspaceId -> WorkspaceId -> Query Bool
isInProperty WorkspaceId
"_NET_WM_STATE" WorkspaceId
"_NET_WM_STATE_HIDDEN"
isDialog :: Query Bool
isDialog :: Query Bool
isDialog = WorkspaceId -> WorkspaceId -> Query Bool
isInProperty WorkspaceId
"_NET_WM_WINDOW_TYPE" WorkspaceId
"_NET_WM_WINDOW_TYPE_DIALOG"
isNotification :: Query Bool
isNotification :: Query Bool
isNotification =
WorkspaceId -> WorkspaceId -> Query Bool
isInProperty WorkspaceId
"_NET_WM_WINDOW_TYPE" WorkspaceId
"_NET_WM_WINDOW_TYPE_NOTIFICATION"
pid :: Query (Maybe ProcessID)
pid :: Query (Maybe ProcessID)
pid = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ WorkspaceId -> Window -> X (Maybe [CLong])
getProp32s WorkspaceId
"_NET_WM_PID" Window
w forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
Just [CLong
x] -> forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
x)
Maybe [CLong]
_ -> forall a. Maybe a
Nothing
desktop :: Query (Maybe Int)
desktop :: Query (Maybe Int)
desktop = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ WorkspaceId -> Window -> X (Maybe [CLong])
getProp32s WorkspaceId
"_NET_WM_DESKTOP" Window
w forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
Just [CLong
x] -> forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
x)
Maybe [CLong]
_ -> forall a. Maybe a
Nothing
transientTo :: Query (Maybe Window)
transientTo :: Query (Maybe Window)
transientTo = do
Window
w <- forall r (m :: * -> *). MonadReader r m => m r
ask
Display
d <- (forall a. X a -> Query a
liftX forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks) XConf -> Display
display
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Display -> Window -> IO (Maybe Window)
getTransientForHint Display
d Window
w
transience :: MaybeManageHook
transience :: MaybeManageHook
transience = Query (Maybe Window)
transientTo forall a (m :: * -> *).
(Eq a, Functor m) =>
m a -> a -> m (Match a)
</=? forall a. Maybe a
Nothing forall (m :: * -> *) a b.
(Functor m, Monad m) =>
m (Match a) -> (a -> m b) -> m (Maybe b)
-?>> forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
idHook Window -> Query (Endo WindowSet)
doShiftTo
transience' :: ManageHook
transience' :: Query (Endo WindowSet)
transience' = forall a (m :: * -> *). (Monoid a, Functor m) => m (Maybe a) -> m a
maybeToDefinite MaybeManageHook
transience
clientLeader :: Query (Maybe Window)
clientLeader :: Query (Maybe Window)
clientLeader = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ WorkspaceId -> Window -> X (Maybe [CLong])
getProp32s WorkspaceId
"WM_CLIENT_LEADER" Window
w forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
Just [CLong
x] -> forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
x)
Maybe [CLong]
_ -> forall a. Maybe a
Nothing
sameBy :: Eq prop => Query (Maybe prop) -> Query [Window]
sameBy :: forall prop. Eq prop => Query (Maybe prop) -> Query [Window]
sameBy Query (Maybe prop)
prop = Query (Maybe prop)
prop forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe prop
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
Maybe prop
propVal -> forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (WindowSet -> X a) -> X a
withWindowSet forall a b. (a -> b) -> a -> b
$ \WindowSet
s ->
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Maybe prop
propVal forall a. Eq a => a -> a -> Bool
==) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Query a -> Window -> X a
runQuery Query (Maybe prop)
prop) (forall a i l s sd. Eq a => StackSet i l a s sd -> [a]
W.allWindows WindowSet
s forall a. Eq a => [a] -> [a] -> [a]
\\ [Window
w])
shiftToSame :: Eq prop => Query (Maybe prop) -> MaybeManageHook
shiftToSame :: forall prop. Eq prop => Query (Maybe prop) -> MaybeManageHook
shiftToSame Query (Maybe prop)
prop = forall prop. Eq prop => Query (Maybe prop) -> Query [Window]
sameBy Query (Maybe prop)
prop forall a (m :: * -> *).
(Eq a, Functor m) =>
m a -> a -> m (Match a)
</=? [] forall (m :: * -> *) a b.
(Functor m, Monad m) =>
m (Match a) -> (a -> m b) -> m (Maybe b)
-?>> forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
idHook Window -> Query (Endo WindowSet)
doShiftTo forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
listToMaybe
shiftToSame' :: Eq prop => Query (Maybe prop) -> ManageHook
shiftToSame' :: forall prop.
Eq prop =>
Query (Maybe prop) -> Query (Endo WindowSet)
shiftToSame' = forall a (m :: * -> *). (Monoid a, Functor m) => m (Maybe a) -> m a
maybeToDefinite forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall prop. Eq prop => Query (Maybe prop) -> MaybeManageHook
shiftToSame
maybeToDefinite :: (Monoid a, Functor m) => m (Maybe a) -> m a
maybeToDefinite :: forall a (m :: * -> *). (Monoid a, Functor m) => m (Maybe a) -> m a
maybeToDefinite = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. a -> Maybe a -> a
fromMaybe forall a. Monoid a => a
mempty)
doShiftTo :: Window -> ManageHook
doShiftTo :: Window -> Query (Endo WindowSet)
doShiftTo Window
target = forall s. (s -> s) -> Query (Endo s)
doF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {s} {i} {l} {sd}.
(Eq s, Eq i) =>
Window -> StackSet i l Window s sd -> StackSet i l Window s sd
shiftTo forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall r (m :: * -> *). MonadReader r m => m r
ask
where shiftTo :: Window -> StackSet i l Window s sd -> StackSet i l Window s sd
shiftTo Window
w StackSet i l Window s sd
s = forall b a. b -> (a -> b) -> Maybe a -> b
maybe StackSet i l Window s sd
s (\i
t -> forall a s i l sd.
(Ord a, Eq s, Eq i) =>
i -> a -> StackSet i l a s sd -> StackSet i l a s sd
W.shiftWin i
t Window
w StackSet i l Window s sd
s) (forall a i l s sd. Eq a => a -> StackSet i l a s sd -> Maybe i
W.findTag Window
target StackSet i l Window s sd
s)
doRectFloat :: W.RationalRect
-> ManageHook
doRectFloat :: RationalRect -> Query (Endo WindowSet)
doRectFloat RationalRect
r = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall s. (s -> s) -> Query (Endo s)
doF (forall a i l s sd.
Ord a =>
a -> RationalRect -> StackSet i l a s sd -> StackSet i l a s sd
W.float Window
w RationalRect
r)
doFullFloat :: ManageHook
doFullFloat :: Query (Endo WindowSet)
doFullFloat = RationalRect -> Query (Endo WindowSet)
doRectFloat forall a b. (a -> b) -> a -> b
$ Rational -> Rational -> Rational -> Rational -> RationalRect
W.RationalRect Rational
0 Rational
0 Rational
1 Rational
1
doFloatDep :: (W.RationalRect -> W.RationalRect) -> ManageHook
doFloatDep :: (RationalRect -> RationalRect) -> Query (Endo WindowSet)
doFloatDep RationalRect -> RationalRect
move = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall s. (s -> s) -> Query (Endo s)
doF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
Ord a =>
a -> RationalRect -> StackSet i l a s sd -> StackSet i l a s sd
W.float Window
w forall b c a. (b -> c) -> (a -> b) -> a -> c
. RationalRect -> RationalRect
move forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. X a -> Query a
liftX (Window -> X (ScreenId, RationalRect)
floatLocation Window
w)
doFloatAt :: Rational -> Rational -> ManageHook
doFloatAt :: Rational -> Rational -> Query (Endo WindowSet)
doFloatAt Rational
x Rational
y = (RationalRect -> RationalRect) -> Query (Endo WindowSet)
doFloatDep RationalRect -> RationalRect
move
where
move :: RationalRect -> RationalRect
move (W.RationalRect Rational
_ Rational
_ Rational
w Rational
h) = Rational -> Rational -> Rational -> Rational -> RationalRect
W.RationalRect Rational
x Rational
y Rational
w Rational
h
doSideFloat :: Side -> ManageHook
doSideFloat :: Side -> Query (Endo WindowSet)
doSideFloat Side
side = (RationalRect -> RationalRect) -> Query (Endo WindowSet)
doFloatDep RationalRect -> RationalRect
move
where
move :: RationalRect -> RationalRect
move (W.RationalRect Rational
_ Rational
_ Rational
w Rational
h) = Rational -> Rational -> Rational -> Rational -> RationalRect
W.RationalRect Rational
cx Rational
cy Rational
w Rational
h
where cx :: Rational
cx
| Side
side forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Side
SC,Side
C ,Side
NC] = (Rational
1forall a. Num a => a -> a -> a
-Rational
w)forall a. Fractional a => a -> a -> a
/Rational
2
| Side
side forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Side
SW,Side
CW,Side
NW] = Rational
0
| Bool
otherwise = Rational
1forall a. Num a => a -> a -> a
-Rational
w
cy :: Rational
cy
| Side
side forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Side
CE,Side
C ,Side
CW] = (Rational
1forall a. Num a => a -> a -> a
-Rational
h)forall a. Fractional a => a -> a -> a
/Rational
2
| Side
side forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Side
NE,Side
NC,Side
NW] = Rational
0
| Bool
otherwise = Rational
1forall a. Num a => a -> a -> a
-Rational
h
doCenterFloat :: ManageHook
doCenterFloat :: Query (Endo WindowSet)
doCenterFloat = Side -> Query (Endo WindowSet)
doSideFloat Side
C
doHideIgnore :: ManageHook
doHideIgnore :: Query (Endo WindowSet)
doHideIgnore = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX (Window -> X ()
hide Window
w) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall s. (s -> s) -> Query (Endo s)
doF (forall a i l s sd.
Ord a =>
a -> StackSet i l a s sd -> StackSet i l a s sd
W.delete Window
w)
doSink :: ManageHook
doSink :: Query (Endo WindowSet)
doSink = forall s. (s -> s) -> Query (Endo s)
doF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a i l s sd.
Ord a =>
a -> StackSet i l a s sd -> StackSet i l a s sd
W.sink forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall r (m :: * -> *). MonadReader r m => m r
ask
doLower :: ManageHook
doLower :: Query (Endo WindowSet)
doLower = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ forall a. (Display -> X a) -> X a
withDisplay forall a b. (a -> b) -> a -> b
$ \Display
dpy -> forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (Display -> Window -> IO ()
lowerWindow Display
dpy Window
w) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Monoid a => a
mempty
doRaise :: ManageHook
doRaise :: Query (Endo WindowSet)
doRaise = forall r (m :: * -> *). MonadReader r m => m r
ask forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> forall a. X a -> Query a
liftX forall a b. (a -> b) -> a -> b
$ forall a. (Display -> X a) -> X a
withDisplay forall a b. (a -> b) -> a -> b
$ \Display
dpy -> forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (Display -> Window -> IO ()
raiseWindow Display
dpy Window
w) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Monoid a => a
mempty
doFocus :: ManageHook
doFocus :: Query (Endo WindowSet)
doFocus = forall s. (s -> s) -> Query (Endo s)
doF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a i l sd.
(Eq s, Eq a, Eq i) =>
a -> StackSet i l a s sd -> StackSet i l a s sd
W.focusWindow forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall r (m :: * -> *). MonadReader r m => m r
ask