XShape.c revision caade7cc
101e04c3fSmrg/* 201e04c3fSmrg * $Xorg: XShape.c,v 1.4 2001/02/09 02:03:49 xorgcvs Exp $ 301e04c3fSmrg * 401e04c3fSmrgCopyright 1989, 1998 The Open Group 501e04c3fSmrg 601e04c3fSmrgPermission to use, copy, modify, distribute, and sell this software and its 701e04c3fSmrgdocumentation for any purpose is hereby granted without fee, provided that 801e04c3fSmrgthe above copyright notice appear in all copies and that both that 901e04c3fSmrgcopyright notice and this permission notice appear in supporting 1001e04c3fSmrgdocumentation. 1101e04c3fSmrg 1201e04c3fSmrgThe above copyright notice and this permission notice shall be included in 1301e04c3fSmrgall copies or substantial portions of the Software. 1401e04c3fSmrg 1501e04c3fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1601e04c3fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1701e04c3fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1801e04c3fSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 1901e04c3fSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2001e04c3fSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2101e04c3fSmrg 2201e04c3fSmrgExcept as contained in this notice, the name of The Open Group shall not be 2301e04c3fSmrgused in advertising or otherwise to promote the sale, use or other dealings 2401e04c3fSmrgin this Software without prior written authorization from The Open Group. 2501e04c3fSmrg * 2601e04c3fSmrg * Author: Keith Packard, MIT X Consortium 2701e04c3fSmrg */ 2801e04c3fSmrg/* $XFree86: xc/lib/Xext/XShape.c,v 1.3 2002/10/16 00:37:27 dawes Exp $ */ 2901e04c3fSmrg#define NEED_EVENTS 307ec681f3Smrg#define NEED_REPLIES 317ec681f3Smrg#ifdef HAVE_CONFIG_H 327ec681f3Smrg#include <config.h> 337ec681f3Smrg#endif 347ec681f3Smrg#include <X11/Xlibint.h> 357ec681f3Smrg#include <X11/Xutil.h> 367ec681f3Smrg#include <X11/Xregion.h> 377ec681f3Smrg#include <X11/extensions/Xext.h> 387ec681f3Smrg#include <X11/extensions/extutil.h> 397ec681f3Smrg#include <X11/extensions/shapestr.h> 407ec681f3Smrg 4101e04c3fSmrgstatic XExtensionInfo _shape_info_data; 4201e04c3fSmrgstatic XExtensionInfo *shape_info = &_shape_info_data; 4301e04c3fSmrgstatic /* const */ char *shape_extension_name = SHAPENAME; 4401e04c3fSmrg 4501e04c3fSmrg#define ShapeCheckExtension(dpy,i,val) \ 467e102996Smaya XextCheckExtension (dpy, i, shape_extension_name, val) 4701e04c3fSmrg#define ShapeSimpleCheckExtension(dpy,i) \ 4801e04c3fSmrg XextSimpleCheckExtension (dpy, i, shape_extension_name) 4901e04c3fSmrg 5001e04c3fSmrg 5101e04c3fSmrg/***************************************************************************** 5201e04c3fSmrg * * 5301e04c3fSmrg * private utility routines * 5401e04c3fSmrg * * 5501e04c3fSmrg *****************************************************************************/ 5601e04c3fSmrg 5701e04c3fSmrgstatic int close_display(Display *dpy, XExtCodes *codes); 5801e04c3fSmrgstatic Bool wire_to_event (Display *dpy, XEvent *re, xEvent *event); 597ec681f3Smrgstatic Status event_to_wire (Display *dpy, XEvent *re, xEvent *event); 6001e04c3fSmrgstatic /* const */ XExtensionHooks shape_extension_hooks = { 6101e04c3fSmrg NULL, /* create_gc */ 6201e04c3fSmrg NULL, /* copy_gc */ 6301e04c3fSmrg NULL, /* flush_gc */ 6401e04c3fSmrg NULL, /* free_gc */ 6501e04c3fSmrg NULL, /* create_font */ 6601e04c3fSmrg NULL, /* free_font */ 6701e04c3fSmrg close_display, /* close_display */ 687ec681f3Smrg wire_to_event, /* wire_to_event */ 6901e04c3fSmrg event_to_wire, /* event_to_wire */ 7001e04c3fSmrg NULL, /* error */ 7101e04c3fSmrg NULL, /* error_string */ 7201e04c3fSmrg}; 737ec681f3Smrg 747ec681f3Smrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, shape_info, 757ec681f3Smrg shape_extension_name, 767ec681f3Smrg &shape_extension_hooks, 777ec681f3Smrg ShapeNumberEvents, NULL) 787ec681f3Smrg 7901e04c3fSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, shape_info) 8001e04c3fSmrg 8101e04c3fSmrg 8201e04c3fSmrgstatic Bool 8301e04c3fSmrgwire_to_event (Display *dpy, XEvent *re, xEvent *event) 8401e04c3fSmrg{ 8501e04c3fSmrg XExtDisplayInfo *info = find_display (dpy); 8601e04c3fSmrg XShapeEvent *se; 8701e04c3fSmrg xShapeNotifyEvent *sevent; 8801e04c3fSmrg 897ec681f3Smrg ShapeCheckExtension (dpy, info, False); 907ec681f3Smrg 9101e04c3fSmrg switch ((event->u.u.type & 0x7f) - info->codes->first_event) { 9201e04c3fSmrg case ShapeNotify: 9301e04c3fSmrg se = (XShapeEvent *) re; 9401e04c3fSmrg sevent = (xShapeNotifyEvent *) event; 9501e04c3fSmrg se->type = sevent->type & 0x7f; 9601e04c3fSmrg se->serial = _XSetLastRequestRead(dpy,(xGenericReply *) event); 9701e04c3fSmrg se->send_event = (sevent->type & 0x80) != 0; 9801e04c3fSmrg se->display = dpy; 997ec681f3Smrg se->window = sevent->window; 10001e04c3fSmrg se->kind = sevent->kind; 10101e04c3fSmrg se->x = cvtINT16toInt (sevent->x); 1027ec681f3Smrg se->y = cvtINT16toInt (sevent->y); 1037ec681f3Smrg se->width = sevent->width; 1047ec681f3Smrg se->height = sevent->height; 1057ec681f3Smrg se->time = sevent->time; 1067ec681f3Smrg se->shaped = True; 1077e102996Smaya if (sevent->shaped == xFalse) 1087e102996Smaya se->shaped = False; 1097e102996Smaya return True; 1107e102996Smaya } 1117e102996Smaya return False; 1127e102996Smaya} 1137e102996Smaya 1147e102996Smayastatic Status 1157e102996Smayaevent_to_wire (Display *dpy, XEvent *re, xEvent *event) 1167e102996Smaya{ 1177e102996Smaya XExtDisplayInfo *info = find_display (dpy); 11801e04c3fSmrg XShapeEvent *se; 1197e102996Smaya xShapeNotifyEvent *sevent; 12001e04c3fSmrg 12101e04c3fSmrg ShapeCheckExtension (dpy, info, 0); 1227e102996Smaya 12301e04c3fSmrg switch ((re->type & 0x7f) - info->codes->first_event) { 1247ec681f3Smrg case ShapeNotify: 1257ec681f3Smrg se = (XShapeEvent *) re; 1267ec681f3Smrg sevent = (xShapeNotifyEvent *) event; 1277ec681f3Smrg sevent->type = se->type | (se->send_event ? 0x80 : 0); 1287ec681f3Smrg sevent->sequenceNumber = se->serial & 0xffff; 1297ec681f3Smrg sevent->window = se->window; 1307ec681f3Smrg sevent->kind = se->kind; 1317ec681f3Smrg sevent->x = se->x; 1327ec681f3Smrg sevent->y = se->y; 1337ec681f3Smrg sevent->width = se->width; 1347ec681f3Smrg sevent->height = se->height; 1357ec681f3Smrg sevent->time = se->time; 1367ec681f3Smrg return 1; 1377ec681f3Smrg } 1387ec681f3Smrg return 0; 1397ec681f3Smrg} 1407ec681f3Smrg 1417ec681f3Smrg 1427ec681f3Smrg/**************************************************************************** 1437ec681f3Smrg * * 1447ec681f3Smrg * Shape public interfaces * 1457ec681f3Smrg * * 1467ec681f3Smrg ****************************************************************************/ 1477ec681f3Smrg 1487ec681f3SmrgBool XShapeQueryExtension (Display *dpy, int *event_basep, int *error_basep) 1497ec681f3Smrg{ 1507ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 1517ec681f3Smrg 1527ec681f3Smrg if (XextHasExtension(info)) { 1537ec681f3Smrg *event_basep = info->codes->first_event; 1547ec681f3Smrg *error_basep = info->codes->first_error; 1557ec681f3Smrg return True; 1567ec681f3Smrg } else { 1577ec681f3Smrg return False; 1587ec681f3Smrg } 1597ec681f3Smrg} 1607ec681f3Smrg 1617ec681f3Smrg 1627ec681f3SmrgStatus XShapeQueryVersion( 1637ec681f3Smrg Display *dpy, 1647ec681f3Smrg int *major_versionp, 1657ec681f3Smrg int *minor_versionp) 1667ec681f3Smrg{ 1677ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 1687ec681f3Smrg xShapeQueryVersionReply rep; 1697ec681f3Smrg register xShapeQueryVersionReq *req; 1707ec681f3Smrg 1717ec681f3Smrg ShapeCheckExtension (dpy, info, 0); 1727ec681f3Smrg 1737ec681f3Smrg LockDisplay (dpy); 1747ec681f3Smrg GetReq (ShapeQueryVersion, req); 1757ec681f3Smrg req->reqType = info->codes->major_opcode; 1767ec681f3Smrg req->shapeReqType = X_ShapeQueryVersion; 1777ec681f3Smrg if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { 1787ec681f3Smrg UnlockDisplay (dpy); 1797ec681f3Smrg SyncHandle (); 1807ec681f3Smrg return 0; 1817ec681f3Smrg } 1827ec681f3Smrg *major_versionp = rep.majorVersion; 1837ec681f3Smrg *minor_versionp = rep.minorVersion; 1847ec681f3Smrg UnlockDisplay (dpy); 1857ec681f3Smrg SyncHandle (); 1867ec681f3Smrg return 1; 1877ec681f3Smrg} 1887ec681f3Smrg 1897ec681f3Smrgvoid XShapeCombineRegion( 1907ec681f3Smrg register Display *dpy, 1917ec681f3Smrg Window dest, 1927ec681f3Smrg int destKind, int xOff, int yOff, 1937ec681f3Smrg register REGION *r, 1947ec681f3Smrg int op) 1957ec681f3Smrg{ 1967ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 1977ec681f3Smrg register xShapeRectanglesReq *req; 1987ec681f3Smrg register long nbytes; 1997ec681f3Smrg register int i; 2007ec681f3Smrg register XRectangle *xr, *pr; 2017ec681f3Smrg register BOX *pb; 2027ec681f3Smrg 2037ec681f3Smrg ShapeSimpleCheckExtension (dpy, info); 2047ec681f3Smrg 2057ec681f3Smrg LockDisplay(dpy); 2067ec681f3Smrg GetReq(ShapeRectangles, req); 2077ec681f3Smrg xr = (XRectangle *) 2087ec681f3Smrg _XAllocScratch(dpy, (unsigned long)(r->numRects * sizeof (XRectangle))); 2097ec681f3Smrg for (pr = xr, pb = r->rects, i = r->numRects; --i >= 0; pr++, pb++) { 2107ec681f3Smrg pr->x = pb->x1; 2117ec681f3Smrg pr->y = pb->y1; 2127ec681f3Smrg pr->width = pb->x2 - pb->x1; 2137ec681f3Smrg pr->height = pb->y2 - pb->y1; 2147ec681f3Smrg } 2157ec681f3Smrg req->reqType = info->codes->major_opcode; 2167ec681f3Smrg req->shapeReqType = X_ShapeRectangles; 2177ec681f3Smrg req->op = op; 2187ec681f3Smrg req->ordering = YXBanded; 2197ec681f3Smrg req->destKind = destKind; 2207ec681f3Smrg req->dest = dest; 2217ec681f3Smrg req->xOff = xOff; 2227ec681f3Smrg req->yOff = yOff; 2237ec681f3Smrg 2247ec681f3Smrg /* SIZEOF(xRectangle) will be a multiple of 4 */ 2257ec681f3Smrg req->length += r->numRects * (SIZEOF(xRectangle) / 4); 2267ec681f3Smrg 2277ec681f3Smrg nbytes = r->numRects * sizeof(xRectangle); 2287ec681f3Smrg 2297ec681f3Smrg Data16 (dpy, (short *) xr, nbytes); 2307ec681f3Smrg UnlockDisplay(dpy); 2317ec681f3Smrg SyncHandle(); 2327ec681f3Smrg} 2337ec681f3Smrg 2347ec681f3Smrg 2357ec681f3Smrgvoid XShapeCombineRectangles ( 2367ec681f3Smrg register Display *dpy, 2377ec681f3Smrg XID dest, 2387ec681f3Smrg int destKind, int xOff, int yOff, 2397ec681f3Smrg XRectangle *rects, 2407ec681f3Smrg int n_rects, 2417ec681f3Smrg int op, int ordering) 2427ec681f3Smrg{ 2437ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 2447ec681f3Smrg register xShapeRectanglesReq *req; 2457ec681f3Smrg register long nbytes; 2467ec681f3Smrg 2477ec681f3Smrg ShapeSimpleCheckExtension (dpy, info); 2487ec681f3Smrg 2497ec681f3Smrg LockDisplay(dpy); 2507ec681f3Smrg GetReq(ShapeRectangles, req); 2517ec681f3Smrg req->reqType = info->codes->major_opcode; 2527ec681f3Smrg req->shapeReqType = X_ShapeRectangles; 2537ec681f3Smrg req->op = op; 2547ec681f3Smrg req->ordering = ordering; 2557ec681f3Smrg req->destKind = destKind; 2567ec681f3Smrg req->dest = dest; 25701e04c3fSmrg req->xOff = xOff; 25801e04c3fSmrg req->yOff = yOff; 2597ec681f3Smrg 2607ec681f3Smrg /* SIZEOF(xRectangle) will be a multiple of 4 */ 2617ec681f3Smrg req->length += n_rects * (SIZEOF(xRectangle) / 4); 2627ec681f3Smrg 26301e04c3fSmrg nbytes = n_rects * sizeof(xRectangle); 26401e04c3fSmrg 2657e102996Smaya Data16 (dpy, (short *) rects, nbytes); 2667e102996Smaya UnlockDisplay(dpy); 2677ec681f3Smrg SyncHandle(); 2687e102996Smaya} 2697ec681f3Smrg 27001e04c3fSmrg 27101e04c3fSmrgvoid XShapeCombineMask ( 27201e04c3fSmrg register Display *dpy, 2737ec681f3Smrg XID dest, 2747ec681f3Smrg int destKind, 2757ec681f3Smrg int xOff, int yOff, 27601e04c3fSmrg Pixmap src, 27701e04c3fSmrg int op) 27801e04c3fSmrg{ 27901e04c3fSmrg XExtDisplayInfo *info = find_display (dpy); 28001e04c3fSmrg register xShapeMaskReq *req; 28101e04c3fSmrg 28201e04c3fSmrg ShapeSimpleCheckExtension (dpy, info); 2837ec681f3Smrg 2847ec681f3Smrg LockDisplay(dpy); 28501e04c3fSmrg GetReq(ShapeMask, req); 2867e102996Smaya req->reqType = info->codes->major_opcode; 2877e102996Smaya req->shapeReqType = X_ShapeMask; 2887ec681f3Smrg req->op = op; 2897e102996Smaya req->destKind = destKind; 2907ec681f3Smrg req->dest = dest; 29101e04c3fSmrg req->xOff = xOff; 2927ec681f3Smrg req->yOff = yOff; 2937ec681f3Smrg req->src = src; 2947ec681f3Smrg UnlockDisplay(dpy); 2957ec681f3Smrg SyncHandle(); 2967ec681f3Smrg} 2977ec681f3Smrg 2987ec681f3Smrgvoid XShapeCombineShape ( 2997ec681f3Smrg register Display *dpy, 3007ec681f3Smrg XID dest, 3017ec681f3Smrg int destKind, 3027ec681f3Smrg int xOff, int yOff, 3037ec681f3Smrg XID src, 3047ec681f3Smrg int srcKind, 3057ec681f3Smrg int op) 3067ec681f3Smrg{ 3077ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 30801e04c3fSmrg register xShapeCombineReq *req; 30901e04c3fSmrg 31001e04c3fSmrg ShapeSimpleCheckExtension (dpy, info); 31101e04c3fSmrg 31201e04c3fSmrg LockDisplay(dpy); 31301e04c3fSmrg GetReq(ShapeCombine, req); 31401e04c3fSmrg req->reqType = info->codes->major_opcode; 31501e04c3fSmrg req->shapeReqType = X_ShapeCombine; 31601e04c3fSmrg req->op = op; 3177ec681f3Smrg req->destKind = destKind; 3187ec681f3Smrg req->srcKind = srcKind; 3197ec681f3Smrg req->dest = dest; 3207ec681f3Smrg req->xOff = xOff; 3217ec681f3Smrg req->yOff = yOff; 3227ec681f3Smrg req->src = src; 3237ec681f3Smrg UnlockDisplay(dpy); 3247ec681f3Smrg SyncHandle(); 3257ec681f3Smrg} 3267ec681f3Smrg 3277ec681f3Smrgvoid XShapeOffsetShape ( 3287ec681f3Smrg register Display *dpy, 3297ec681f3Smrg XID dest, 3307ec681f3Smrg int destKind, 3317ec681f3Smrg int xOff, int yOff) 3327ec681f3Smrg{ 3337ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 3347ec681f3Smrg register xShapeOffsetReq *req; 3357ec681f3Smrg 33601e04c3fSmrg ShapeSimpleCheckExtension (dpy, info); 33701e04c3fSmrg 33801e04c3fSmrg LockDisplay(dpy); 33901e04c3fSmrg GetReq(ShapeOffset, req); 3407ec681f3Smrg req->reqType = info->codes->major_opcode; 3417ec681f3Smrg req->shapeReqType = X_ShapeOffset; 3427ec681f3Smrg req->destKind = destKind; 3437ec681f3Smrg req->dest = dest; 3447ec681f3Smrg req->xOff = xOff; 3457ec681f3Smrg req->yOff = yOff; 3467ec681f3Smrg UnlockDisplay(dpy); 34701e04c3fSmrg SyncHandle(); 34801e04c3fSmrg} 34901e04c3fSmrg 35001e04c3fSmrgStatus XShapeQueryExtents ( 3517ec681f3Smrg register Display *dpy, 3527ec681f3Smrg Window window, 35301e04c3fSmrg int *bShaped, int *xbs, int *ybs, unsigned int *wbs, unsigned int *hbs, /* RETURN */ 35401e04c3fSmrg int *cShaped, int *xcs, int *ycs, unsigned int *wcs, unsigned int *hcs /* RETURN */) 35501e04c3fSmrg{ 35601e04c3fSmrg XExtDisplayInfo *info = find_display (dpy); 35701e04c3fSmrg xShapeQueryExtentsReply rep; 35801e04c3fSmrg register xShapeQueryExtentsReq *req; 35901e04c3fSmrg 36001e04c3fSmrg ShapeCheckExtension (dpy, info, 0); 36101e04c3fSmrg 3627ec681f3Smrg LockDisplay (dpy); 3637ec681f3Smrg GetReq (ShapeQueryExtents, req); 3647ec681f3Smrg req->reqType = info->codes->major_opcode; 3657ec681f3Smrg req->shapeReqType = X_ShapeQueryExtents; 3667ec681f3Smrg req->window = window; 3677ec681f3Smrg if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { 36801e04c3fSmrg UnlockDisplay (dpy); 36901e04c3fSmrg SyncHandle (); 37001e04c3fSmrg return 0; 37101e04c3fSmrg } 37201e04c3fSmrg *bShaped = rep.boundingShaped; 3737ec681f3Smrg *cShaped = rep.clipShaped; 37401e04c3fSmrg *xbs = cvtINT16toInt (rep.xBoundingShape); 37501e04c3fSmrg *ybs = cvtINT16toInt (rep.yBoundingShape); 3767ec681f3Smrg *wbs = rep.widthBoundingShape; 3777ec681f3Smrg *hbs = rep.heightBoundingShape; 37801e04c3fSmrg *xcs = cvtINT16toInt (rep.xClipShape); 37901e04c3fSmrg *ycs = cvtINT16toInt (rep.yClipShape); 38001e04c3fSmrg *wcs = rep.widthClipShape; 38101e04c3fSmrg *hcs = rep.heightClipShape; 38201e04c3fSmrg UnlockDisplay (dpy); 38301e04c3fSmrg SyncHandle (); 38401e04c3fSmrg return 1; 38501e04c3fSmrg} 38601e04c3fSmrg 38701e04c3fSmrg 38801e04c3fSmrgvoid XShapeSelectInput ( 38901e04c3fSmrg register Display *dpy, 3907ec681f3Smrg Window window, 3917ec681f3Smrg unsigned long mask) 3927ec681f3Smrg{ 3937ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 39401e04c3fSmrg register xShapeSelectInputReq *req; 3957ec681f3Smrg 3967ec681f3Smrg ShapeSimpleCheckExtension (dpy, info); 39701e04c3fSmrg 39801e04c3fSmrg LockDisplay (dpy); 39901e04c3fSmrg GetReq (ShapeSelectInput, req); 40001e04c3fSmrg req->reqType = info->codes->major_opcode; 40101e04c3fSmrg req->shapeReqType = X_ShapeSelectInput; 40201e04c3fSmrg req->window = window; 40301e04c3fSmrg if (mask & ShapeNotifyMask) 40401e04c3fSmrg req->enable = xTrue; 40501e04c3fSmrg else 40601e04c3fSmrg req->enable = xFalse; 40701e04c3fSmrg UnlockDisplay (dpy); 40801e04c3fSmrg SyncHandle (); 40901e04c3fSmrg} 41001e04c3fSmrg 41101e04c3fSmrgunsigned long XShapeInputSelected (register Display *dpy, Window window) 41201e04c3fSmrg{ 41301e04c3fSmrg XExtDisplayInfo *info = find_display (dpy); 41401e04c3fSmrg register xShapeInputSelectedReq *req; 41501e04c3fSmrg xShapeInputSelectedReply rep; 41601e04c3fSmrg 4177ec681f3Smrg ShapeCheckExtension (dpy, info, False); 4187ec681f3Smrg 4197ec681f3Smrg LockDisplay (dpy); 4207ec681f3Smrg GetReq (ShapeInputSelected, req); 42101e04c3fSmrg req->reqType = info->codes->major_opcode; 42201e04c3fSmrg req->shapeReqType = X_ShapeInputSelected; 42301e04c3fSmrg req->window = window; 42401e04c3fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { 42501e04c3fSmrg UnlockDisplay (dpy); 42601e04c3fSmrg SyncHandle (); 42701e04c3fSmrg return False; 4287ec681f3Smrg } 4297ec681f3Smrg UnlockDisplay (dpy); 4307ec681f3Smrg SyncHandle (); 4317ec681f3Smrg return rep.enabled ? ShapeNotifyMask : 0L; 4327ec681f3Smrg} 4337ec681f3Smrg 4347ec681f3Smrg 4357ec681f3SmrgXRectangle *XShapeGetRectangles ( 4367ec681f3Smrg register Display *dpy, 4377ec681f3Smrg Window window, 4387ec681f3Smrg int kind, 4397ec681f3Smrg int *count, /* RETURN */ 4407ec681f3Smrg int *ordering /* RETURN */) 44101e04c3fSmrg{ 4427ec681f3Smrg XExtDisplayInfo *info = find_display (dpy); 4437ec681f3Smrg register xShapeGetRectanglesReq *req; 4447ec681f3Smrg xShapeGetRectanglesReply rep; 4457ec681f3Smrg XRectangle *rects; 4467ec681f3Smrg xRectangle *xrects; 4477ec681f3Smrg int i; 44801e04c3fSmrg 44901e04c3fSmrg ShapeCheckExtension (dpy, info, (XRectangle *)NULL); 45001e04c3fSmrg 45101e04c3fSmrg LockDisplay (dpy); 45201e04c3fSmrg GetReq (ShapeGetRectangles, req); 45301e04c3fSmrg req->reqType = info->codes->major_opcode; 45401e04c3fSmrg req->shapeReqType = X_ShapeGetRectangles; 45501e04c3fSmrg req->window = window; 45601e04c3fSmrg req->kind = kind; 45701e04c3fSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) { 45801e04c3fSmrg UnlockDisplay (dpy); 45901e04c3fSmrg SyncHandle (); 46001e04c3fSmrg return (XRectangle *)NULL; 46101e04c3fSmrg } 46201e04c3fSmrg *count = rep.nrects; 4637ec681f3Smrg *ordering = rep.ordering; 4647ec681f3Smrg rects = NULL; 4657ec681f3Smrg if (*count) { 4667ec681f3Smrg xrects = (xRectangle *) Xmalloc (*count * sizeof (xRectangle)); 4677ec681f3Smrg rects = (XRectangle *) Xmalloc (*count * sizeof (XRectangle)); 4687ec681f3Smrg if (!xrects || !rects) { 4697ec681f3Smrg if (xrects) 4707ec681f3Smrg Xfree (xrects); 4717ec681f3Smrg if (rects) 4727ec681f3Smrg Xfree (rects); 4737ec681f3Smrg _XEatData (dpy, *count * sizeof (xRectangle)); 4747ec681f3Smrg rects = NULL; 4757ec681f3Smrg *count = 0; 4767ec681f3Smrg } else { 4777ec681f3Smrg _XRead (dpy, (char *) xrects, *count * sizeof (xRectangle)); 4787ec681f3Smrg for (i = 0; i < *count; i++) { 4797ec681f3Smrg rects[i].x = (short) cvtINT16toInt (xrects[i].x); 4807ec681f3Smrg rects[i].y = (short) cvtINT16toInt (xrects[i].y); 4817ec681f3Smrg rects[i].width = xrects[i].width; 4827ec681f3Smrg rects[i].height = xrects[i].height; 4837ec681f3Smrg } 4847ec681f3Smrg Xfree (xrects); 4857ec681f3Smrg } 4867ec681f3Smrg } 4877ec681f3Smrg UnlockDisplay (dpy); 4887ec681f3Smrg SyncHandle (); 4897ec681f3Smrg return rects; 4907ec681f3Smrg} 4917ec681f3Smrg