From 11e0d683af31b1a79d2585cf814a9912377753cd Mon Sep 17 00:00:00 2001
From: Kurnevsky Evgeny <kurnevsky@gmail.com>
Date: Tue, 8 Dec 2015 23:42:21 +0300
Subject: [PATCH] UpdatePointer bugfix.

---
 XMonad/Actions/UpdatePointer.hs | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/XMonad/Actions/UpdatePointer.hs b/XMonad/Actions/UpdatePointer.hs
index 8dbf5b61..4a218505 100644
--- a/XMonad/Actions/UpdatePointer.hs
+++ b/XMonad/Actions/UpdatePointer.hs
@@ -1,7 +1,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  XMonadContrib.UpdatePointer
--- Copyright   :  (c) Robert Marlow <robreim@bobturf.org>
+-- Copyright   :  (c) Robert Marlow <robreim@bobturf.org>, 2015 Evgeny Kurnevsky
 -- License     :  BSD3-style (see LICENSE)
 --
 -- Maintainer  :  Robert Marlow <robreim@bobturf.org>
@@ -28,6 +28,7 @@ import Control.Arrow
 import Control.Monad
 import XMonad.StackSet (member, peek, screenDetail, current)
 import Data.Maybe
+import qualified Foreign as Foreign (peek, alloca)
 
 -- $usage
 -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
@@ -63,9 +64,15 @@ updatePointer :: (Rational, Rational) -> (Rational, Rational) -> X ()
 updatePointer refPos ratio = do
   ws <- gets windowset
   dpy <- asks display
+  let defaultRect = screenRect $ screenDetail $ current ws
   rect <- case peek ws of
-        Nothing -> return $ (screenRect . screenDetail .current) ws
-        Just w  -> windowAttributesToRectangle `fmap` io (getWindowAttributes dpy w)
+        Nothing -> return defaultRect
+        Just w  -> do -- We can't use just getWindowAttributes here bacause
+                      -- the window might be closed.
+                      maybeAttributes <- io $ getWindowAttributesMaybe dpy w
+                      return $ case maybeAttributes of
+                        Nothing         -> defaultRect
+                        Just attributes -> windowAttributesToRectangle attributes
   root <- asks theRoot
   mouseIsMoving <- asks mouseFocused
   (_sameRoot,_,currentWindow,rootX,rootY,_,_,_) <- io $ queryPointer dpy root
@@ -89,6 +96,13 @@ updatePointer refPos ratio = do
         (round . clip boundsX $ fi rootX)
         (round . clip boundsY $ fi rootY)
 
+getWindowAttributesMaybe :: Display -> Window -> IO (Maybe WindowAttributes)
+getWindowAttributesMaybe d w = Foreign.alloca $ \p -> do
+    status <- xGetWindowAttributes d w p
+    if status /= 0
+      then fmap Just $ Foreign.peek p
+      else return Nothing
+
 windowAttributesToRectangle :: WindowAttributes -> Rectangle
 windowAttributesToRectangle wa = Rectangle (fi (wa_x wa))
                                            (fi (wa_y wa))