summaryrefslogtreecommitdiff
path: root/composite
diff options
context:
space:
mode:
authorJoel Bosveld <Joel.Bosveld@gmail.com>2009-07-10 17:59:43 +0800
committerJoel Bosveld <Joel.Bosveld@gmail.com>2009-07-13 10:58:32 +0800
commitd0493d347ddad3010205e9cffb602848636781d4 (patch)
treee7b350c02f085ef64e3037b92b272cabe51945db /composite
parent52142682f62ce7da2f53b6919566712ceeef4b27 (diff)
composite: correctly handle transformation with redirected windows
Diffstat (limited to 'composite')
-rw-r--r--composite/compint.h2
-rw-r--r--composite/compwindow.c65
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;
}