Move composite panoramix support into separate functions.

This commit is contained in:
David Reveman 2008-07-08 12:44:37 -04:00
parent c90b5657e6
commit 75f9b98af3
3 changed files with 403 additions and 319 deletions

View File

@ -59,6 +59,9 @@ Equipment Corporation.
#ifdef XFIXES
#include "xfixesint.h"
#endif
#ifdef COMPOSITE
#include "compint.h"
#endif
#include "modinit.h"
@ -588,6 +591,10 @@ void PanoramiXExtensionInit(int argc, char *argv[])
#ifdef XFIXES
PanoramiXFixesInit ();
#endif
#ifdef COMPOSITE
PanoramiXCompositeInit ();
#endif
}
extern Bool CreateConnectionBlock(void);

View File

@ -47,13 +47,6 @@
#include "compint.h"
#include "xace.h"
#ifdef PANORAMIX
#include "panoramiX.h"
extern unsigned long XRT_PIXMAP;
extern unsigned long XRT_WINDOW;
extern int PanoramiXNumScreens;
#endif
#define SERVER_COMPOSITE_MAJOR 0
#define SERVER_COMPOSITE_MINOR 4
@ -152,35 +145,6 @@ ProcCompositeRedirectWindow (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win;
int result = 0, j;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
rc = dixLookupResource ((pointer *) &pWin, win->info[j].id,
RT_WINDOW, client,
DixSetAttrAccess | DixManageAccess |
DixBlendAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
result = compRedirectWindow (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
#endif
rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client,
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
if (rc != Success)
@ -200,35 +164,6 @@ ProcCompositeRedirectSubwindows (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win;
int result = 0, j;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
rc = dixLookupResource ((pointer *) &pWin, win->info[j].id,
RT_WINDOW, client,
DixSetAttrAccess | DixManageAccess |
DixBlendAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
result = compRedirectSubwindows (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
#endif
rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client,
DixSetAttrAccess|DixManageAccess|DixBlendAccess);
if (rc != Success)
@ -247,32 +182,6 @@ ProcCompositeUnredirectWindow (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win;
int result = 0, j;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
pWin = (WindowPtr) LookupIDByType (win->info[j].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
result = compUnredirectWindow (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
#endif
pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW);
if (!pWin)
{
@ -290,32 +199,6 @@ ProcCompositeUnredirectSubwindows (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win;
int result = 0, j;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
pWin = (WindowPtr) LookupIDByType (win->info[j].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
result = compUnredirectSubwindows (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
#endif
pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW);
if (!pWin)
{
@ -372,76 +255,6 @@ ProcCompositeNameWindowPixmap (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win, *newPix;
int i;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
if(!(newPix = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
return BadAlloc;
LEGAL_NEW_RESOURCE (stuff->pixmap, client);
newPix->type = XRT_PIXMAP;
newPix->u.pix.shared = FALSE;
newPix->info[0].id = stuff->pixmap;
for (i = 1; i < PanoramiXNumScreens; i++)
newPix->info[i].id = FakeClientID (client->index);
FOR_NSCREENS(i) {
rc = dixLookupResource ((pointer *) &pWin,
win->info[i].id, RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
xfree (newPix);
return (rc == BadValue) ? BadWindow : rc;
}
if (!pWin->viewable)
{
xfree (newPix);
return BadMatch;
}
cw = GetCompWindow (pWin);
if (!cw)
{
xfree (newPix);
return BadMatch;
}
pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
if (!pPixmap)
{
xfree (newPix);
return BadMatch;
}
if (!AddResource (newPix->info[i].id, RT_PIXMAP,
(pointer) pPixmap))
return BadAlloc;
++pPixmap->refcnt;
}
if (!AddResource (stuff->pixmap, XRT_PIXMAP, (pointer) newPix))
return BadAlloc;
return (client->noClientException);
}
#endif
rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
@ -491,100 +304,6 @@ ProcCompositeGetOverlayWindow (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win, *overlayWin = NULL;
int i;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
cs = GetCompScreen(screenInfo.screens[0]);
if (!cs->pOverlayWin)
{
if(!(overlayWin = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
return BadAlloc;
overlayWin->type = XRT_WINDOW;
overlayWin->u.win.root = FALSE;
}
FOR_NSCREENS_BACKWARD(i) {
rc = dixLookupResource((pointer *)&pWin, win->info[i].id,
RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
pScreen = pWin->drawable.pScreen;
/*
* 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
*/
cs = GetCompScreen(pScreen);
if (cs->pOverlayWin == NULL)
if (!compCreateOverlayWindow(pScreen))
{
FreeResource (pOc->resource, RT_NONE);
return BadAlloc;
}
rc = XaceHook(XACE_RESOURCE_ACCESS, client,
cs->pOverlayWin->drawable.id,
RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL,
DixGetAttrAccess);
if (rc != Success)
{
FreeResource (pOc->resource, RT_NONE);
return rc;
}
}
if (overlayWin)
{
FOR_NSCREENS(i) {
cs = GetCompScreen(screenInfo.screens[i]);
overlayWin->info[i].id = cs->pOverlayWin->drawable.id;
}
AddResource(overlayWin->info[0].id, XRT_WINDOW, overlayWin);
}
cs = GetCompScreen(screenInfo.screens[0]);
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);
return client->noClientException;
}
#endif
rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
@ -648,44 +367,6 @@ ProcCompositeReleaseOverlayWindow (ClientPtr client)
REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
PanoramiXRes *win;
int i;
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
FOR_NSCREENS_BACKWARD(i) {
pWin = (WindowPtr) LookupIDByType (win->info[i].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
pScreen = pWin->drawable.pScreen;
/*
* Has client queried a reference to the overlay window
* on this screen? If not, generate an error.
*/
pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
if (pOc == NULL)
return BadMatch;
/* The delete function will free the client structure */
FreeResource (pOc->resource, RT_NONE);
}
return client->noClientException;
}
#endif
pWin = (WindowPtr) LookupIDByType (stuff->window, RT_WINDOW);
if (!pWin)
{
@ -927,3 +608,394 @@ CompositeExtensionInit (void)
/* Initialization succeeded */
noCompositeExtension = FALSE;
}
#ifdef PANORAMIX
#include "panoramiX.h"
extern unsigned long XRT_PIXMAP;
extern unsigned long XRT_WINDOW;
extern int PanoramiXNumScreens;
int (*PanoramiXSaveCompositeVector[CompositeNumberRequests]) (ClientPtr);
static int
PanoramiXCompositeRedirectWindow (ClientPtr client)
{
WindowPtr pWin;
int rc;
PanoramiXRes *win;
int result = 0, j;
REQUEST(xCompositeRedirectWindowReq);
REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
rc = dixLookupResource ((pointer *) &pWin, win->info[j].id,
RT_WINDOW, client,
DixSetAttrAccess | DixManageAccess |
DixBlendAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
result = compRedirectWindow (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
static int
PanoramiXCompositeRedirectSubwindows (ClientPtr client)
{
WindowPtr pWin;
int rc;
PanoramiXRes *win;
int result = 0, j;
REQUEST(xCompositeRedirectSubwindowsReq);
REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
rc = dixLookupResource ((pointer *) &pWin, win->info[j].id,
RT_WINDOW, client,
DixSetAttrAccess | DixManageAccess |
DixBlendAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
result = compRedirectSubwindows (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
static int
PanoramiXCompositeUnredirectWindow (ClientPtr client)
{
WindowPtr pWin;
PanoramiXRes *win;
int result = 0, j;
REQUEST(xCompositeUnredirectWindowReq);
REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
pWin = (WindowPtr) LookupIDByType (win->info[j].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
result = compUnredirectWindow (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
static int
PanoramiXCompositeUnredirectSubwindows (ClientPtr client)
{
WindowPtr pWin;
PanoramiXRes *win;
int result = 0, j;
REQUEST(xCompositeUnredirectSubwindowsReq);
REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
return BadWindow;
FOR_NSCREENS_FORWARD(j) {
pWin = (WindowPtr) LookupIDByType (win->info[j].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
result = compUnredirectSubwindows (client, pWin, stuff->update);
if(result != Success) break;
}
return (result);
}
static int
PanoramiXCompositeNameWindowPixmap (ClientPtr client)
{
WindowPtr pWin;
CompWindowPtr cw;
PixmapPtr pPixmap;
int rc;
PanoramiXRes *win, *newPix;
int i;
REQUEST(xCompositeNameWindowPixmapReq);
REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
if(!(newPix = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
return BadAlloc;
LEGAL_NEW_RESOURCE (stuff->pixmap, client);
newPix->type = XRT_PIXMAP;
newPix->u.pix.shared = FALSE;
newPix->info[0].id = stuff->pixmap;
for (i = 1; i < PanoramiXNumScreens; i++)
newPix->info[i].id = FakeClientID (client->index);
FOR_NSCREENS(i) {
rc = dixLookupResource ((pointer *) &pWin,
win->info[i].id, RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
xfree (newPix);
return (rc == BadValue) ? BadWindow : rc;
}
if (!pWin->viewable)
{
xfree (newPix);
return BadMatch;
}
cw = GetCompWindow (pWin);
if (!cw)
{
xfree (newPix);
return BadMatch;
}
pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
if (!pPixmap)
{
xfree (newPix);
return BadMatch;
}
if (!AddResource (newPix->info[i].id, RT_PIXMAP,
(pointer) pPixmap))
return BadAlloc;
++pPixmap->refcnt;
}
if (!AddResource (stuff->pixmap, XRT_PIXMAP, (pointer) newPix))
return BadAlloc;
return (client->noClientException);
}
static int
PanoramiXCompositeGetOverlayWindow (ClientPtr client)
{
REQUEST(xCompositeGetOverlayWindowReq);
xCompositeGetOverlayWindowReply rep;
WindowPtr pWin;
ScreenPtr pScreen;
CompScreenPtr cs;
CompOverlayClientPtr pOc;
int rc;
PanoramiXRes *win, *overlayWin = NULL;
int i;
REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
cs = GetCompScreen(screenInfo.screens[0]);
if (!cs->pOverlayWin)
{
if(!(overlayWin = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
return BadAlloc;
overlayWin->type = XRT_WINDOW;
overlayWin->u.win.root = FALSE;
}
FOR_NSCREENS_BACKWARD(i) {
rc = dixLookupResource((pointer *)&pWin, win->info[i].id,
RT_WINDOW, client,
DixGetAttrAccess);
if (rc != Success)
{
client->errorValue = stuff->window;
return (rc == BadValue) ? BadWindow : rc;
}
pScreen = pWin->drawable.pScreen;
/*
* 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
*/
cs = GetCompScreen(pScreen);
if (cs->pOverlayWin == NULL)
if (!compCreateOverlayWindow(pScreen))
{
FreeResource (pOc->resource, RT_NONE);
return BadAlloc;
}
rc = XaceHook(XACE_RESOURCE_ACCESS, client,
cs->pOverlayWin->drawable.id,
RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL,
DixGetAttrAccess);
if (rc != Success)
{
FreeResource (pOc->resource, RT_NONE);
return rc;
}
}
if (overlayWin)
{
FOR_NSCREENS(i) {
cs = GetCompScreen(screenInfo.screens[i]);
overlayWin->info[i].id = cs->pOverlayWin->drawable.id;
}
AddResource(overlayWin->info[0].id, XRT_WINDOW, overlayWin);
}
cs = GetCompScreen(screenInfo.screens[0]);
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);
return client->noClientException;
}
static int
PanoramiXCompositeReleaseOverlayWindow (ClientPtr client)
{
REQUEST(xCompositeReleaseOverlayWindowReq);
WindowPtr pWin;
ScreenPtr pScreen;
CompOverlayClientPtr pOc;
PanoramiXRes *win;
int i;
REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
if(!(win = (PanoramiXRes *)SecurityLookupIDByType(
client, stuff->window, XRT_WINDOW, DixUnknownAccess)))
{
client->errorValue = stuff->window;
return BadWindow;
}
FOR_NSCREENS_BACKWARD(i) {
pWin = (WindowPtr) LookupIDByType (win->info[i].id, RT_WINDOW);
if (!pWin)
{
client->errorValue = stuff->window;
return BadWindow;
}
pScreen = pWin->drawable.pScreen;
/*
* Has client queried a reference to the overlay window
* on this screen? If not, generate an error.
*/
pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
if (pOc == NULL)
return BadMatch;
/* The delete function will free the client structure */
FreeResource (pOc->resource, RT_NONE);
}
return client->noClientException;
}
void
PanoramiXCompositeInit (void)
{
int i;
for (i = 0; i < CompositeNumberRequests; i++)
PanoramiXSaveCompositeVector[i] = ProcCompositeVector[i];
/*
* Stuff in Xinerama aware request processing hooks
*/
ProcCompositeVector[X_CompositeRedirectWindow] =
PanoramiXCompositeRedirectWindow;
ProcCompositeVector[X_CompositeRedirectSubwindows] =
PanoramiXCompositeRedirectSubwindows;
ProcCompositeVector[X_CompositeUnredirectWindow] =
PanoramiXCompositeUnredirectWindow;
ProcCompositeVector[X_CompositeUnredirectSubwindows] =
PanoramiXCompositeUnredirectSubwindows;
ProcCompositeVector[X_CompositeNameWindowPixmap] =
PanoramiXCompositeNameWindowPixmap;
ProcCompositeVector[X_CompositeGetOverlayWindow] =
PanoramiXCompositeGetOverlayWindow;
ProcCompositeVector[X_CompositeReleaseOverlayWindow] =
PanoramiXCompositeReleaseOverlayWindow;
}
void
PanoramiXCompositeReset (void)
{
int i;
for (i = 0; i < CompositeNumberRequests; i++)
ProcCompositeVector[i] = PanoramiXSaveCompositeVector[i];
}
#endif

View File

@ -319,4 +319,9 @@ CompositeRealChildHead (WindowPtr pWin);
int
DeleteWindowNoInputDevices(pointer value, XID wid);
#ifdef PANORAMIX
void PanoramiXCompositeInit (void);
void PanoramiXCompositeReset (void);
#endif
#endif /* _COMPINT_H_ */