diff options
author | marha <marha@users.sourceforge.net> | 2014-10-12 21:11:32 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2014-10-12 21:38:35 +0200 |
commit | 1a83b8e49a75e2dab63805de25e384e0e38c27ed (patch) | |
tree | 5280fe2a1bd2ce227e4bce9ce06134986e181de1 /xorg-server/dix/dispatch.c | |
parent | 4aea4b223604c589828beb1145875a5fbcc41eed (diff) | |
parent | 9480392b8817f8bfa79cbc694ff039a73fc0a57f (diff) | |
download | vcxsrv-1a83b8e49a75e2dab63805de25e384e0e38c27ed.tar.gz vcxsrv-1a83b8e49a75e2dab63805de25e384e0e38c27ed.tar.bz2 vcxsrv-1a83b8e49a75e2dab63805de25e384e0e38c27ed.zip |
Merge remote-tracking branch 'origin/released'
Conflicts:
mesalib/src/glsl/glsl_symbol_table.h
mesalib/src/mesa/drivers/common/meta_blit.c
xorg-server/dix/dispatch.c
xorg-server/glx/indirect_dispatch.c
xorg-server/glx/indirect_dispatch_swap.c
xorg-server/mi/miexpose.c
Diffstat (limited to 'xorg-server/dix/dispatch.c')
-rwxr-xr-x | xorg-server/dix/dispatch.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/xorg-server/dix/dispatch.c b/xorg-server/dix/dispatch.c index f6ed81302..36f9418ca 100755 --- a/xorg-server/dix/dispatch.c +++ b/xorg-server/dix/dispatch.c @@ -1643,6 +1643,52 @@ ProcClearToBackground(ClientPtr client) return Success;
}
+/* send GraphicsExpose events, or a NoExpose event, based on the region */
+void
+SendGraphicsExpose(ClientPtr client, RegionPtr pRgn, XID drawable,
+ int major, int minor)
+{
+ if (pRgn && !RegionNil(pRgn)) {
+ xEvent *pEvent;
+ xEvent *pe;
+ BoxPtr pBox;
+ int i;
+ int numRects;
+
+ numRects = RegionNumRects(pRgn);
+ pBox = RegionRects(pRgn);
+ if (!(pEvent = calloc(numRects, sizeof(xEvent))))
+ return;
+ pe = pEvent;
+
+ for (i = 1; i <= numRects; i++, pe++, pBox++) {
+ pe->u.u.type = GraphicsExpose;
+ pe->u.graphicsExposure.drawable = drawable;
+ pe->u.graphicsExposure.x = pBox->x1;
+ pe->u.graphicsExposure.y = pBox->y1;
+ pe->u.graphicsExposure.width = pBox->x2 - pBox->x1;
+ pe->u.graphicsExposure.height = pBox->y2 - pBox->y1;
+ pe->u.graphicsExposure.count = numRects - i;
+ pe->u.graphicsExposure.majorEvent = major;
+ pe->u.graphicsExposure.minorEvent = minor;
+ }
+ /* GraphicsExpose is a "critical event", which TryClientEvents
+ * handles specially. */
+ TryClientEvents(client, NULL, pEvent, numRects,
+ (Mask) 0, NoEventMask, NullGrab);
+ free(pEvent);
+ }
+ else {
+ xEvent event = {
+ .u.noExposure.drawable = drawable,
+ .u.noExposure.majorEvent = major,
+ .u.noExposure.minorEvent = minor
+ };
+ event.u.u.type = NoExpose;
+ WriteEventsToClient(client, 1, &event);
+ }
+}
+
int
ProcCopyArea(ClientPtr client)
{
@@ -1674,8 +1720,7 @@ ProcCopyArea(ClientPtr client) stuff->width, stuff->height,
stuff->dstX, stuff->dstY);
if (pGC->graphicsExposures) {
- (*pDst->pScreen->SendGraphicsExpose)
- (client, pRgn, stuff->dstDrawable, X_CopyArea, 0);
+ SendGraphicsExpose(client, pRgn, stuff->dstDrawable, X_CopyArea, 0);
if (pRgn)
RegionDestroy(pRgn);
}
@@ -1722,8 +1767,7 @@ ProcCopyPlane(ClientPtr client) stuff->srcY, stuff->width, stuff->height,
stuff->dstX, stuff->dstY, stuff->bitPlane);
if (pGC->graphicsExposures) {
- (*pdstDraw->pScreen->SendGraphicsExpose)
- (client, pRgn, stuff->dstDrawable, X_CopyPlane, 0);
+ SendGraphicsExpose(client, pRgn, stuff->dstDrawable, X_CopyPlane, 0);
if (pRgn)
RegionDestroy(pRgn);
}
|