From 7986238a42c1100084e1f5525b42b8cecc30634a Mon Sep 17 00:00:00 2001 From: Lukas Mai Date: Tue, 11 Dec 2007 19:30:40 +0100 Subject: new XMonad.Hooks.ManageHelpers module darcs-hash:20071211183040-462cf-f8e47e21202ddcc60bde210469693fe70d08c337.gz --- XMonad/Hooks/ManageHelpers.hs | 86 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 XMonad/Hooks/ManageHelpers.hs (limited to 'XMonad') diff --git a/XMonad/Hooks/ManageHelpers.hs b/XMonad/Hooks/ManageHelpers.hs new file mode 100644 index 0000000..df94cdd --- /dev/null +++ b/XMonad/Hooks/ManageHelpers.hs @@ -0,0 +1,86 @@ +----------------------------------------------------------------------------- +-- | +-- Module : XMonad.Hooks.ManageHelpers +-- Copyright : (c) Lukas Mai +-- License : BSD +-- +-- Maintainer : Lukas Mai +-- Stability : unstable +-- Portability : unportable +-- +-- This module provides helper functions to be used in @manageHook@. Here's how you +-- might use this: +-- +-- > import XMonad.Hooks.ManageHelpers +-- > main = +-- > xmonad defaultConfig{ +-- > ... +-- > manageHook = composeOne [ +-- > isKDETrayWindow -?> doIgnore, +-- > transience, +-- > resource =? "stalonetray" -?> doIgnore +-- > ], +-- > ... +-- > } + +module XMonad.Hooks.ManageHelpers ( + composeOne, + (-?>), + isKDETrayWindow, + transience, + transience' +) where + +import XMonad +import qualified XMonad.StackSet as W + +import Data.Maybe +import Data.Monoid + +-- | An alternative 'ManageHook' composer. Unlike 'composeAll' it stops as soon as +-- a candidate returns a 'Just' value, effectively running only the first match +-- (whereas 'composeAll' continues and executes all matching rules). +composeOne :: [Query (Maybe (Endo WindowSet))] -> ManageHook +composeOne = foldr try idHook + where + try q z = do + x <- q + case x of + Just h -> return h + Nothing -> z + +infixr 0 -?> +-- | A helper operator for use in 'composeOne'. It takes a condition and an action; +-- if the condition fails, it returns 'Nothing' from the 'Query' so 'composeOne' will +-- go on and try the next rule. +(-?>) :: Query Bool -> Query (Endo WindowSet) -> Query (Maybe (Endo WindowSet)) +p -?> f = do + x <- p + if x then fmap Just f else return Nothing + +-- | A predicate to check whether a window is a KDE system tray icon. +isKDETrayWindow :: Query Bool +isKDETrayWindow = ask >>= \w -> liftX $ do + dpy <- asks display + kde_tray <- getAtom "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR" + r <- io $ getWindowProperty32 dpy kde_tray w + return $ case r of + Just [_] -> True + _ -> False + +-- | A special rule that moves transient windows to the workspace of their +-- associated primary windows. +transience :: Query (Maybe (Endo WindowSet)) +transience = do + w <- ask + d <- (liftX . asks) display + x <- liftIO $ getTransientForHint d w + case x of + Nothing -> return Nothing + Just w' -> do + return . Just . Endo $ \s -> + maybe s (`W.shift` s) (W.findTag w' s) + +-- | Like 'transience' but with a type that can be used in 'composeAll'. +transience' :: ManageHook +transience' = fmap (fromMaybe mempty) transience -- cgit v1.2.3