module XMonad.Hooks.DynamicHooks (
dynamicMasterHook
,addDynamicHook
,updateDynamicHook
,oneShotHook
) where
import XMonad
import XMonad.Prelude
import qualified XMonad.Util.ExtensibleState as XS
data DynamicHooks = DynamicHooks
{ DynamicHooks -> [(Query Bool, ManageHook)]
transients :: [(Query Bool, ManageHook)]
, DynamicHooks -> ManageHook
permanent :: ManageHook }
instance ExtensionClass DynamicHooks where
initialValue :: DynamicHooks
initialValue = [(Query Bool, ManageHook)] -> ManageHook -> DynamicHooks
DynamicHooks [] ManageHook
forall m. Monoid m => m
idHook
dynamicMasterHook :: ManageHook
dynamicMasterHook :: ManageHook
dynamicMasterHook = Query Window
forall r (m :: * -> *). MonadReader r m => m r
ask Query Window -> (Window -> ManageHook) -> ManageHook
forall a b. Query a -> (a -> Query b) -> Query b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Window
w -> X (Endo WindowSet) -> ManageHook
forall a. X a -> Query a
liftX (X (Endo WindowSet) -> ManageHook)
-> X (Endo WindowSet) -> ManageHook
forall a b. (a -> b) -> a -> b
$ do
dh <- X DynamicHooks
forall a (m :: * -> *). (ExtensionClass a, XLike m) => m a
XS.get
(Endo f) <- runQuery (permanent dh) w
ts <- mapM (\(Query Bool
q,ManageHook
a) -> Query Bool -> Window -> X Bool
forall a. Query a -> Window -> X a
runQuery Query Bool
q Window
w X Bool
-> (Bool -> X (Bool, (Query Bool, ManageHook)))
-> X (Bool, (Query Bool, ManageHook))
forall a b. X a -> (a -> X b) -> X b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Bool
x -> (Bool, (Query Bool, ManageHook))
-> X (Bool, (Query Bool, ManageHook))
forall a. a -> X a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
x,(Query Bool
q, ManageHook
a))) (transients dh)
let (ts',nts) = partition fst ts
gs <- mapM (flip runQuery w . snd . snd) ts'
let (Endo g) = fromMaybe (Endo id) $ listToMaybe gs
XS.put $ dh { transients = map snd nts }
return $ Endo $ f . g
addDynamicHook :: ManageHook -> X ()
addDynamicHook :: ManageHook -> X ()
addDynamicHook ManageHook
m = (ManageHook -> ManageHook) -> X ()
updateDynamicHook (ManageHook -> ManageHook -> ManageHook
forall a. Semigroup a => a -> a -> a
<> ManageHook
m)
updateDynamicHook :: (ManageHook -> ManageHook) -> X ()
updateDynamicHook :: (ManageHook -> ManageHook) -> X ()
updateDynamicHook ManageHook -> ManageHook
f = (DynamicHooks -> DynamicHooks) -> X ()
forall a (m :: * -> *).
(ExtensionClass a, XLike m) =>
(a -> a) -> m ()
XS.modify ((DynamicHooks -> DynamicHooks) -> X ())
-> (DynamicHooks -> DynamicHooks) -> X ()
forall a b. (a -> b) -> a -> b
$ \DynamicHooks
dh -> DynamicHooks
dh { permanent = f (permanent dh) }
oneShotHook :: Query Bool -> ManageHook -> X ()
oneShotHook :: Query Bool -> ManageHook -> X ()
oneShotHook Query Bool
q ManageHook
a = (DynamicHooks -> DynamicHooks) -> X ()
forall a (m :: * -> *).
(ExtensionClass a, XLike m) =>
(a -> a) -> m ()
XS.modify ((DynamicHooks -> DynamicHooks) -> X ())
-> (DynamicHooks -> DynamicHooks) -> X ()
forall a b. (a -> b) -> a -> b
$ \DynamicHooks
dh -> DynamicHooks
dh { transients = (q,a):transients dh }