summaryrefslogtreecommitdiff
path: root/xserver/Xext/panoramiX.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2008-11-02 15:26:35 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2008-11-02 15:26:35 +0000
commitdbca69c8a4f3e2d1ccb4f89152213b2861b33af6 (patch)
treef8963ef73903a7b4374adc2354dffbaa905112ac /xserver/Xext/panoramiX.c
parent33b2029f322f3c238b7ba528083195ad8dde33e1 (diff)
xserver 1.5.2. tested by ckuethe@, oga@, and others.
Diffstat (limited to 'xserver/Xext/panoramiX.c')
-rw-r--r--xserver/Xext/panoramiX.c415
1 files changed, 197 insertions, 218 deletions
diff --git a/xserver/Xext/panoramiX.c b/xserver/Xext/panoramiX.c
index 6b8b5f2f7..8bc5c42c2 100644
--- a/xserver/Xext/panoramiX.c
+++ b/xserver/Xext/panoramiX.c
@@ -65,9 +65,6 @@ extern VisualPtr glxMatchVisual(ScreenPtr pScreen,
ScreenPtr pMatchScreen);
#endif
-#if 0
-static unsigned char PanoramiXReqCode = 0;
-#endif
/*
* PanoramiX data declarations
*/
@@ -77,22 +74,22 @@ int PanoramiXPixHeight = 0;
_X_EXPORT int PanoramiXNumScreens = 0;
_X_EXPORT PanoramiXData *panoramiXdataPtr = NULL;
-RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL};
+static RegionRec PanoramiXScreenRegion = {{0, 0, 0, 0}, NULL};
static int PanoramiXNumDepths;
static DepthPtr PanoramiXDepths;
static int PanoramiXNumVisuals;
static VisualPtr PanoramiXVisuals;
-/* We support at most 256 visuals */
-_X_EXPORT XID *PanoramiXVisualTable = NULL;
-
_X_EXPORT unsigned long XRC_DRAWABLE;
_X_EXPORT unsigned long XRT_WINDOW;
_X_EXPORT unsigned long XRT_PIXMAP;
_X_EXPORT unsigned long XRT_GC;
_X_EXPORT unsigned long XRT_COLORMAP;
+static Bool VisualsEqual(VisualPtr, ScreenPtr, VisualPtr);
+_X_EXPORT XineramaVisualsEqualProcPtr XineramaVisualsEqualPtr = &VisualsEqual;
+
/*
* Function prototypes
*/
@@ -109,10 +106,9 @@ static void PanoramiXResetProc(ExtensionEntry*);
#include "panoramiXh.h"
int (* SavedProcVector[256]) (ClientPtr client) = { NULL, };
-ScreenInfo *GlobalScrInfo = NULL;
-static int PanoramiXGCIndex = -1;
-static int PanoramiXScreenIndex = -1;
+static DevPrivateKey PanoramiXGCKey = &PanoramiXGCKey;
+static DevPrivateKey PanoramiXScreenKey = &PanoramiXScreenKey;
typedef struct {
DDXPointRec clipOrg;
@@ -135,14 +131,14 @@ static void XineramaChangeClip(GCPtr, int, pointer, int);
static void XineramaDestroyClip(GCPtr);
static void XineramaCopyClip(GCPtr, GCPtr);
-GCFuncs XineramaGCFuncs = {
+static GCFuncs XineramaGCFuncs = {
XineramaValidateGC, XineramaChangeGC, XineramaCopyGC, XineramaDestroyGC,
XineramaChangeClip, XineramaDestroyClip, XineramaCopyClip
};
#define Xinerama_GC_FUNC_PROLOGUE(pGC)\
- PanoramiXGCPtr pGCPriv = \
- (PanoramiXGCPtr) (pGC)->devPrivates[PanoramiXGCIndex].ptr;\
+ PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr) \
+ dixLookupPrivate(&(pGC)->devPrivates, PanoramiXGCKey); \
(pGC)->funcs = pGCPriv->wrapFuncs;
#define Xinerama_GC_FUNC_EPILOGUE(pGC)\
@@ -153,8 +149,8 @@ GCFuncs XineramaGCFuncs = {
static Bool
XineramaCloseScreen (int i, ScreenPtr pScreen)
{
- PanoramiXScreenPtr pScreenPriv =
- (PanoramiXScreenPtr) pScreen->devPrivates[PanoramiXScreenIndex].ptr;
+ PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
+ dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
pScreen->CloseScreen = pScreenPriv->CloseScreen;
pScreen->CreateGC = pScreenPriv->CreateGC;
@@ -168,18 +164,18 @@ XineramaCloseScreen (int i, ScreenPtr pScreen)
return (*pScreen->CloseScreen) (i, pScreen);
}
-Bool
+static Bool
XineramaCreateGC(GCPtr pGC)
{
ScreenPtr pScreen = pGC->pScreen;
- PanoramiXScreenPtr pScreenPriv =
- (PanoramiXScreenPtr) pScreen->devPrivates[PanoramiXScreenIndex].ptr;
+ PanoramiXScreenPtr pScreenPriv = (PanoramiXScreenPtr)
+ dixLookupPrivate(&pScreen->devPrivates, PanoramiXScreenKey);
Bool ret;
pScreen->CreateGC = pScreenPriv->CreateGC;
if((ret = (*pScreen->CreateGC)(pGC))) {
- PanoramiXGCPtr pGCPriv =
- (PanoramiXGCPtr) pGC->devPrivates[PanoramiXGCIndex].ptr;
+ PanoramiXGCPtr pGCPriv = (PanoramiXGCPtr)
+ dixLookupPrivate(&pGC->devPrivates, PanoramiXGCKey);
pGCPriv->wrapFuncs = pGC->funcs;
pGC->funcs = &XineramaGCFuncs;
@@ -285,8 +281,8 @@ XineramaCopyGC (
unsigned long mask,
GCPtr pGCDst
){
- PanoramiXGCPtr pSrcPriv =
- (PanoramiXGCPtr) pGCSrc->devPrivates[PanoramiXGCIndex].ptr;
+ PanoramiXGCPtr pSrcPriv = (PanoramiXGCPtr)
+ dixLookupPrivate(&pGCSrc->devPrivates, PanoramiXGCKey);
Xinerama_GC_FUNC_PROLOGUE (pGCDst);
if(mask & GCTileStipXOrigin)
@@ -330,8 +326,6 @@ XineramaDestroyClip(GCPtr pGC)
Xinerama_GC_FUNC_EPILOGUE (pGC);
}
-
-
_X_EXPORT int
XineramaDeleteResource(pointer data, XID id)
{
@@ -339,32 +333,11 @@ XineramaDeleteResource(pointer data, XID id)
return 1;
}
-
-static Bool
-XineramaFindIDOnAnyScreen(pointer resource, XID id, pointer privdata)
-{
- PanoramiXRes *res = (PanoramiXRes*)resource;
- int j;
-
- FOR_NSCREENS(j)
- if(res->info[j].id == *((XID*)privdata)) return TRUE;
-
- return FALSE;
-}
-
-PanoramiXRes *
-PanoramiXFindIDOnAnyScreen(RESTYPE type, XID id)
-{
- return LookupClientResourceComplex(clients[CLIENT_ID(id)], type,
- XineramaFindIDOnAnyScreen, &id);
-}
-
typedef struct {
int screen;
int id;
} PanoramiXSearchData;
-
static Bool
XineramaFindIDByScrnum(pointer resource, XID id, pointer privdata)
{
@@ -389,23 +362,6 @@ PanoramiXFindIDByScrnum(RESTYPE type, XID id, int screen)
XineramaFindIDByScrnum, &data);
}
-WindowPtr
-PanoramiXChangeWindow(int ScrnNum, WindowPtr pWin)
-{
- int num = pWin->drawable.pScreen->myNum;
-
- if(num != ScrnNum) {
- PanoramiXRes *win;
-
- win = PanoramiXFindIDByScrnum(XRT_WINDOW, pWin->drawable.id, num);
-
- if (win)
- pWin = (WindowPtr) LookupIDByType(win->info[ScrnNum].id, RT_WINDOW);
- }
-
- return pWin;
-}
-
typedef struct _connect_callback_list {
void (*func)(void);
struct _connect_callback_list *next;
@@ -496,7 +452,6 @@ void PanoramiXExtensionInit(int argc, char *argv[])
if (noPanoramiXExtension)
return;
- GlobalScrInfo = &screenInfo; /* For debug visibility */
PanoramiXNumScreens = screenInfo.numScreens;
if (PanoramiXNumScreens == 1) { /* Only 1 screen */
noPanoramiXExtension = TRUE;
@@ -508,14 +463,8 @@ void PanoramiXExtensionInit(int argc, char *argv[])
ProcPanoramiXDispatch,
SProcPanoramiXDispatch, PanoramiXResetProc,
StandardMinorOpcode);
- if (!extEntry) {
- ErrorF("PanoramiXExtensionInit(): failed to AddExtension\n");
+ if (!extEntry)
break;
- }
-
-#if 0
- PanoramiXReqCode = (unsigned char)extEntry->base;
-#endif
/*
* First make sure all the basic allocations succeed. If not,
@@ -526,20 +475,17 @@ void PanoramiXExtensionInit(int argc, char *argv[])
xcalloc(PanoramiXNumScreens, sizeof(PanoramiXData));
BREAK_IF(!panoramiXdataPtr);
- BREAK_IF((PanoramiXGCIndex = AllocateGCPrivateIndex()) < 0);
- BREAK_IF((PanoramiXScreenIndex = AllocateScreenPrivateIndex()) < 0);
+
+ if (!dixRequestPrivate(PanoramiXGCKey, sizeof(PanoramiXGCRec))) {
+ noPanoramiXExtension = TRUE;
+ return;
+ }
for (i = 0; i < PanoramiXNumScreens; i++) {
pScreen = screenInfo.screens[i];
- if(!AllocateGCPrivate(pScreen, PanoramiXGCIndex,
- sizeof(PanoramiXGCRec))) {
- noPanoramiXExtension = TRUE;
- return;
- }
-
pScreenPriv = xalloc(sizeof(PanoramiXScreenRec));
- pScreen->devPrivates[PanoramiXScreenIndex].ptr =
- (pointer)pScreenPriv;
+ dixSetPrivate(&pScreen->devPrivates, PanoramiXScreenKey,
+ pScreenPriv);
if(!pScreenPriv) {
noPanoramiXExtension = TRUE;
return;
@@ -566,7 +512,7 @@ void PanoramiXExtensionInit(int argc, char *argv[])
if (!success) {
noPanoramiXExtension = TRUE;
- ErrorF("%s Extension failed to initialize\n", PANORAMIX_PROTOCOL_NAME);
+ ErrorF(PANORAMIX_PROTOCOL_NAME " extension failed to initialize\n");
return;
}
@@ -656,14 +602,14 @@ Bool PanoramiXCreateConnectionBlock(void)
*/
if(!PanoramiXNumDepths) {
- ErrorF("PanoramiX error: Incompatible screens. No common visuals\n");
+ ErrorF("Xinerama error: No common visuals\n");
return FALSE;
}
for(i = 1; i < screenInfo.numScreens; i++) {
pScreen = screenInfo.screens[i];
if(pScreen->rootDepth != screenInfo.screens[0]->rootDepth) {
- ErrorF("PanoramiX error: Incompatible screens. Root window depths differ\n");
+ ErrorF("Xinerama error: Root window depths differ\n");
return FALSE;
}
if(pScreen->backingStoreSupport != screenInfo.screens[0]->backingStoreSupport)
@@ -725,10 +671,10 @@ Bool PanoramiXCreateConnectionBlock(void)
connSetupPrefix.length = length >> 2;
- xfree(PanoramiXVisuals);
for (i = 0; i < PanoramiXNumDepths; i++)
xfree(PanoramiXDepths[i].vids);
xfree(PanoramiXDepths);
+ PanoramiXDepths = NULL;
/*
* OK, change some dimensions so it looks as if it were one big screen
@@ -756,143 +702,132 @@ Bool PanoramiXCreateConnectionBlock(void)
return TRUE;
}
-extern
-void PanoramiXConsolidate(void)
+/*
+ * This isn't just memcmp(), bitsPerRGBValue is skipped. markv made that
+ * change way back before xf86 4.0, but the comment for _why_ is a bit
+ * opaque, so I'm not going to question it for now.
+ *
+ * This is probably better done as a screen hook so DBE/EVI/GLX can add
+ * their own tests, and adding privates to VisualRec so they don't have to
+ * do their own back-mapping.
+ */
+static Bool
+VisualsEqual(VisualPtr a, ScreenPtr pScreenB, VisualPtr b)
{
- int i, j, k;
- VisualPtr pVisual, pVisual2;
- ScreenPtr pScreen, pScreen2;
- DepthPtr pDepth, pDepth2;
- PanoramiXRes *root, *defmap, *saver;
- Bool foundDepth, missingDepth;
+ return ((a->class == b->class) &&
+ (a->ColormapEntries == b->ColormapEntries) &&
+ (a->nplanes == b->nplanes) &&
+ (a->redMask == b->redMask) &&
+ (a->greenMask == b->greenMask) &&
+ (a->blueMask == b->blueMask) &&
+ (a->offsetRed == b->offsetRed) &&
+ (a->offsetGreen == b->offsetGreen) &&
+ (a->offsetBlue == b->offsetBlue));
+}
+
+static void
+PanoramiXMaybeAddDepth(DepthPtr pDepth)
+{
+ ScreenPtr pScreen;
+ int j, k;
+ Bool found = FALSE;
+
+ for (j = 1; j < PanoramiXNumScreens; j++) {
+ pScreen = screenInfo.screens[j];
+ for (k = 0; k < pScreen->numDepths; k++) {
+ if (pScreen->allowedDepths[k].depth == pDepth->depth) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
- if(!PanoramiXVisualTable)
- PanoramiXVisualTable = xcalloc(256 * MAXSCREENS, sizeof(XID));
+ if (!found)
+ return;
- pScreen = screenInfo.screens[0];
- pVisual = pScreen->visuals;
- pDepth = pScreen->allowedDepths;
+ j = PanoramiXNumDepths;
+ PanoramiXNumDepths++;
+ PanoramiXDepths = xrealloc(PanoramiXDepths,
+ PanoramiXNumDepths * sizeof(DepthRec));
+ PanoramiXDepths[j].depth = pDepth->depth;
+ PanoramiXDepths[j].numVids = 0;
+ /* XXX suboptimal, should grow these dynamically */
+ if(pDepth->numVids)
+ PanoramiXDepths[j].vids = xalloc(sizeof(VisualID) * pDepth->numVids);
+ else
+ PanoramiXDepths[j].vids = NULL;
+}
- PanoramiXNumDepths = 0;
- PanoramiXDepths = xcalloc(pScreen->numDepths,sizeof(DepthRec));
- PanoramiXNumVisuals = 0;
- PanoramiXVisuals = xcalloc(pScreen->numVisuals,sizeof(VisualRec));
-
- for (i = 0; i < pScreen->numDepths; i++, pDepth++) {
- missingDepth = FALSE;
- for (j = 1; j < PanoramiXNumScreens; j++) {
- pScreen2 = screenInfo.screens[j];
- pDepth2 = pScreen2->allowedDepths;
-
- foundDepth = FALSE;
- for (k = 0; k < pScreen2->numDepths; k++, pDepth2++) {
- if(pDepth2->depth == pDepth->depth) {
- foundDepth = TRUE;
- break;
- }
- }
-
- if(!foundDepth) {
- missingDepth = TRUE;
- break;
- }
- }
-
- if(!missingDepth) {
- PanoramiXDepths[PanoramiXNumDepths].depth = pDepth->depth;
- PanoramiXDepths[PanoramiXNumDepths].numVids = 0;
- if(pDepth->numVids)
- PanoramiXDepths[PanoramiXNumDepths].vids =
- xalloc(sizeof(VisualID) * pDepth->numVids);
- else
- PanoramiXDepths[PanoramiXNumDepths].vids = NULL;
- PanoramiXNumDepths++;
- }
- }
+static void
+PanoramiXMaybeAddVisual(VisualPtr pVisual)
+{
+ ScreenPtr pScreen;
+ int j, k;
+ Bool found = FALSE;
- for (i = 0; i < pScreen->numVisuals; i++, pVisual++) {
- PanoramiXVisualTable[pVisual->vid * MAXSCREENS] = pVisual->vid;
+ for (j = 1; j < PanoramiXNumScreens; j++) {
+ pScreen = screenInfo.screens[j];
+ found = FALSE;
- /* check if the visual exists on all screens */
- for (j = 1; j < PanoramiXNumScreens; j++) {
- pScreen2 = screenInfo.screens[j];
+ for (k = 0; k < pScreen->numVisuals; k++) {
+ VisualPtr candidate = &pScreen->visuals[k];
+ if ((*XineramaVisualsEqualPtr)(pVisual, pScreen, candidate)
#ifdef GLXPROXY
- pVisual2 = glxMatchVisual(pScreen, pVisual, pScreen2);
- if (pVisual2) {
- PanoramiXVisualTable[(pVisual->vid * MAXSCREENS) + j] =
- pVisual2->vid;
- continue;
- } else if (glxMatchVisual(pScreen, pVisual, pScreen)) {
- PanoramiXVisualTable[(pVisual->vid * MAXSCREENS) + j] = 0;
- break;
- }
+ && glxMatchVisual(screenInfo.screens[0], pVisual, pScreen)
#endif
- pVisual2 = pScreen2->visuals;
-
- for (k = 0; k < pScreen2->numVisuals; k++, pVisual2++) {
- if ((pVisual->class == pVisual2->class) &&
- (pVisual->ColormapEntries == pVisual2->ColormapEntries) &&
- (pVisual->nplanes == pVisual2->nplanes) &&
- (pVisual->redMask == pVisual2->redMask) &&
- (pVisual->greenMask == pVisual2->greenMask) &&
- (pVisual->blueMask == pVisual2->blueMask) &&
- (pVisual->offsetRed == pVisual2->offsetRed) &&
- (pVisual->offsetGreen == pVisual2->offsetGreen) &&
- (pVisual->offsetBlue == pVisual2->offsetBlue))
- {
- /* We merely assign the first visual that matches. OpenGL
- will need to get involved at some point if you want
- match GLX visuals */
- PanoramiXVisualTable[(pVisual->vid * MAXSCREENS) + j] =
- pVisual2->vid;
- break;
- }
- }
- }
-
- /* if it doesn't exist on all screens we can't use it */
- for (j = 0; j < PanoramiXNumScreens; j++) {
- if (!PanoramiXVisualTable[(pVisual->vid * MAXSCREENS) + j]) {
- PanoramiXVisualTable[pVisual->vid * MAXSCREENS] = 0;
+ ) {
+ found = TRUE;
break;
}
}
- /* if it does, make sure it's in the list of supported depths and visuals */
- if(PanoramiXVisualTable[pVisual->vid * MAXSCREENS]) {
- PanoramiXVisuals[PanoramiXNumVisuals].vid = pVisual->vid;
- PanoramiXVisuals[PanoramiXNumVisuals].class = pVisual->class;
- PanoramiXVisuals[PanoramiXNumVisuals].bitsPerRGBValue = pVisual->bitsPerRGBValue;
- PanoramiXVisuals[PanoramiXNumVisuals].ColormapEntries = pVisual->ColormapEntries;
- PanoramiXVisuals[PanoramiXNumVisuals].nplanes = pVisual->nplanes;
- PanoramiXVisuals[PanoramiXNumVisuals].redMask = pVisual->redMask;
- PanoramiXVisuals[PanoramiXNumVisuals].greenMask = pVisual->greenMask;
- PanoramiXVisuals[PanoramiXNumVisuals].blueMask = pVisual->blueMask;
- PanoramiXVisuals[PanoramiXNumVisuals].offsetRed = pVisual->offsetRed;
- PanoramiXVisuals[PanoramiXNumVisuals].offsetGreen = pVisual->offsetGreen;
- PanoramiXVisuals[PanoramiXNumVisuals].offsetBlue = pVisual->offsetBlue;
- PanoramiXNumVisuals++;
-
- for (j = 0; j < PanoramiXNumDepths; j++) {
- if (PanoramiXDepths[j].depth == pVisual->nplanes) {
- PanoramiXDepths[j].vids[PanoramiXDepths[j].numVids] = pVisual->vid;
- PanoramiXDepths[j].numVids++;
- break;
- }
- }
- }
- }
+ if (!found)
+ return;
+ }
+
+ /* found a matching visual on all screens, add it to the subset list */
+ j = PanoramiXNumVisuals;
+ PanoramiXNumVisuals++;
+ PanoramiXVisuals = xrealloc(PanoramiXVisuals,
+ PanoramiXNumVisuals * sizeof(VisualRec));
+
+ memcpy(&PanoramiXVisuals[j], pVisual, sizeof(VisualRec));
+
+ for (k = 0; k < PanoramiXNumDepths; k++) {
+ if (PanoramiXDepths[k].depth == pVisual->nplanes) {
+ PanoramiXDepths[k].vids[PanoramiXDepths[k].numVids] = pVisual->vid;
+ PanoramiXDepths[k].numVids++;
+ break;
+ }
+ }
+}
+
+extern void
+PanoramiXConsolidate(void)
+{
+ int i;
+ PanoramiXRes *root, *defmap, *saver;
+ ScreenPtr pScreen = screenInfo.screens[0];
+ DepthPtr pDepth = pScreen->allowedDepths;
+ VisualPtr pVisual = pScreen->visuals;
+ PanoramiXNumDepths = 0;
+ PanoramiXNumVisuals = 0;
- root = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes));
+ for (i = 0; i < pScreen->numDepths; i++)
+ PanoramiXMaybeAddDepth(pDepth++);
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ PanoramiXMaybeAddVisual(pVisual++);
+
+ root = xalloc(sizeof(PanoramiXRes));
root->type = XRT_WINDOW;
- defmap = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes));
+ defmap = xalloc(sizeof(PanoramiXRes));
defmap->type = XRT_COLORMAP;
- saver = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes));
+ saver = xalloc(sizeof(PanoramiXRes));
saver->type = XRT_WINDOW;
-
for (i = 0; i < PanoramiXNumScreens; i++) {
root->info[i].id = WindowTable[i]->drawable.id;
root->u.win.class = InputOutput;
@@ -908,6 +843,38 @@ void PanoramiXConsolidate(void)
AddResource(defmap->info[0].id, XRT_COLORMAP, defmap);
}
+_X_EXPORT VisualID
+PanoramiXTranslateVisualID(int screen, VisualID orig)
+{
+ ScreenPtr pOtherScreen = screenInfo.screens[screen];
+ VisualPtr pVisual = NULL;
+ int i;
+
+ for (i = 0; i < PanoramiXNumVisuals; i++) {
+ if (orig == PanoramiXVisuals[i].vid) {
+ pVisual = &PanoramiXVisuals[i];
+ break;
+ }
+ }
+
+ if (!pVisual)
+ return 0;
+
+ /* if screen is 0, orig is already the correct visual ID */
+ if (screen == 0)
+ return orig;
+
+ /* found the original, now translate it relative to the backend screen */
+ for (i = 0; i < pOtherScreen->numVisuals; i++) {
+ VisualPtr pOtherVisual = &pOtherScreen->visuals[i];
+
+ if ((*XineramaVisualsEqualPtr)(pVisual, pOtherScreen, pOtherVisual))
+ return pOtherVisual->vid;
+ }
+
+ return 0;
+}
+
/*
* PanoramiXResetProc()
@@ -958,20 +925,22 @@ ProcPanoramiXGetState(ClientPtr client)
REQUEST(xPanoramiXGetStateReq);
WindowPtr pWin;
xPanoramiXGetStateReply rep;
- register int n;
+ register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
- pWin = LookupWindow (stuff->window, client);
- if (!pWin)
- return BadWindow;
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.state = !noPanoramiXExtension;
+ rep.window = stuff->window;
if (client->swapped) {
swaps (&rep.sequenceNumber, n);
swapl (&rep.length, n);
- swaps (&rep.state, n);
+ swapl (&rep.window, n);
}
WriteToClient (client, sizeof (xPanoramiXGetStateReply), (char *) &rep);
return client->noClientException;
@@ -984,20 +953,22 @@ ProcPanoramiXGetScreenCount(ClientPtr client)
REQUEST(xPanoramiXGetScreenCountReq);
WindowPtr pWin;
xPanoramiXGetScreenCountReply rep;
- register int n;
+ register int n, rc;
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
- pWin = LookupWindow (stuff->window, client);
- if (!pWin)
- return BadWindow;
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
rep.ScreenCount = PanoramiXNumScreens;
+ rep.window = stuff->window;
if (client->swapped) {
swaps (&rep.sequenceNumber, n);
swapl (&rep.length, n);
- swaps (&rep.ScreenCount, n);
+ swapl (&rep.window, n);
}
WriteToClient (client, sizeof (xPanoramiXGetScreenCountReply), (char *) &rep);
return client->noClientException;
@@ -1009,23 +980,31 @@ ProcPanoramiXGetScreenSize(ClientPtr client)
REQUEST(xPanoramiXGetScreenSizeReq);
WindowPtr pWin;
xPanoramiXGetScreenSizeReply rep;
- register int n;
+ register int n, rc;
+ if (stuff->screen >= PanoramiXNumScreens)
+ return BadMatch;
+
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
- pWin = LookupWindow (stuff->window, client);
- if (!pWin)
- return BadWindow;
+ rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
+ if (rc != Success)
+ return rc;
+
rep.type = X_Reply;
rep.length = 0;
rep.sequenceNumber = client->sequence;
/* screen dimensions */
rep.width = panoramiXdataPtr[stuff->screen].width;
rep.height = panoramiXdataPtr[stuff->screen].height;
+ rep.window = stuff->window;
+ rep.screen = stuff->screen;
if (client->swapped) {
swaps (&rep.sequenceNumber, n);
swapl (&rep.length, n);
- swaps (&rep.width, n);
- swaps (&rep.height, n);
+ swapl (&rep.width, n);
+ swapl (&rep.height, n);
+ swapl (&rep.window, n);
+ swapl (&rep.screen, n);
}
WriteToClient (client, sizeof (xPanoramiXGetScreenSizeReply), (char *) &rep);
return client->noClientException;