static int ProcDamageQueryVersion(ClientPtr client) { DamageClientPtr pDamageClient = GetDamageClient (client); xDamageQueryVersionReply rep; register int n; REQUEST(xDamageQueryVersionReq); REQUEST_SIZE_MATCH(xDamageQueryVersionReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; if (stuff->majorVersion < DAMAGE_MAJOR) { rep.majorVersion = stuff->majorVersion; rep.minorVersion = stuff->minorVersion; } else { rep.majorVersion = DAMAGE_MAJOR; if (stuff->majorVersion == DAMAGE_MAJOR && stuff->minorVersion < DAMAGE_MINOR) rep.minorVersion = stuff->minorVersion; else rep.minorVersion = DAMAGE_MINOR; } pDamageClient->major_version = rep.majorVersion; pDamageClient->minor_version = rep.minorVersion; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); swapl(&rep.majorVersion, n); swapl(&rep.minorVersion, n); } WriteToClient(client, sizeof(xDamageQueryVersionReply), (char *)&rep); return(client->noClientException); }
void DamageExtSetCritical (ClientPtr pClient, Bool critical) { DamageClientPtr pDamageClient = GetDamageClient (pClient); if (pDamageClient) pDamageClient->critical += critical ? 1 : -1; }
static void DamageClientCallback(CallbackListPtr *list, pointer closure, pointer data) { NewClientInfoRec *clientinfo = (NewClientInfoRec *) data; ClientPtr pClient = clientinfo->client; DamageClientPtr pDamageClient = GetDamageClient(pClient); pDamageClient->critical = 0; pDamageClient->major_version = 0; pDamageClient->minor_version = 0; }
static void DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes) { ClientPtr pClient = pDamageExt->pClient; DamageClientPtr pDamageClient = GetDamageClient (pClient); DrawablePtr pDrawable = pDamageExt->pDrawable; xDamageNotifyEvent ev; int i; UpdateCurrentTimeIf (); ev.type = DamageEventBase + XDamageNotify; ev.level = pDamageExt->level; ev.sequenceNumber = pClient->sequence; ev.drawable = pDrawable->id; ev.damage = pDamageExt->id; ev.timestamp = currentTime.milliseconds; ev.geometry.x = pDrawable->x; ev.geometry.y = pDrawable->y; ev.geometry.width = pDrawable->width; ev.geometry.height = pDrawable->height; if (pBoxes) { for (i = 0; i < nBoxes; i++) { ev.level = pDamageExt->level; if (i < nBoxes - 1) ev.level |= DamageNotifyMore; ev.area.x = pBoxes[i].x1; ev.area.y = pBoxes[i].y1; ev.area.width = pBoxes[i].x2 - pBoxes[i].x1; ev.area.height = pBoxes[i].y2 - pBoxes[i].y1; if (!pClient->clientGone) WriteEventsToClient (pClient, 1, (xEvent *) &ev); } } else { ev.area.x = 0; ev.area.y = 0; ev.area.width = pDrawable->width; ev.area.height = pDrawable->height; if (!pClient->clientGone) WriteEventsToClient (pClient, 1, (xEvent *) &ev); } /* Composite extension marks clients with manual Subwindows as critical */ if (pDamageClient->critical > 0) { SetCriticalOutputPending (); #ifdef SMART_SCHEDULE pClient->smart_priority = SMART_MAX_PRIORITY; #endif } }
static int ProcDamageDispatch (ClientPtr client) { REQUEST(xDamageReq); DamageClientPtr pDamageClient = GetDamageClient (client); if (pDamageClient->major_version >= NUM_VERSION_REQUESTS) return BadRequest; if (stuff->damageReqType > version_requests[pDamageClient->major_version]) return BadRequest; return (*ProcDamageVector[stuff->damageReqType]) (client); }
static void DamageExtNotify(DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes) { ClientPtr pClient = pDamageExt->pClient; DamageClientPtr pDamageClient = GetDamageClient(pClient); DrawablePtr pDrawable = pDamageExt->pDrawable; xDamageNotifyEvent ev; int i; UpdateCurrentTimeIf(); ev = (xDamageNotifyEvent) { .type = DamageEventBase + XDamageNotify, .level = pDamageExt->level, .drawable = pDamageExt->drawable, .damage = pDamageExt->id, .timestamp = currentTime.milliseconds, .geometry.x = pDrawable->x, .geometry.y = pDrawable->y, .geometry.width = pDrawable->width, .geometry.height = pDrawable->height }; if (pBoxes) { for (i = 0; i < nBoxes; i++) { ev.level = pDamageExt->level; if (i < nBoxes - 1) ev.level |= DamageNotifyMore; ev.area.x = pBoxes[i].x1; ev.area.y = pBoxes[i].y1; ev.area.width = pBoxes[i].x2 - pBoxes[i].x1; ev.area.height = pBoxes[i].y2 - pBoxes[i].y1; WriteEventsToClient(pClient, 1, (xEvent *) &ev); } } else { ev.area.x = 0; ev.area.y = 0; ev.area.width = pDrawable->width; ev.area.height = pDrawable->height; WriteEventsToClient(pClient, 1, (xEvent *) &ev); } /* Composite extension marks clients with manual Subwindows as critical */ if (pDamageClient->critical > 0) { SetCriticalOutputPending(); pClient->smart_priority = SMART_MAX_PRIORITY; } } static void DamageExtReport(DamagePtr pDamage, RegionPtr pRegion, void *closure) { DamageExtPtr pDamageExt = closure; switch (pDamageExt->level) { case DamageReportRawRegion: case DamageReportDeltaRegion: DamageExtNotify(pDamageExt, REGION_RECTS(pRegion), REGION_NUM_RECTS(pRegion)); break; case DamageReportBoundingBox: DamageExtNotify(pDamageExt, REGION_EXTENTS(pRegion), 1); break; case DamageReportNonEmpty: DamageExtNotify(pDamageExt, NullBox, 0); break; case DamageReportNone: break; } }