diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c index d948702b2..ff7506eaf 100644 --- a/Xext/panoramiX.c +++ b/Xext/panoramiX.c @@ -56,6 +56,9 @@ Equipment Corporation. #ifdef RENDER #include "picturestr.h" #endif +#ifdef XFIXES +#include "xfixesint.h" +#endif #include "modinit.h" @@ -582,6 +585,9 @@ void PanoramiXExtensionInit(int argc, char *argv[]) #ifdef RENDER PanoramiXRenderInit (); #endif +#ifdef XFIXES + PanoramiXFixesInit (); +#endif } extern Bool CreateConnectionBlock(void); @@ -883,6 +889,9 @@ static void PanoramiXResetProc(ExtensionEntry* extEntry) #ifdef RENDER PanoramiXRenderReset (); +#endif +#ifdef XFIXES + PanoramiXFixesReset (); #endif screenInfo.numScreens = PanoramiXNumScreens; for (i = 256; i--; ) diff --git a/xfixes/region.c b/xfixes/region.c old mode 100644 new mode 100755 index cac24b5da..3a905300c --- a/xfixes/region.c +++ b/xfixes/region.c @@ -864,3 +864,84 @@ SProcXFixesExpandRegion (ClientPtr client) return (*ProcXFixesVector[stuff->xfixesReqType]) (client); } +#ifdef PANORAMIX +#include "panoramiX.h" +#include "panoramiXsrv.h" + +#define VERIFY_XIN_PICTURE(pPicture, pid, client, mode, err) {\ + pPicture = SecurityLookupIDByType(client, pid, XRT_PICTURE, mode);\ + if (!pPicture) { \ + client->errorValue = pid; \ + return err; \ + } \ +} + +extern unsigned long XRT_PICTURE; + +extern int (*PanoramiXSaveXFixesVector[XFixesNumberRequests])(ClientPtr); + +int +PanoramiXFixesSetGCClipRegion (ClientPtr client) +{ + REQUEST(xXFixesSetGCClipRegionReq); + int result = Success, j; + PanoramiXRes *gc; + REQUEST_SIZE_MATCH(xXFixesSetGCClipRegionReq); + + if(!(gc = (PanoramiXRes *)SecurityLookupIDByType( + client, stuff->gc, XRT_GC, DixReadAccess))) + return BadGC; + + FOR_NSCREENS_BACKWARD(j) { + stuff->gc = gc->info[j].id; + result = (*PanoramiXSaveXFixesVector[X_XFixesSetGCClipRegion]) (client); + if(result != Success) break; + } + + return (result); +} + +int +PanoramiXFixesSetWindowShapeRegion (ClientPtr client) +{ + int result = Success, j; + PanoramiXRes *win; + REQUEST(xXFixesSetWindowShapeRegionReq); + + REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); + + if(!(win = (PanoramiXRes *)SecurityLookupIDByType( + client, stuff->dest, XRT_WINDOW, DixWriteAccess))) + return BadWindow; + + FOR_NSCREENS_FORWARD(j) { + stuff->dest = win->info[j].id; + result = (*PanoramiXSaveXFixesVector[X_XFixesSetWindowShapeRegion]) (client); + if(result != Success) break; + } + + return (result); +} + +int +PanoramiXFixesSetPictureClipRegion (ClientPtr client) +{ + REQUEST(xXFixesSetPictureClipRegionReq); + int result = Success, j; + PanoramiXRes *pict; + + REQUEST_SIZE_MATCH (xXFixesSetPictureClipRegionReq); + + VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess, + RenderErrBase + BadPicture); + + FOR_NSCREENS_BACKWARD(j) { + stuff->picture = pict->info[j].id; + result = (*PanoramiXSaveXFixesVector[X_XFixesSetPictureClipRegion]) (client); + if(result != Success) break; + } + + return (result); +} + +#endif diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c old mode 100644 new mode 100755 index d1225c6f3..e01c4f9d5 --- a/xfixes/xfixes.c +++ b/xfixes/xfixes.c @@ -261,3 +261,33 @@ XFixesExtensionInit(void) (EventSwapPtr) SXFixesCursorNotifyEvent; } } + +#ifdef PANORAMIX + +int (*PanoramiXSaveXFixesVector[XFixesNumberRequests])(ClientPtr); + +void +PanoramiXFixesInit (void) +{ + int i; + + for (i = 0; i < XFixesNumberRequests; i++) + PanoramiXSaveXFixesVector[i] = ProcXFixesVector[i]; + /* + * Stuff in Xinerama aware request processing hooks + */ + ProcXFixesVector[X_XFixesSetGCClipRegion] = PanoramiXFixesSetGCClipRegion; + ProcXFixesVector[X_XFixesSetWindowShapeRegion] = PanoramiXFixesSetWindowShapeRegion; + ProcXFixesVector[X_XFixesSetPictureClipRegion] = PanoramiXFixesSetPictureClipRegion; +} + +void +PanoramiXFixesReset (void) +{ + int i; + + for (i = 0; i < XFixesNumberRequests; i++) + ProcXFixesVector[i] = PanoramiXSaveXFixesVector[i]; +} + +#endif diff --git a/xfixes/xfixesint.h b/xfixes/xfixesint.h old mode 100644 new mode 100755 index 33a3205ed..4a4e78364 --- a/xfixes/xfixesint.h +++ b/xfixes/xfixesint.h @@ -255,6 +255,17 @@ ProcXFixesExpandRegion (ClientPtr client); int SProcXFixesExpandRegion (ClientPtr client); +#ifdef PANORAMIX +int +PanoramiXFixesSetGCClipRegion (ClientPtr client); + +int +PanoramiXFixesSetWindowShapeRegion (ClientPtr client); + +int +PanoramiXFixesSetPictureClipRegion (ClientPtr client); +#endif + /* Cursor Visibility (Version 4) */ int @@ -269,4 +280,9 @@ ProcXFixesShowCursor (ClientPtr client); int SProcXFixesShowCursor (ClientPtr client); +#ifdef PANORAMIX +void PanoramiXFixesInit (void); +void PanoramiXFixesReset (void); +#endif + #endif /* _XFIXESINT_H_ */