2006-11-26 11:13:41 -07:00
|
|
|
/*
|
2010-07-27 13:02:24 -06:00
|
|
|
* Copyright © 2006 Sun Microsystems, Inc. All rights reserved.
|
2006-11-26 11:13:41 -07:00
|
|
|
*
|
2010-07-27 13:02:24 -06:00
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
2006-11-26 11:13:41 -07:00
|
|
|
*
|
2010-07-27 13:02:24 -06:00
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
* DEALINGS IN THE SOFTWARE.
|
2006-11-26 11:13:41 -07:00
|
|
|
*
|
|
|
|
* Copyright © 2003 Keith Packard
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
* the above copyright notice appear in all copies and that both that
|
|
|
|
* copyright notice and this permission notice appear in supporting
|
|
|
|
* documentation, and that the name of Keith Packard not be used in
|
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
|
|
* specific, written prior permission. Keith Packard makes no
|
|
|
|
* representations about the suitability of this software for any purpose. It
|
|
|
|
* is provided "as is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_DIX_CONFIG_H
|
|
|
|
#include <dix-config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "compint.h"
|
2008-11-02 08:26:08 -07:00
|
|
|
#include "xace.h"
|
2010-07-27 13:02:24 -06:00
|
|
|
#include "protocol-versions.h"
|
2007-11-24 10:55:21 -07:00
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
static CARD8 CompositeReqCode;
|
2010-12-05 08:36:02 -07:00
|
|
|
static DevPrivateKeyRec CompositeClientPrivateKeyRec;
|
|
|
|
#define CompositeClientPrivateKey (&CompositeClientPrivateKeyRec)
|
2006-11-26 11:13:41 -07:00
|
|
|
RESTYPE CompositeClientWindowType;
|
|
|
|
RESTYPE CompositeClientSubwindowsType;
|
2009-09-06 13:44:18 -06:00
|
|
|
RESTYPE CompositeClientOverlayType;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
typedef struct _CompositeClient {
|
|
|
|
int major_version;
|
|
|
|
int minor_version;
|
|
|
|
} CompositeClientRec, *CompositeClientPtr;
|
|
|
|
|
2008-11-02 08:26:08 -07:00
|
|
|
#define GetCompositeClient(pClient) ((CompositeClientPtr) \
|
|
|
|
dixLookupPrivate(&(pClient)->devPrivates, CompositeClientPrivateKey))
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
CompositeClientCallback (CallbackListPtr *list,
|
|
|
|
pointer closure,
|
|
|
|
pointer data)
|
|
|
|
{
|
|
|
|
NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
|
|
|
|
ClientPtr pClient = clientinfo->client;
|
|
|
|
CompositeClientPtr pCompositeClient = GetCompositeClient (pClient);
|
|
|
|
|
|
|
|
pCompositeClient->major_version = 0;
|
|
|
|
pCompositeClient->minor_version = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
FreeCompositeClientWindow (pointer value, XID ccwid)
|
|
|
|
{
|
|
|
|
WindowPtr pWin = value;
|
|
|
|
|
|
|
|
compFreeClientWindow (pWin, ccwid);
|
|
|
|
return Success;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
FreeCompositeClientSubwindows (pointer value, XID ccwid)
|
|
|
|
{
|
|
|
|
WindowPtr pWin = value;
|
|
|
|
|
|
|
|
compFreeClientSubwindows (pWin, ccwid);
|
|
|
|
return Success;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
FreeCompositeClientOverlay (pointer value, XID ccwid)
|
|
|
|
{
|
|
|
|
CompOverlayClientPtr pOc = (CompOverlayClientPtr) value;
|
|
|
|
|
2009-09-06 13:44:18 -06:00
|
|
|
compFreeOverlayClient (pOc);
|
2006-11-26 11:13:41 -07:00
|
|
|
return Success;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeQueryVersion (ClientPtr client)
|
|
|
|
{
|
|
|
|
CompositeClientPtr pCompositeClient = GetCompositeClient (client);
|
|
|
|
xCompositeQueryVersionReply rep;
|
|
|
|
register int n;
|
|
|
|
REQUEST(xCompositeQueryVersionReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
|
|
|
|
rep.type = X_Reply;
|
|
|
|
rep.length = 0;
|
|
|
|
rep.sequenceNumber = client->sequence;
|
2010-07-27 13:02:24 -06:00
|
|
|
if (stuff->majorVersion < SERVER_COMPOSITE_MAJOR_VERSION) {
|
2006-11-26 11:13:41 -07:00
|
|
|
rep.majorVersion = stuff->majorVersion;
|
|
|
|
rep.minorVersion = stuff->minorVersion;
|
|
|
|
} else {
|
2010-07-27 13:02:24 -06:00
|
|
|
rep.majorVersion = SERVER_COMPOSITE_MAJOR_VERSION;
|
|
|
|
rep.minorVersion = SERVER_COMPOSITE_MINOR_VERSION;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
pCompositeClient->major_version = rep.majorVersion;
|
|
|
|
pCompositeClient->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(xCompositeQueryVersionReply), (char *)&rep);
|
2010-12-05 08:36:02 -07:00
|
|
|
return Success;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
#define VERIFY_WINDOW(pWindow, wid, client, mode) \
|
|
|
|
do { \
|
|
|
|
int err; \
|
|
|
|
err = dixLookupResourceByType((pointer *) &pWindow, wid, \
|
|
|
|
RT_WINDOW, client, mode); \
|
2010-12-05 08:36:02 -07:00
|
|
|
if (err != Success) { \
|
2010-07-27 13:02:24 -06:00
|
|
|
client->errorValue = wid; \
|
|
|
|
return err; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
static int
|
|
|
|
ProcCompositeRedirectWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
REQUEST(xCompositeRedirectWindowReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client,
|
|
|
|
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
return compRedirectWindow (client, pWin, stuff->update);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeRedirectSubwindows (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
REQUEST(xCompositeRedirectSubwindowsReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client,
|
|
|
|
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
return compRedirectSubwindows (client, pWin, stuff->update);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeUnredirectWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
REQUEST(xCompositeUnredirectWindowReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client,
|
|
|
|
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
return compUnredirectWindow (client, pWin, stuff->update);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeUnredirectSubwindows (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
REQUEST(xCompositeUnredirectSubwindowsReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client,
|
|
|
|
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
return compUnredirectSubwindows (client, pWin, stuff->update);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeCreateRegionFromBorderClip (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
CompWindowPtr cw;
|
|
|
|
RegionPtr pBorderClip, pRegion;
|
|
|
|
REQUEST(xCompositeCreateRegionFromBorderClipReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
|
2006-11-26 11:13:41 -07:00
|
|
|
LEGAL_NEW_RESOURCE (stuff->region, client);
|
|
|
|
|
|
|
|
cw = GetCompWindow (pWin);
|
|
|
|
if (cw)
|
|
|
|
pBorderClip = &cw->borderClip;
|
|
|
|
else
|
|
|
|
pBorderClip = &pWin->borderClip;
|
|
|
|
pRegion = XFixesRegionCopy (pBorderClip);
|
|
|
|
if (!pRegion)
|
|
|
|
return BadAlloc;
|
2010-12-05 08:36:02 -07:00
|
|
|
RegionTranslate(pRegion, -pWin->drawable.x, -pWin->drawable.y);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
if (!AddResource (stuff->region, RegionResType, (pointer) pRegion))
|
|
|
|
return BadAlloc;
|
|
|
|
|
2010-12-05 08:36:02 -07:00
|
|
|
return Success;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeNameWindowPixmap (ClientPtr client)
|
|
|
|
{
|
|
|
|
WindowPtr pWin;
|
|
|
|
CompWindowPtr cw;
|
|
|
|
PixmapPtr pPixmap;
|
2008-11-02 08:26:08 -07:00
|
|
|
int rc;
|
2006-11-26 11:13:41 -07:00
|
|
|
REQUEST(xCompositeNameWindowPixmapReq);
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
|
2007-03-03 04:09:19 -07:00
|
|
|
|
|
|
|
if (!pWin->viewable)
|
|
|
|
return BadMatch;
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
LEGAL_NEW_RESOURCE (stuff->pixmap, client);
|
|
|
|
|
|
|
|
cw = GetCompWindow (pWin);
|
|
|
|
if (!cw)
|
|
|
|
return BadMatch;
|
|
|
|
|
|
|
|
pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
|
|
|
|
if (!pPixmap)
|
|
|
|
return BadMatch;
|
|
|
|
|
2008-11-02 08:26:08 -07:00
|
|
|
/* security creation/labeling check */
|
|
|
|
rc = XaceHook(XACE_RESOURCE_ACCESS, client, stuff->pixmap, RT_PIXMAP,
|
|
|
|
pPixmap, RT_WINDOW, pWin, DixCreateAccess);
|
|
|
|
if (rc != Success)
|
|
|
|
return rc;
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
++pPixmap->refcnt;
|
2008-11-02 08:26:08 -07:00
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!AddResource (stuff->pixmap, RT_PIXMAP, (pointer) pPixmap))
|
|
|
|
return BadAlloc;
|
|
|
|
|
2010-12-05 08:36:02 -07:00
|
|
|
return Success;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int
|
2006-11-26 11:13:41 -07:00
|
|
|
ProcCompositeGetOverlayWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
REQUEST(xCompositeGetOverlayWindowReq);
|
|
|
|
xCompositeGetOverlayWindowReply rep;
|
|
|
|
WindowPtr pWin;
|
|
|
|
ScreenPtr pScreen;
|
|
|
|
CompScreenPtr cs;
|
|
|
|
CompOverlayClientPtr pOc;
|
2008-11-02 08:26:08 -07:00
|
|
|
int rc;
|
2006-11-26 11:13:41 -07:00
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
|
2006-11-26 11:13:41 -07:00
|
|
|
pScreen = pWin->drawable.pScreen;
|
|
|
|
|
2009-09-06 13:44:18 -06:00
|
|
|
/*
|
|
|
|
* Create an OverlayClient structure to mark this client's
|
|
|
|
* interest in the overlay window
|
|
|
|
*/
|
|
|
|
pOc = compCreateOverlayClient(pScreen, client);
|
|
|
|
if (pOc == NULL)
|
|
|
|
return BadAlloc;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Make sure the overlay window exists
|
|
|
|
*/
|
2006-11-26 11:13:41 -07:00
|
|
|
cs = GetCompScreen(pScreen);
|
2009-09-06 13:44:18 -06:00
|
|
|
if (cs->pOverlayWin == NULL)
|
|
|
|
if (!compCreateOverlayWindow(pScreen))
|
|
|
|
{
|
|
|
|
FreeResource (pOc->resource, RT_NONE);
|
2006-11-26 11:13:41 -07:00
|
|
|
return BadAlloc;
|
|
|
|
}
|
2008-11-02 08:26:08 -07:00
|
|
|
|
|
|
|
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cs->pOverlayWin->drawable.id,
|
|
|
|
RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL, DixGetAttrAccess);
|
|
|
|
if (rc != Success)
|
2009-09-06 13:44:18 -06:00
|
|
|
{
|
|
|
|
FreeResource (pOc->resource, RT_NONE);
|
2008-11-02 08:26:08 -07:00
|
|
|
return rc;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
rep.type = X_Reply;
|
|
|
|
rep.sequenceNumber = client->sequence;
|
|
|
|
rep.length = 0;
|
|
|
|
rep.overlayWin = cs->pOverlayWin->drawable.id;
|
|
|
|
|
|
|
|
if (client->swapped)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
swaps(&rep.sequenceNumber, n);
|
|
|
|
swapl(&rep.length, n);
|
|
|
|
swapl(&rep.overlayWin, n);
|
|
|
|
}
|
|
|
|
(void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
|
|
|
|
|
2010-12-05 08:36:02 -07:00
|
|
|
return Success;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int
|
2006-11-26 11:13:41 -07:00
|
|
|
ProcCompositeReleaseOverlayWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
REQUEST(xCompositeReleaseOverlayWindowReq);
|
|
|
|
WindowPtr pWin;
|
|
|
|
ScreenPtr pScreen;
|
|
|
|
CompOverlayClientPtr pOc;
|
|
|
|
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
|
2010-07-27 13:02:24 -06:00
|
|
|
VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess);
|
2006-11-26 11:13:41 -07:00
|
|
|
pScreen = pWin->drawable.pScreen;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Has client queried a reference to the overlay window
|
|
|
|
* on this screen? If not, generate an error.
|
|
|
|
*/
|
2009-09-06 13:44:18 -06:00
|
|
|
pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
|
|
|
|
if (pOc == NULL)
|
2006-11-26 11:13:41 -07:00
|
|
|
return BadMatch;
|
|
|
|
|
|
|
|
/* The delete function will free the client structure */
|
2009-09-06 13:44:18 -06:00
|
|
|
FreeResource (pOc->resource, RT_NONE);
|
2006-11-26 11:13:41 -07:00
|
|
|
|
2010-12-05 08:36:02 -07:00
|
|
|
return Success;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int (*ProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
|
2006-11-26 11:13:41 -07:00
|
|
|
ProcCompositeQueryVersion,
|
|
|
|
ProcCompositeRedirectWindow,
|
|
|
|
ProcCompositeRedirectSubwindows,
|
|
|
|
ProcCompositeUnredirectWindow,
|
|
|
|
ProcCompositeUnredirectSubwindows,
|
|
|
|
ProcCompositeCreateRegionFromBorderClip,
|
|
|
|
ProcCompositeNameWindowPixmap,
|
|
|
|
ProcCompositeGetOverlayWindow,
|
|
|
|
ProcCompositeReleaseOverlayWindow,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
ProcCompositeDispatch (ClientPtr client)
|
|
|
|
{
|
|
|
|
REQUEST(xReq);
|
|
|
|
|
|
|
|
if (stuff->data < CompositeNumberRequests)
|
|
|
|
return (*ProcCompositeVector[stuff->data]) (client);
|
|
|
|
else
|
|
|
|
return BadRequest;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeQueryVersion (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeQueryVersionReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeQueryVersionReq);
|
|
|
|
swapl(&stuff->majorVersion, n);
|
|
|
|
swapl(&stuff->minorVersion, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeRedirectWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeRedirectWindowReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeRedirectSubwindows (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeRedirectSubwindowsReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeUnredirectWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeUnredirectWindowReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeUnredirectSubwindows (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeUnredirectSubwindowsReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeCreateRegionFromBorderClip (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeCreateRegionFromBorderClipReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq);
|
|
|
|
swapl (&stuff->region, n);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeNameWindowPixmap (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeNameWindowPixmapReq);
|
|
|
|
|
|
|
|
swaps(&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
|
|
|
|
swapl (&stuff->window, n);
|
|
|
|
swapl (&stuff->pixmap, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int
|
2006-11-26 11:13:41 -07:00
|
|
|
SProcCompositeGetOverlayWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeGetOverlayWindowReq);
|
|
|
|
|
|
|
|
swaps (&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
|
|
|
|
swapl(&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int
|
2006-11-26 11:13:41 -07:00
|
|
|
SProcCompositeReleaseOverlayWindow (ClientPtr client)
|
|
|
|
{
|
|
|
|
int n;
|
|
|
|
REQUEST(xCompositeReleaseOverlayWindowReq);
|
|
|
|
|
|
|
|
swaps (&stuff->length, n);
|
|
|
|
REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
|
|
|
|
swapl(&stuff->window, n);
|
|
|
|
return (*ProcCompositeVector[stuff->compositeReqType]) (client);
|
|
|
|
}
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
static int (*SProcCompositeVector[CompositeNumberRequests])(ClientPtr) = {
|
2006-11-26 11:13:41 -07:00
|
|
|
SProcCompositeQueryVersion,
|
|
|
|
SProcCompositeRedirectWindow,
|
|
|
|
SProcCompositeRedirectSubwindows,
|
|
|
|
SProcCompositeUnredirectWindow,
|
|
|
|
SProcCompositeUnredirectSubwindows,
|
|
|
|
SProcCompositeCreateRegionFromBorderClip,
|
|
|
|
SProcCompositeNameWindowPixmap,
|
|
|
|
SProcCompositeGetOverlayWindow,
|
|
|
|
SProcCompositeReleaseOverlayWindow,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
SProcCompositeDispatch (ClientPtr client)
|
|
|
|
{
|
|
|
|
REQUEST(xReq);
|
|
|
|
|
|
|
|
if (stuff->data < CompositeNumberRequests)
|
|
|
|
return (*SProcCompositeVector[stuff->data]) (client);
|
|
|
|
else
|
|
|
|
return BadRequest;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CompositeExtensionInit (void)
|
|
|
|
{
|
|
|
|
ExtensionEntry *extEntry;
|
|
|
|
int s;
|
|
|
|
|
2007-12-13 14:06:02 -07:00
|
|
|
/* Assume initialization is going to fail */
|
|
|
|
noCompositeExtension = TRUE;
|
|
|
|
|
2007-11-24 10:55:21 -07:00
|
|
|
for (s = 0; s < screenInfo.numScreens; s++) {
|
|
|
|
ScreenPtr pScreen = screenInfo.screens[s];
|
|
|
|
VisualPtr vis;
|
|
|
|
|
|
|
|
/* Composite on 8bpp pseudocolor root windows appears to fail, so
|
|
|
|
* just disable it on anything pseudocolor for safety.
|
|
|
|
*/
|
|
|
|
for (vis = pScreen->visuals; vis->vid != pScreen->rootVisual; vis++)
|
|
|
|
;
|
|
|
|
if ((vis->class | DynamicClass) == PseudoColor)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* Ensure that Render is initialized, which is required for automatic
|
|
|
|
* compositing.
|
|
|
|
*/
|
|
|
|
if (GetPictureScreenIfSet(pScreen) == NULL)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#ifdef PANORAMIX
|
|
|
|
/* Xinerama's rewriting of window drawing before Composite gets to it
|
|
|
|
* breaks Composite.
|
|
|
|
*/
|
|
|
|
if (!noPanoramiXExtension)
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
CompositeClientWindowType = CreateNewResourceType
|
|
|
|
(FreeCompositeClientWindow, "CompositeClientWindow");
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!CompositeClientWindowType)
|
|
|
|
return;
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
CompositeClientSubwindowsType = CreateNewResourceType
|
|
|
|
(FreeCompositeClientSubwindows, "CompositeClientSubwindows");
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!CompositeClientSubwindowsType)
|
|
|
|
return;
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
CompositeClientOverlayType = CreateNewResourceType
|
|
|
|
(FreeCompositeClientOverlay, "CompositeClientOverlay");
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!CompositeClientOverlayType)
|
|
|
|
return;
|
|
|
|
|
2010-12-05 08:36:02 -07:00
|
|
|
if (!dixRegisterPrivateKey(&CompositeClientPrivateKeyRec, PRIVATE_CLIENT,
|
|
|
|
sizeof(CompositeClientRec)))
|
2006-11-26 11:13:41 -07:00
|
|
|
return;
|
2010-07-27 13:02:24 -06:00
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!AddCallback (&ClientStateCallback, CompositeClientCallback, 0))
|
|
|
|
return;
|
|
|
|
|
2010-07-27 13:02:24 -06:00
|
|
|
for (s = 0; s < screenInfo.numScreens; s++)
|
|
|
|
if (!compScreenInit (screenInfo.screens[s]))
|
|
|
|
return;
|
|
|
|
|
2006-11-26 11:13:41 -07:00
|
|
|
extEntry = AddExtension (COMPOSITE_NAME, 0, 0,
|
|
|
|
ProcCompositeDispatch, SProcCompositeDispatch,
|
2009-09-06 13:44:18 -06:00
|
|
|
NULL, StandardMinorOpcode);
|
2006-11-26 11:13:41 -07:00
|
|
|
if (!extEntry)
|
|
|
|
return;
|
|
|
|
CompositeReqCode = (CARD8) extEntry->base;
|
|
|
|
|
|
|
|
miRegisterRedirectBorderClipProc (compSetRedirectBorderClip,
|
|
|
|
compGetRedirectBorderClip);
|
2007-12-13 14:06:02 -07:00
|
|
|
|
|
|
|
/* Initialization succeeded */
|
|
|
|
noCompositeExtension = FALSE;
|
2006-11-26 11:13:41 -07:00
|
|
|
}
|