aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--XMonad/Hooks/ManageHelpers.hs86
-rw-r--r--xmonad-contrib.cabal1
2 files changed, 87 insertions, 0 deletions
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 <l.mai@web.de>
+-- 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
diff --git a/xmonad-contrib.cabal b/xmonad-contrib.cabal
index 6798108..2410c11 100644
--- a/xmonad-contrib.cabal
+++ b/xmonad-contrib.cabal
@@ -79,6 +79,7 @@ library
XMonad.Hooks.DynamicLog
XMonad.Hooks.EwmhDesktops
XMonad.Hooks.ManageDocks
+ XMonad.Hooks.ManageHelpers
XMonad.Hooks.SetWMName
XMonad.Hooks.UrgencyHook
XMonad.Hooks.XPropManage