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