⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shape.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -