Ignore docks and desktop windows
authorJoachim Breitner <mail@joachim-breitner.de>
Wed, 1 Jan 2014 14:40:04 +0000 (14:40 +0000)
committerJoachim Breitner <mail@joachim-breitner.de>
Wed, 1 Jan 2014 14:40:04 +0000 (14:40 +0000)
This resolves #2.

src/Capture/X11.hs

index c9efe8c..b4e7bc7 100644 (file)
@@ -55,7 +55,7 @@ captureData = do
         p <- getWindowProperty32 dpy a rwin
 
         wins <- case p of
-                Just wins -> return (map fromIntegral wins)
+                Just wins -> filterM (isInteresting dpy) (map fromIntegral wins)
                 Nothing   -> return []
 
         (fsubwin,_) <- getInputFocus dpy
@@ -86,6 +86,17 @@ followTreeUntil dpy cond = go
                               if p == 0 then return w
                                         else go p 
 
+-- | Ignore, for example, Desktop and Docks windows
+isInteresting :: Display -> Window -> IO Bool
+isInteresting d w = do
+    a <- internAtom d "_NET_WM_WINDOW_TYPE" False
+    dock <- internAtom d "_NET_WM_WINDOW_TYPE_DOCK" False
+    desk <- internAtom d "_NET_WM_WINDOW_TYPE_DESKTOP" False
+    mbr <- getWindowProperty32 d a w
+    case mbr of
+        Just [r] -> return $ fromIntegral r `notElem` [dock, desk]
+        _        -> return True
+
 -- | better than fetchName from X11, as it supports _NET_WM_NAME and unicode
 --
 -- Code taken from XMonad.Managehook.title