📄 shape.c
字号:
rep.boundingShaped = (wBoundingShape(pWin) != 0); rep.clipShaped = (wClipShape(pWin) != 0); if (wBoundingShape(pWin)) { /* this is done in two steps because of a compiler bug on SunOS 4.1.3 */ pExtents = REGION_EXTENTS(pWin->drawable.pScreen, wBoundingShape(pWin)); extents = *pExtents; } else { extents.x1 = -wBorderWidth (pWin); extents.y1 = -wBorderWidth (pWin); extents.x2 = pWin->drawable.width + wBorderWidth (pWin); extents.y2 = pWin->drawable.height + wBorderWidth (pWin); } rep.xBoundingShape = extents.x1; rep.yBoundingShape = extents.y1; rep.widthBoundingShape = extents.x2 - extents.x1; rep.heightBoundingShape = extents.y2 - extents.y1; if (wClipShape(pWin)) { /* this is done in two steps because of a compiler bug on SunOS 4.1.3 */ pExtents = REGION_EXTENTS(pWin->drawable.pScreen, wClipShape(pWin)); extents = *pExtents; } else { extents.x1 = 0; extents.y1 = 0; extents.x2 = pWin->drawable.width; extents.y2 = pWin->drawable.height; } rep.xClipShape = extents.x1; rep.yClipShape = extents.y1; rep.widthClipShape = extents.x2 - extents.x1; rep.heightClipShape = extents.y2 - extents.y1; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); swaps(&rep.xBoundingShape, n); swaps(&rep.yBoundingShape, n); swaps(&rep.widthBoundingShape, n); swaps(&rep.heightBoundingShape, n); swaps(&rep.xClipShape, n); swaps(&rep.yClipShape, n); swaps(&rep.widthClipShape, n); swaps(&rep.heightClipShape, n); } WriteToClient(client, sizeof (xShapeQueryExtentsReply), (char *)&rep); return (client->noClientException);}/*ARGSUSED*/static intShapeFreeClient (data, id) pointer data; XID id;{ ShapeEventPtr pShapeEvent; WindowPtr pWin; ShapeEventPtr *pHead, pCur, pPrev; pShapeEvent = (ShapeEventPtr) data; pWin = pShapeEvent->window; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); if (pHead) { pPrev = 0; for (pCur = *pHead; pCur && pCur != pShapeEvent; pCur=pCur->next) pPrev = pCur; if (pCur) { if (pPrev) pPrev->next = pShapeEvent->next; else *pHead = pShapeEvent->next; } } xfree ((pointer) pShapeEvent); return Success;}/*ARGSUSED*/static intShapeFreeEvents (data, id) pointer data; XID id;{ ShapeEventPtr *pHead, pCur, pNext; pHead = (ShapeEventPtr *) data; for (pCur = *pHead; pCur; pCur = pNext) { pNext = pCur->next; FreeResource (pCur->clientResource, ClientType); xfree ((pointer) pCur); } xfree ((pointer) pHead); return Success;}static intProcShapeSelectInput (client) register ClientPtr client;{ REQUEST(xShapeSelectInputReq); WindowPtr pWin; ShapeEventPtr pShapeEvent, pNewShapeEvent, *pHead; XID clientResource; REQUEST_SIZE_MATCH (xShapeSelectInputReq); pWin = SecurityLookupWindow (stuff->window, client, SecurityWriteAccess); if (!pWin) return BadWindow; pHead = (ShapeEventPtr *)SecurityLookupIDByType(client, pWin->drawable.id, EventType, SecurityWriteAccess); switch (stuff->enable) { case xTrue: if (pHead) { /* check for existing entry. */ for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) return Success; } } /* build the entry */ pNewShapeEvent = (ShapeEventPtr) xalloc (sizeof (ShapeEventRec)); if (!pNewShapeEvent) return BadAlloc; pNewShapeEvent->next = 0; pNewShapeEvent->client = client; pNewShapeEvent->window = pWin; /* * add a resource that will be deleted when * the client goes away */ clientResource = FakeClientID (client->index); pNewShapeEvent->clientResource = clientResource; if (!AddResource (clientResource, ClientType, (pointer)pNewShapeEvent)) return BadAlloc; /* * create a resource to contain a pointer to the list * of clients selecting input. This must be indirect as * the list may be arbitrarily rearranged which cannot be * done through the resource database. */ if (!pHead) { pHead = (ShapeEventPtr *) xalloc (sizeof (ShapeEventPtr)); if (!pHead || !AddResource (pWin->drawable.id, EventType, (pointer)pHead)) { FreeResource (clientResource, RT_NONE); return BadAlloc; } *pHead = 0; } pNewShapeEvent->next = *pHead; *pHead = pNewShapeEvent; break; case xFalse: /* delete the interest */ if (pHead) { pNewShapeEvent = 0; for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) break; pNewShapeEvent = pShapeEvent; } if (pShapeEvent) { FreeResource (pShapeEvent->clientResource, ClientType); if (pNewShapeEvent) pNewShapeEvent->next = pShapeEvent->next; else *pHead = pShapeEvent->next; xfree (pShapeEvent); } } break; default: client->errorValue = stuff->enable; return BadValue; } return Success;}/* * deliver the event */static voidSendShapeNotify (pWin, which) WindowPtr pWin; int which;{ ShapeEventPtr *pHead, pShapeEvent; ClientPtr client; xShapeNotifyEvent se; BoxRec extents; RegionPtr region; BYTE shaped; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); if (!pHead) return; if (which == ShapeBounding) { region = wBoundingShape(pWin); if (region) { extents = *REGION_EXTENTS(pWin->drawable.pScreen, region); shaped = xTrue; } else { extents.x1 = -wBorderWidth (pWin); extents.y1 = -wBorderWidth (pWin); extents.x2 = pWin->drawable.width + wBorderWidth (pWin); extents.y2 = pWin->drawable.height + wBorderWidth (pWin); shaped = xFalse; } } else { region = wClipShape(pWin); if (region) { extents = *REGION_EXTENTS(pWin->drawable.pScreen, region); shaped = xTrue; } else { extents.x1 = 0; extents.y1 = 0; extents.x2 = pWin->drawable.width; extents.y2 = pWin->drawable.height; shaped = xFalse; } } for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { client = pShapeEvent->client; if (client == serverClient || client->clientGone) continue; se.type = ShapeNotify + ShapeEventBase; se.kind = which; se.window = pWin->drawable.id; se.sequenceNumber = client->sequence; se.x = extents.x1; se.y = extents.y1; se.width = extents.x2 - extents.x1; se.height = extents.y2 - extents.y1; se.time = currentTime.milliseconds; se.shaped = shaped; WriteEventsToClient (client, 1, (xEvent *) &se); }}static intProcShapeInputSelected (client) register ClientPtr client;{ REQUEST(xShapeInputSelectedReq); WindowPtr pWin; ShapeEventPtr pShapeEvent, *pHead; int enabled; xShapeInputSelectedReply rep; register int n; REQUEST_SIZE_MATCH (xShapeInputSelectedReq); pWin = LookupWindow (stuff->window, client); if (!pWin) return BadWindow; pHead = (ShapeEventPtr *) SecurityLookupIDByType(client, pWin->drawable.id, EventType, SecurityReadAccess); enabled = xFalse; if (pHead) { for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) { enabled = xTrue; break; } } } rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; rep.enabled = enabled; if (client->swapped) { swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); } WriteToClient (client, sizeof (xShapeInputSelectedReply), (char *) &rep); return (client->noClientException);}static intProcShapeGetRectangles (client) register ClientPtr client;{ REQUEST(xShapeGetRectanglesReq); WindowPtr pWin; xShapeGetRectanglesReply rep; xRectangle *rects; int nrects, i; RegionPtr region; register int n; REQUEST_SIZE_MATCH(xShapeGetRectanglesReq); pWin = LookupWindow (stuff->window, client); if (!pWin) return BadWindow; switch (stuff->kind) { case ShapeBounding: region = wBoundingShape(pWin); break; case ShapeClip: region = wClipShape(pWin); break; default: client->errorValue = stuff->kind; return BadValue; } if (!region) { nrects = 1; rects = (xRectangle *) ALLOCATE_LOCAL (sizeof (xRectangle)); if (!rects) return BadAlloc; switch (stuff->kind) { case ShapeBounding: rects->x = - (int) wBorderWidth (pWin); rects->y = - (int) wBorderWidth (pWin); rects->width = pWin->drawable.width + wBorderWidth (pWin); rects->height = pWin->drawable.height + wBorderWidth (pWin); break; case ShapeClip: rects->x = 0; rects->y = 0; rects->width = pWin->drawable.width; rects->height = pWin->drawable.height; break; } } else { BoxPtr box; nrects = REGION_NUM_RECTS(region); box = REGION_RECTS(region); rects = (xRectangle *) ALLOCATE_LOCAL (nrects * sizeof (xRectangle)); if (!rects && nrects) return BadAlloc; for (i = 0; i < nrects; i++, box++) { rects[i].x = box->x1; rects[i].y = box->y1; rects[i].width = box->x2 - box->x1; rects[i].height = box->y2 - box->y1; } } rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.length = (nrects * sizeof (xRectangle)) >> 2; rep.ordering = YXBanded; rep.nrects = nrects; if (client->swapped) { swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); swapl (&rep.nrects, n); SwapShorts ((short *)rects, (unsigned long)nrects * 4); } WriteToClient (client, sizeof (rep), (char *) &rep); WriteToClient (client, nrects * sizeof (xRectangle), (char *) rects); DEALLOCATE_LOCAL (rects); return client->noClientException;}static intProcShapeDispatch (client) register ClientPtr client;{ REQUEST(xReq); switch (stuff->data) { case X_ShapeQueryVersion: return ProcShapeQueryVersion (client); case X_ShapeRectangles: return ProcShapeRectangles (client); case X_ShapeMask: return ProcShapeMask (client); case X_ShapeCombine: return ProcShapeCombine (client); case X_ShapeOffset: return ProcShapeOffset (client); case X_ShapeQueryExtents: return ProcShapeQueryExtents (client); case X_ShapeSelectInput: return ProcShapeSelectInput (client); case X_ShapeInputSelected: return ProcShapeInputSelected (client); case X_ShapeGetRectangles: return ProcShapeGetRectangles (client); default: return BadRequest; }}static voidSShapeNotifyEvent(from, to) xShapeNotifyEvent *from, *to;{ to->type = from->type; to->kind = from->kind; cpswapl (from->window, to->window); cpswaps (from->sequenceNumber, to->sequenceNumber); cpswaps (from->x, to->x); cpswaps (from->y, to->y); cpswaps (from->width, to->width); cpswaps (from->height, to->height); cpswapl (from->time, to->time); to->shaped = from->shaped;}static intSProcShapeQueryVersion (client) register ClientPtr client;{ register int n; REQUEST (xShapeQueryVersionReq); swaps (&stuff->length, n); return ProcShapeQueryVersion (client);}static intSProcShapeRectangles (client) register ClientPtr client;{ register char n; REQUEST (xShapeRectanglesReq); swaps (&stuff->length, n); REQUEST_AT_LEAST_SIZE (xShapeRectanglesReq); swapl (&stuff->dest, n); swaps (&stuff->xOff, n); swaps (&stuff->yOff, n); SwapRestS(stuff); return ProcShapeRectangles (client);}static intSProcShapeMask (client) register ClientPtr client;{ register char n; REQUEST (xShapeMaskReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeMaskReq); swapl (&stuff->dest, n); swaps (&stuff->xOff, n); swaps (&stuff->yOff, n); swapl (&stuff->src, n); return ProcShapeMask (client);}static intSProcShapeCombine (client) register ClientPtr client;{ register char n; REQUEST (xShapeCombineReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeCombineReq); swapl (&stuff->dest, n); swaps (&stuff->xOff, n); swaps (&stuff->yOff, n); swapl (&stuff->src, n); return ProcShapeCombine (client);}static intSProcShapeOffset (client) register ClientPtr client;{ register char n; REQUEST (xShapeOffsetReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeOffsetReq); swapl (&stuff->dest, n); swaps (&stuff->xOff, n); swaps (&stuff->yOff, n); return ProcShapeOffset (client);}static intSProcShapeQueryExtents (client) register ClientPtr client;{ register char n; REQUEST (xShapeQueryExtentsReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeQueryExtentsReq); swapl (&stuff->window, n); return ProcShapeQueryExtents (client);}static intSProcShapeSelectInput (client) register ClientPtr client;{ register char n; REQUEST (xShapeSelectInputReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeSelectInputReq); swapl (&stuff->window, n); return ProcShapeSelectInput (client);}static intSProcShapeInputSelected (client) register ClientPtr client;{ register int n; REQUEST (xShapeInputSelectedReq); swaps (&stuff->length, n); REQUEST_SIZE_MATCH (xShapeInputSelectedReq); swapl (&stuff->window, n); return ProcShapeInputSelected (client);}static intSProcShapeGetRectangles (client) register ClientPtr client;{ REQUEST(xShapeGetRectanglesReq); register char n; swaps (&stuff->length, n); REQUEST_SIZE_MATCH(xShapeGetRectanglesReq); swapl (&stuff->window, n); return ProcShapeGetRectangles (client);}static intSProcShapeDispatch (client) register ClientPtr client;{ REQUEST(xReq); switch (stuff->data) { case X_ShapeQueryVersion: return SProcShapeQueryVersion (client); case X_ShapeRectangles: return SProcShapeRectangles (client); case X_ShapeMask: return SProcShapeMask (client); case X_ShapeCombine: return SProcShapeCombine (client); case X_ShapeOffset: return SProcShapeOffset (client); case X_ShapeQueryExtents: return SProcShapeQueryExtents (client); case X_ShapeSelectInput: return SProcShapeSelectInput (client); case X_ShapeInputSelected: return SProcShapeInputSelected (client); case X_ShapeGetRectangles: return SProcShapeGetRectangles (client); default: return BadRequest; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -