diff options
author | marha <marha@users.sourceforge.net> | 2012-09-24 08:28:39 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2012-09-24 08:28:39 +0200 |
commit | 0ebcd32e91486caccc041c8ca23e39e160b24702 (patch) | |
tree | 50cd0bc17e8a587fdbecdf52be48fe8c59e222b9 /xorg-server/miext/damage/damage.c | |
parent | 06d4ea68085558b94d8e9c937091e7b7fcc5d95a (diff) | |
download | vcxsrv-0ebcd32e91486caccc041c8ca23e39e160b24702.tar.gz vcxsrv-0ebcd32e91486caccc041c8ca23e39e160b24702.tar.bz2 vcxsrv-0ebcd32e91486caccc041c8ca23e39e160b24702.zip |
mesa pixman xserver git update 24 sep 2012
xserver: 7722bcbab2507d263c7685b15cccbfdd52fc3a24
pixman: c4b69e706e63e01fbc70e0026c2079007c89de14
mesa: c432c86e6aeebeb46c028af940224c59faa16e88
Diffstat (limited to 'xorg-server/miext/damage/damage.c')
-rw-r--r-- | xorg-server/miext/damage/damage.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/xorg-server/miext/damage/damage.c b/xorg-server/miext/damage/damage.c index 2d2b4228f..a98c20ec0 100644 --- a/xorg-server/miext/damage/damage.c +++ b/xorg-server/miext/damage/damage.c @@ -436,9 +436,13 @@ damageCreateGC(GCPtr pGC) static void damageValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) { + drawableDamage(pDrawable); DAMAGE_GC_FUNC_PROLOGUE(pGC); (*pGC->funcs->ValidateGC) (pGC, changes, pDrawable); - pGCPriv->ops = pGC->ops; /* just so it's not NULL */ + if (pDamage) + pGCPriv->ops = pGC->ops; /* so it's not NULL, so FUNC_EPILOGUE does work */ + else + pGCPriv->ops = NULL; DAMAGE_GC_FUNC_EPILOGUE(pGC); } @@ -1663,14 +1667,38 @@ miDamageCreate(DamagePtr pDamage) { } +/* + * We only wrap into the GC when there's a registered listener. For windows, + * damage includes damage to children. So if there's a GC validated against + * a subwindow and we then register a damage on the parent, we need to bump + * the serial numbers of the children to re-trigger validation. + * + * Since we can't know if a GC has been validated against one of the affected + * children, just bump them all to be safe. + */ +static int +damageRegisterVisit(WindowPtr pWin, void *data) +{ + pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER; + return WT_WALKCHILDREN; +} + void miDamageRegister(DrawablePtr pDrawable, DamagePtr pDamage) { + if (pDrawable->type == DRAWABLE_WINDOW) + TraverseTree((WindowPtr)pDrawable, damageRegisterVisit, NULL); + else + pDrawable->serialNumber = NEXT_SERIAL_NUMBER; } void miDamageUnregister(DrawablePtr pDrawable, DamagePtr pDamage) { + if (pDrawable->type == DRAWABLE_WINDOW) + TraverseTree((WindowPtr)pDrawable, damageRegisterVisit, NULL); + else + pDrawable->serialNumber = NEXT_SERIAL_NUMBER; } void |