mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-05-19 11:30:22 -07:00
X.H.ManageDocks: Avoid unnecessary refresh (loop) for decorations
Windows created by X.U.XUtils.createNewWindow have _NET_WM_WINDOW_TYPE = _NET_WM_WINDOW_TYPE_DESKTOP, which caused checkDock to match them and an UpdateDocks event to be sent, causing an additional layout refresh whenever a decoration window appeared. This could in theory lead to a refresh loop with a layout (modifier) that dropped and recreated its decoration windows on every runLayout—which isn't entirely unreasonable, X.L.MouseResizableTile does it, just luckily happens to not mark its windows as _NET_WM_WINDOW_TYPE_DESKTOP. In practice, such a refresh loop could be triggered when buggy X.A.DynamicWorkspaces (before 929a6a3f6f) duplicated a Window in a single workspace's Stack, and buggy X.L.SubLayouts then kept duplicating the duplication (2 → 4 → 8 → …), triggering the creation of new decoration window in each iteration. Fixes: https://github.com/xmonad/xmonad-contrib/issues/565
This commit is contained in:
parent
ee3ea2402d
commit
6a6e4bcce8
@ -148,15 +148,20 @@ requestDockEvents w = whenX (not <$> isClient w) $ withDisplay $ \dpy ->
|
|||||||
withWindowAttributes dpy w $ \attrs -> io $ selectInput dpy w $
|
withWindowAttributes dpy w $ \attrs -> io $ selectInput dpy w $
|
||||||
wa_your_event_mask attrs .|. propertyChangeMask .|. structureNotifyMask
|
wa_your_event_mask attrs .|. propertyChangeMask .|. structureNotifyMask
|
||||||
|
|
||||||
-- | Checks if a window is a DOCK or DESKTOP window
|
-- | Checks if a window is a DOCK or DESKTOP window.
|
||||||
|
-- Ignores xmonad's own windows (usually _NET_WM_WINDOW_TYPE_DESKTOP) to avoid
|
||||||
|
-- unnecessary refreshes.
|
||||||
checkDock :: Query Bool
|
checkDock :: Query Bool
|
||||||
checkDock = ask >>= \w -> liftX $ do
|
checkDock = isDockOrDesktop <&&> (not <$> isXMonad)
|
||||||
dock <- getAtom "_NET_WM_WINDOW_TYPE_DOCK"
|
where
|
||||||
desk <- getAtom "_NET_WM_WINDOW_TYPE_DESKTOP"
|
isDockOrDesktop = ask >>= \w -> liftX $ do
|
||||||
mbr <- getProp32s "_NET_WM_WINDOW_TYPE" w
|
dock <- getAtom "_NET_WM_WINDOW_TYPE_DOCK"
|
||||||
case mbr of
|
desk <- getAtom "_NET_WM_WINDOW_TYPE_DESKTOP"
|
||||||
Just rs -> return $ any ((`elem` [dock,desk]) . fromIntegral) rs
|
mbr <- getProp32s "_NET_WM_WINDOW_TYPE" w
|
||||||
_ -> return False
|
case mbr of
|
||||||
|
Just rs -> return $ any ((`elem` [dock,desk]) . fromIntegral) rs
|
||||||
|
_ -> return False
|
||||||
|
isXMonad = className =? "xmonad"
|
||||||
|
|
||||||
-- | Whenever a new dock appears, refresh the layout immediately to avoid the
|
-- | Whenever a new dock appears, refresh the layout immediately to avoid the
|
||||||
-- new dock.
|
-- new dock.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user