vanadium/xmonad: rewrite dynamic hooks for composability

This commit is contained in:
Primrose 2025-11-18 20:18:16 +08:00
parent 587b4a4e20
commit 9b1399e0e6
Signed by: primrose
GPG key ID: 4E887A4CA9714ADA

View file

@ -148,27 +148,35 @@ myManageHook =
]
<> namedScratchpadManageHook myScratchpads
myEventHandleHook :: Event -> X All
myEventHandleHook =
-- TODO: is there a way to always open certain sites in new windows in firefox?
-- TODO: stop full screen when move happens
onTitleChange $ composeAll
[ isSpotify --> doShiftAndViewIfCurrent multimediaWS
, isYouTube --> doShiftAndViewIfCurrent multimediaWS
, isDiscord --> doShiftAndViewIfCurrent chatWS
, isWhatsApp --> doShiftAndViewIfCurrent chatWS
, isElement --> doShiftAndViewIfCurrent chatWS
]
-- | If the title changes in the background, we don't want to greedy view that workspace.
myEventHandleHook :: Event -> X All
myEventHandleHook =
-- If the title changes in the background, we don't want to greedy view that workspace.
-- Imagine Spotify playing in the background, a track change would focus that workspace.
-- We prevent this by checking if the window is in the current workspace
doShiftAndViewIfCurrent :: WorkspaceId -> Query (Endo WindowSet)
doShiftAndViewIfCurrent n = doF . go =<< ask
onTitleChange
$ (windowIsInCurrentWorkspace -->)
$ composeAll
[ isSpotify --> doShiftAndGreedyView multimediaWS
, isYouTube --> doShiftAndGreedyView multimediaWS
, isDiscord --> doShiftAndGreedyView chatWS
, isWhatsApp --> doShiftAndGreedyView chatWS
, isElement --> doShiftAndGreedyView chatWS
]
doShiftAndGreedyView :: WorkspaceId -> Query (Endo WindowSet)
doShiftAndGreedyView n = doF . go =<< ask
where go :: Window -> WindowSet -> WindowSet
go w s = case W.findTag w s of
Just from | from == W.currentTag s -> W.greedyView n $ W.shiftWin n w s
_ -> s
go w s = W.greedyView n $ W.shiftWin n w s
hasProp :: (Window -> WindowSet -> Bool) -> Query Bool
hasProp f = f <$> ask <*> (liftX $ gets windowset)
windowIsInCurrentWorkspace :: Query Bool
windowIsInCurrentWorkspace = hasProp $ \w s -> case W.findTag w s of
Just from | from == W.currentTag s -> True
_ -> False
myStartupHook :: X ()
myStartupHook = do