diff options
author | Joel Bosveld <Joel.Bosveld@gmail.com> | 2009-07-10 17:59:43 +0800 |
---|---|---|
committer | Joel Bosveld <Joel.Bosveld@gmail.com> | 2009-07-13 10:58:32 +0800 |
commit | d0493d347ddad3010205e9cffb602848636781d4 (patch) | |
tree | e7b350c02f085ef64e3037b92b272cabe51945db /composite | |
parent | 52142682f62ce7da2f53b6919566712ceeef4b27 (diff) |
composite: correctly handle transformation with redirected windows
Diffstat (limited to 'composite')
-rw-r--r-- | composite/compint.h | 2 | ||||
-rw-r--r-- | composite/compwindow.c | 65 |
2 files changed, 34 insertions, 33 deletions
diff --git a/composite/compint.h b/composite/compint.h index 1027cd722..1978c4347 100644 --- a/composite/compint.h +++ b/composite/compint.h @@ -379,7 +379,6 @@ DeleteWindowNoInputDevices(pointer value, XID wid); Bool CompositeXYParentToChild (WindowPtr pChild, - WindowPtr pParent, int parentX, int parentY, int *childX, @@ -387,7 +386,6 @@ CompositeXYParentToChild (WindowPtr pChild, Bool CompositeXYChildToParent (WindowPtr pChild, - WindowPtr pParent, int childX, int childY, int *parentX, diff --git a/composite/compwindow.c b/composite/compwindow.c index 3e2b5c194..2cbfa835d 100644 --- a/composite/compwindow.c +++ b/composite/compwindow.c @@ -947,7 +947,6 @@ XYMapPoint (CompTriangle *from, Bool CompositeXYParentToChild (WindowPtr pChild, - WindowPtr pParent, int parentX, int parentY, int *childX, @@ -955,10 +954,11 @@ CompositeXYParentToChild (WindowPtr pChild, { CompClientIRWindowPtr cciw = GetCompClientIRWindow (pChild); - if (pParent) + /* Convert to child window coordinates */ + if (pChild->parent) { - parentX -= pParent->drawable.x; - parentY -= pParent->drawable.y; + parentX -= pChild->parent->drawable.x; + parentY -= pChild->parent->drawable.y; } if (cciw && cciw->pInputMesh) @@ -977,6 +977,8 @@ CompositeXYParentToChild (WindowPtr pChild, parentX, parentY, childX, childY); + /* Convert to back to root coordinates + */ *childX += pChild->drawable.x; *childY += pChild->drawable.y; /* There is a mesh and the point was redirected, @@ -990,6 +992,8 @@ CompositeXYParentToChild (WindowPtr pChild, } } + /* Convert back to root window coordinates + */ if (pChild->parent) { parentX += pChild->parent->drawable.x; @@ -1012,7 +1016,6 @@ CompositeXYParentToChild (WindowPtr pChild, Bool CompositeXYChildToParent (WindowPtr pChild, - WindowPtr pParent, int childX, int childY, int *parentX, @@ -1040,10 +1043,10 @@ CompositeXYChildToParent (WindowPtr pChild, childX, childY, parentX, parentY); - if (pParent) + if (pChild->parent) { - *parentX += pParent->drawable.x; - *parentY += pParent->drawable.y; + *parentX += pChild->parent->drawable.x; + *parentY += pChild->parent->drawable.y; } /* There is a mesh and the point was redirected, * handle as normal @@ -1060,18 +1063,6 @@ CompositeXYChildToParent (WindowPtr pChild, childX += pChild->drawable.x; childY += pChild->drawable.y; - /* Convert to redirected parents coordinates */ - if (pChild->parent) - { - childX -= pChild->parent->drawable.x; - childY -= pChild->parent->drawable.y; - } - if (pParent) - { - childX += pParent->drawable.x; - childY += pParent->drawable.y; - } - *parentX = childX; *parentY = childY; @@ -1101,9 +1092,15 @@ CompositeXYScreenToWindowRootCoordinate (WindowPtr pWin, } else { - WindowPtr pParent = CompositeGetUnredirectedWindowInput (pDev, pWin->parent); - CompositeXYScreenToWindowRootCoordinate (pParent, pDev, x, y, &x, &y); - CompositeXYParentToChild (pWin, pParent, x, y, rootX, rootY); + WindowPtr pUnredirect = + CompositeGetUnredirectedWindowInput (pDev, pWin); + CompositeXYScreenToWindowRootCoordinate (pUnredirect->parent, pDev, + x, y, &x, &y); + CompositeXYParentToChild (pUnredirect, x, y, rootX, rootY); + *rootX -= pUnredirect->drawable.x; + *rootY -= pUnredirect->drawable.y; + *rootX += pWin->drawable.x; + *rootY += pWin->drawable.y; } } @@ -1122,9 +1119,14 @@ CompositeXYScreenFromWindowRootCoordinate (WindowPtr pWin, } else { - WindowPtr pParent = CompositeGetUnredirectedWindowInput (pDev, pWin->parent); - CompositeXYChildToParent (pWin, pParent, x, y, &x, &y); - CompositeXYScreenFromWindowRootCoordinate (pParent, pDev, + WindowPtr pUnredirect = + CompositeGetUnredirectedWindowInput (pDev, pWin); + x -= pWin->drawable.x; + y -= pWin->drawable.y; + x += pUnredirect->drawable.x; + y += pUnredirect->drawable.y; + CompositeXYChildToParent (pUnredirect, x, y, &x, &y); + CompositeXYScreenFromWindowRootCoordinate (pUnredirect->parent, pDev, x, y, screenX, screenY); } } @@ -1245,19 +1247,20 @@ CompositeGetRedirectedWindowInput (DeviceIntPtr pDev, { CompClientIRWindowPtr cciw = GetCompClientIRWindow (pWin); - if (pDev->deviceGrab.grab) - return CompositeGetUnredirectedWindowInput (pDev, pWin); - + /* During a grab we don't want to update the unredirectedWindow, but just + * keep using the one that was being used when grab activated + */ if (cciw && cciw->pDest) { CompIRWindowPtr ciw = GetCompIRWindow (cciw->pDest); - ciw->unredirectedWindow[pDev->id] = pWin; + if (!pDev->deviceGrab.grab) + ciw->unredirectedWindow[pDev->id] = pWin; return cciw->pDest; } else { CompIRWindowPtr ciw = GetCompIRWindow (pWin); - if (ciw) + if (ciw && !pDev->deviceGrab.grab) ciw->unredirectedWindow[pDev->id] = NULL; return pWin; } |