diff --git a/composite/compext.c b/composite/compext.c index bb8f5946d..1cdb60009 100644 --- a/composite/compext.c +++ b/composite/compext.c @@ -51,6 +51,8 @@ static CARD8 CompositeReqCode; static DevPrivateKeyRec CompositeClientPrivateKeyRec; +static int compositeUseXinerama = 0; + #define CompositeClientPrivateKey (&CompositeClientPrivateKeyRec) RESTYPE CompositeClientWindowType; RESTYPE CompositeClientSubwindowsType; @@ -136,13 +138,10 @@ ProcCompositeQueryVersion(ClientPtr client) } while (0) static int -ProcCompositeRedirectWindow(ClientPtr client) +SingleCompositeRedirectWindow(ClientPtr client, xCompositeRedirectWindowReq *stuff) { WindowPtr pWin; - REQUEST(xCompositeRedirectWindowReq); - - REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq); VERIFY_WINDOW(pWin, stuff->window, client, DixSetAttrAccess | DixManageAccess | DixBlendAccess); @@ -150,13 +149,10 @@ ProcCompositeRedirectWindow(ClientPtr client) } static int -ProcCompositeRedirectSubwindows(ClientPtr client) +SingleRedirectSubwindows(ClientPtr client, xCompositeRedirectSubwindowsReq *stuff) { WindowPtr pWin; - REQUEST(xCompositeRedirectSubwindowsReq); - - REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq); VERIFY_WINDOW(pWin, stuff->window, client, DixSetAttrAccess | DixManageAccess | DixBlendAccess); @@ -164,13 +160,10 @@ ProcCompositeRedirectSubwindows(ClientPtr client) } static int -ProcCompositeUnredirectWindow(ClientPtr client) +SingleCompositeUnredirectWindow(ClientPtr client, xCompositeUnredirectWindowReq *stuff) { WindowPtr pWin; - REQUEST(xCompositeUnredirectWindowReq); - - REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq); VERIFY_WINDOW(pWin, stuff->window, client, DixSetAttrAccess | DixManageAccess | DixBlendAccess); @@ -178,13 +171,10 @@ ProcCompositeUnredirectWindow(ClientPtr client) } static int -ProcCompositeUnredirectSubwindows(ClientPtr client) +SingleCompositeUnredirectSubwindows(ClientPtr client, xCompositeUnredirectSubwindowsReq* stuff) { WindowPtr pWin; - REQUEST(xCompositeUnredirectSubwindowsReq); - - REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq); VERIFY_WINDOW(pWin, stuff->window, client, DixSetAttrAccess | DixManageAccess | DixBlendAccess); @@ -221,7 +211,7 @@ ProcCompositeCreateRegionFromBorderClip(ClientPtr client) } static int -ProcCompositeNameWindowPixmap(ClientPtr client) +SingleCompositeNameWindowPixmap(ClientPtr client, xCompositeNameWindowPixmapReq *stuff) { WindowPtr pWin; CompWindowPtr cw; @@ -229,9 +219,6 @@ ProcCompositeNameWindowPixmap(ClientPtr client) ScreenPtr pScreen; int rc; - REQUEST(xCompositeNameWindowPixmapReq); - - REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq); VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess); pScreen = pWin->drawable.pScreen; @@ -272,9 +259,8 @@ ProcCompositeNameWindowPixmap(ClientPtr client) } static int -ProcCompositeGetOverlayWindow(ClientPtr client) +SingleCompositeGetOverlayWindow(ClientPtr client, xCompositeGetOverlayWindowReq *stuff) { - REQUEST(xCompositeGetOverlayWindowReq); xCompositeGetOverlayWindowReply rep; WindowPtr pWin; ScreenPtr pScreen; @@ -282,7 +268,6 @@ ProcCompositeGetOverlayWindow(ClientPtr client) CompOverlayClientPtr pOc; int rc; - REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess); pScreen = pWin->drawable.pScreen; @@ -330,13 +315,11 @@ ProcCompositeGetOverlayWindow(ClientPtr client) } static int -ProcCompositeReleaseOverlayWindow(ClientPtr client) +SingleCompositeReleaseOverlayWindow(ClientPtr client, xCompositeReleaseOverlayWindowReq *stuff) { - REQUEST(xCompositeReleaseOverlayWindowReq); WindowPtr pWin; CompOverlayClientPtr pOc; - REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq); VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess); /* @@ -353,6 +336,14 @@ ProcCompositeReleaseOverlayWindow(ClientPtr client) return Success; } +static int ProcCompositeRedirectWindow(ClientPtr client); +static int ProcCompositeRedirectSubwindows(ClientPtr client); +static int ProcCompositeUnredirectWindow(ClientPtr client); +static int ProcCompositeReleaseOverlayWindow(ClientPtr client); +static int ProcCompositeUnredirectSubwindows(ClientPtr client); +static int ProcCompositeNameWindowPixmap(ClientPtr client); +static int ProcCompositeGetOverlayWindow(ClientPtr client); + static int (*ProcCompositeVector[CompositeNumberRequests]) (ClientPtr) = { ProcCompositeQueryVersion, ProcCompositeRedirectWindow, @@ -571,19 +562,21 @@ CompositeExtensionInit(void) #ifdef XINERAMA #include "panoramiXsrv.h" - -int (*PanoramiXSaveCompositeVector[CompositeNumberRequests]) (ClientPtr); +#endif static int -PanoramiXCompositeRedirectWindow(ClientPtr client) +ProcCompositeRedirectWindow(ClientPtr client) { - PanoramiXRes *win; - int rc = 0, j; - REQUEST(xCompositeRedirectWindowReq); - REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq); +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeRedirectWindow(client, stuff); + + PanoramiXRes *win; + int rc = 0, j; + if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -592,24 +585,30 @@ PanoramiXCompositeRedirectWindow(ClientPtr client) FOR_NSCREENS_FORWARD(j) { stuff->window = win->info[j].id; - rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client); + rc = SingleCompositeRedirectWindow(client, stuff); if (rc != Success) break; } return rc; +#else + return SingleCompositeRedirectWindow(client, stuff); +#endif /* XINERAMA */ } static int -PanoramiXCompositeRedirectSubwindows(ClientPtr client) +ProcCompositeRedirectSubwindows(ClientPtr client) { - PanoramiXRes *win; - int rc = 0, j; - REQUEST(xCompositeRedirectSubwindowsReq); - REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq); +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleRedirectSubwindows(client, stuff); + + PanoramiXRes *win; + int rc = 0, j; + if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -618,50 +617,62 @@ PanoramiXCompositeRedirectSubwindows(ClientPtr client) FOR_NSCREENS_FORWARD(j) { stuff->window = win->info[j].id; - rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client); + rc = SingleRedirectSubwindows(client, stuff); if (rc != Success) break; } return rc; +#else + return SingleRedirectSubwindows(client, stuff); +#endif /* XINERAMA */ } static int -PanoramiXCompositeUnredirectWindow(ClientPtr client) +ProcCompositeUnredirectWindow(ClientPtr client) { - PanoramiXRes *win; - int rc = 0, j; - REQUEST(xCompositeUnredirectWindowReq); - REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq); - if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, - client, DixUnknownAccess))) { - client->errorValue = stuff->window; - return rc; - } +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeUnredirectWindow(client, stuff); - FOR_NSCREENS_FORWARD(j) { - stuff->window = win->info[j].id; - rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client); - if (rc != Success) - break; - } - - return rc; -} - -static int -PanoramiXCompositeUnredirectSubwindows(ClientPtr client) -{ PanoramiXRes *win; int rc = 0, j; - REQUEST(xCompositeUnredirectSubwindowsReq); + if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, + client, DixUnknownAccess))) { + client->errorValue = stuff->window; + return rc; + } + FOR_NSCREENS_FORWARD(j) { + stuff->window = win->info[j].id; + rc = SingleCompositeUnredirectWindow(client, stuff); + if (rc != Success) + break; + } + + return rc; +#else + return SingleCompositeUnredirectWindow(client, stuff); +#endif /* XINERAMA */ +} + +static int +ProcCompositeUnredirectSubwindows(ClientPtr client) +{ + REQUEST(xCompositeUnredirectSubwindowsReq); REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq); +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeUnredirectSubwindows(client, stuff); + + PanoramiXRes *win; + int rc = 0, j; + if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -670,17 +681,27 @@ PanoramiXCompositeUnredirectSubwindows(ClientPtr client) FOR_NSCREENS_FORWARD(j) { stuff->window = win->info[j].id; - rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client); + rc = SingleCompositeUnredirectSubwindows(client, stuff); if (rc != Success) break; } return rc; +#else + return SingleCompositeUnredirectSubwindows(client, stuff); +#endif /* XINERAMA */ } static int -PanoramiXCompositeNameWindowPixmap(ClientPtr client) +ProcCompositeNameWindowPixmap(ClientPtr client) { + REQUEST(xCompositeNameWindowPixmapReq); + REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq); + +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeNameWindowPixmap(client, stuff); + WindowPtr pWin; CompWindowPtr cw; PixmapPtr pPixmap; @@ -688,10 +709,6 @@ PanoramiXCompositeNameWindowPixmap(ClientPtr client) PanoramiXRes *win, *newPix; int i; - REQUEST(xCompositeNameWindowPixmapReq); - - REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq); - if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -744,12 +761,21 @@ PanoramiXCompositeNameWindowPixmap(ClientPtr client) return BadAlloc; return Success; +#else + return SingleCompositeNameWindowPixmap(client, stuff); +#endif /* XINERAMA */ } static int -PanoramiXCompositeGetOverlayWindow(ClientPtr client) +ProcCompositeGetOverlayWindow(ClientPtr client) { REQUEST(xCompositeGetOverlayWindowReq); + REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); + +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeGetOverlayWindow(client, stuff); + xCompositeGetOverlayWindowReply rep; WindowPtr pWin; ScreenPtr pScreen; @@ -759,8 +785,6 @@ PanoramiXCompositeGetOverlayWindow(ClientPtr client) PanoramiXRes *win, *overlayWin = NULL; int i; - REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); - if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -843,21 +867,27 @@ PanoramiXCompositeGetOverlayWindow(ClientPtr client) swapl(&rep.overlayWin); } WriteToClient(client, sz_xCompositeGetOverlayWindowReply, &rep); - return Success; +#else + return SingleCompositeGetOverlayWindow(client, stuff); +#endif /* XINERAMA */ } static int -PanoramiXCompositeReleaseOverlayWindow(ClientPtr client) +ProcCompositeReleaseOverlayWindow(ClientPtr client) { REQUEST(xCompositeReleaseOverlayWindowReq); + REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq); + +#ifdef XINERAMA + if (!compositeUseXinerama) + return SingleCompositeReleaseOverlayWindow(client, stuff); + WindowPtr pWin; CompOverlayClientPtr pOc; PanoramiXRes *win; int i, rc; - REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq); - if ((rc = dixLookupResourceByType((void **) &win, stuff->window, XRT_WINDOW, client, DixUnknownAccess))) { client->errorValue = stuff->window; @@ -885,41 +915,21 @@ PanoramiXCompositeReleaseOverlayWindow(ClientPtr client) } return Success; +#else + return SingleCompositeReleaseOverlayWindow(client, stuff); +#endif /* XINERAMA */ } +#ifdef XINERAMA 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; + compositeUseXinerama = 1; } void PanoramiXCompositeReset(void) { - int i; - - for (i = 0; i < CompositeNumberRequests; i++) - ProcCompositeVector[i] = PanoramiXSaveCompositeVector[i]; + compositeUseXinerama = 0; } - #endif /* XINERAMA */