In the words of the spec, grabs are meant to fail "if the confine-to window lies completely outside the boundaries of the root window". Redirected windows (and therefore windows with backing store enabled) have a pWin->borderSize that's not clipped to the root window, which means BorderSizeNotEmpty() is always true and the grab will succeed when it oughtn't.
This is a somewhat ugly fix, as it's ignoring whatever was passed to miRegisterRedirectBorderClipProc and assuming composite was the only caller. It's not entirely clear to me why those are registered function pointers instead of just more explicit composite knowledge in mivaltree. Signed-off-by: Adam Jackson <[email protected]> --- dix/events.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/dix/events.c b/dix/events.c index b8c67fd..ac851eb 100644 --- a/dix/events.c +++ b/dix/events.c @@ -133,6 +133,10 @@ typedef const char *string; #include "Xserver-dtrace.h" #endif +#ifdef COMPOSITE +#include "compint.h" +#endif + #include <X11/extensions/XIproto.h> #include <X11/extensions/XI2proto.h> #include <X11/extensions/XI.h> @@ -3619,7 +3623,14 @@ ProcWarpPointer(ClientPtr client) static Bool BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) { - if (RegionNotEmpty(&pWin->borderSize)) + RegionPtr reg = &pWin->borderSize; + +#ifdef COMPOSITE + if (pWin->redirectDraw != RedirectDrawNone) + reg = compGetRedirectBorderClip(pWin); +#endif + + if (RegionNotEmpty(reg)) return TRUE; #ifdef PANORAMIX @@ -3627,8 +3638,15 @@ BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) int i; FOR_NSCREENS_FORWARD_SKIP(i) { - if (RegionNotEmpty - (&pDev->spriteInfo->sprite->windows[i]->borderSize)) + WindowPtr pWin = &pDev->spriteInfo->sprite->windows[i]; + + reg = &pWin->borderSize; +#ifdef COMPOSITE + if (pWin->redirectDraw != RedirectDrawNone) + reg = compGetRedirectBorderClip(pWin); +#endif + + if (RegionNotEmpty(reg)) return TRUE; } } -- 2.0.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
