dbe.c revision 9ace9065
105b261ecSmrg/****************************************************************************** 205b261ecSmrg * 305b261ecSmrg * Copyright (c) 1994, 1995 Hewlett-Packard Company 405b261ecSmrg * 505b261ecSmrg * Permission is hereby granted, free of charge, to any person obtaining 605b261ecSmrg * a copy of this software and associated documentation files (the 705b261ecSmrg * "Software"), to deal in the Software without restriction, including 805b261ecSmrg * without limitation the rights to use, copy, modify, merge, publish, 905b261ecSmrg * distribute, sublicense, and/or sell copies of the Software, and to 1005b261ecSmrg * permit persons to whom the Software is furnished to do so, subject to 1105b261ecSmrg * the following conditions: 1205b261ecSmrg * 1305b261ecSmrg * The above copyright notice and this permission notice shall be included 1405b261ecSmrg * in all copies or substantial portions of the Software. 1505b261ecSmrg * 1605b261ecSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1705b261ecSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1805b261ecSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 1905b261ecSmrg * IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY CLAIM, 2005b261ecSmrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2105b261ecSmrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR 2205b261ecSmrg * THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2305b261ecSmrg * 2405b261ecSmrg * Except as contained in this notice, the name of the Hewlett-Packard 2505b261ecSmrg * Company shall not be used in advertising or otherwise to promote the 2605b261ecSmrg * sale, use or other dealings in this Software without prior written 2705b261ecSmrg * authorization from the Hewlett-Packard Company. 2805b261ecSmrg * 2905b261ecSmrg * DIX DBE code 3005b261ecSmrg * 3105b261ecSmrg *****************************************************************************/ 3205b261ecSmrg 3305b261ecSmrg 3405b261ecSmrg/* INCLUDES */ 3505b261ecSmrg 3605b261ecSmrg#ifdef HAVE_DIX_CONFIG_H 3705b261ecSmrg#include <dix-config.h> 3805b261ecSmrg#endif 3905b261ecSmrg 4005b261ecSmrg#include <string.h> 4105b261ecSmrg#if HAVE_STDINT_H 4205b261ecSmrg#include <stdint.h> 4305b261ecSmrg#elif !defined(UINT32_MAX) 4405b261ecSmrg#define UINT32_MAX 0xffffffffU 4505b261ecSmrg#endif 4605b261ecSmrg 4705b261ecSmrg#include <X11/X.h> 4805b261ecSmrg#include <X11/Xproto.h> 4905b261ecSmrg#include "scrnintstr.h" 5005b261ecSmrg#include "extnsionst.h" 5105b261ecSmrg#include "gcstruct.h" 5205b261ecSmrg#include "dixstruct.h" 5305b261ecSmrg#define NEED_DBE_PROTOCOL 5405b261ecSmrg#include "dbestruct.h" 5505b261ecSmrg#include "midbe.h" 564642e01fSmrg#include "xace.h" 5705b261ecSmrg 5805b261ecSmrg/* GLOBALS */ 5905b261ecSmrg 606747b715Smrg/* These are globals for use by DDX */ 616747b715SmrgDevPrivateKeyRec dbeScreenPrivKeyRec; 626747b715SmrgDevPrivateKeyRec dbeWindowPrivKeyRec; 6305b261ecSmrg 646747b715Smrg/* These are globals for use by DDX */ 656747b715SmrgRESTYPE dbeDrawableResType; 666747b715SmrgRESTYPE dbeWindowPrivResType; 6705b261ecSmrg 6805b261ecSmrg/* Used to generate DBE's BadBuffer error. */ 6905b261ecSmrgstatic int dbeErrorBase; 7005b261ecSmrg 7105b261ecSmrg/****************************************************************************** 7205b261ecSmrg * 7305b261ecSmrg * DBE DIX Procedure: DbeStubScreen 7405b261ecSmrg * 7505b261ecSmrg * Description: 7605b261ecSmrg * 7705b261ecSmrg * This is function stubs the function pointers in the given DBE screen 7805b261ecSmrg * private and increments the number of stubbed screens. 7905b261ecSmrg * 8005b261ecSmrg *****************************************************************************/ 8105b261ecSmrg 8205b261ecSmrgstatic void 8305b261ecSmrgDbeStubScreen(DbeScreenPrivPtr pDbeScreenPriv, int *nStubbedScreens) 8405b261ecSmrg{ 8505b261ecSmrg /* Stub DIX. */ 8605b261ecSmrg pDbeScreenPriv->SetupBackgroundPainter = NULL; 8705b261ecSmrg 8805b261ecSmrg /* Do not unwrap PositionWindow nor DestroyWindow. If the DDX 8905b261ecSmrg * initialization function failed, we assume that it did not wrap 9005b261ecSmrg * PositionWindow. Also, DestroyWindow is only wrapped if the DDX 9105b261ecSmrg * initialization function succeeded. 9205b261ecSmrg */ 9305b261ecSmrg 9405b261ecSmrg /* Stub DDX. */ 9505b261ecSmrg pDbeScreenPriv->GetVisualInfo = NULL; 9605b261ecSmrg pDbeScreenPriv->AllocBackBufferName = NULL; 9705b261ecSmrg pDbeScreenPriv->SwapBuffers = NULL; 9805b261ecSmrg pDbeScreenPriv->BeginIdiom = NULL; 9905b261ecSmrg pDbeScreenPriv->EndIdiom = NULL; 10005b261ecSmrg pDbeScreenPriv->WinPrivDelete = NULL; 10105b261ecSmrg pDbeScreenPriv->ResetProc = NULL; 10205b261ecSmrg 10305b261ecSmrg (*nStubbedScreens)++; 10405b261ecSmrg 10505b261ecSmrg} /* DbeStubScreen() */ 10605b261ecSmrg 10705b261ecSmrg 10805b261ecSmrg 10905b261ecSmrg/****************************************************************************** 11005b261ecSmrg * 11105b261ecSmrg * DBE DIX Procedure: ProcDbeGetVersion 11205b261ecSmrg * 11305b261ecSmrg * Description: 11405b261ecSmrg * 11505b261ecSmrg * This function is for processing a DbeGetVersion request. 11605b261ecSmrg * This request returns the major and minor version numbers of this 11705b261ecSmrg * extension. 11805b261ecSmrg * 11905b261ecSmrg * Return Values: 12005b261ecSmrg * 12105b261ecSmrg * Success 12205b261ecSmrg * 12305b261ecSmrg *****************************************************************************/ 12405b261ecSmrg 12505b261ecSmrgstatic int 12605b261ecSmrgProcDbeGetVersion(ClientPtr client) 12705b261ecSmrg{ 12805b261ecSmrg /* REQUEST(xDbeGetVersionReq); */ 12905b261ecSmrg xDbeGetVersionReply rep; 13005b261ecSmrg register int n; 13105b261ecSmrg 13205b261ecSmrg 13305b261ecSmrg REQUEST_SIZE_MATCH(xDbeGetVersionReq); 13405b261ecSmrg 13505b261ecSmrg rep.type = X_Reply; 13605b261ecSmrg rep.length = 0; 13705b261ecSmrg rep.sequenceNumber = client->sequence; 13805b261ecSmrg rep.majorVersion = DBE_MAJOR_VERSION; 13905b261ecSmrg rep.minorVersion = DBE_MINOR_VERSION; 14005b261ecSmrg 14105b261ecSmrg if (client->swapped) 14205b261ecSmrg { 14305b261ecSmrg swaps(&rep.sequenceNumber, n); 14405b261ecSmrg } 14505b261ecSmrg 14605b261ecSmrg WriteToClient(client, sizeof(xDbeGetVersionReply), (char *)&rep); 14705b261ecSmrg 1486747b715Smrg return Success; 14905b261ecSmrg 15005b261ecSmrg} /* ProcDbeGetVersion() */ 15105b261ecSmrg 15205b261ecSmrg 15305b261ecSmrg/****************************************************************************** 15405b261ecSmrg * 15505b261ecSmrg * DBE DIX Procedure: ProcDbeAllocateBackBufferName 15605b261ecSmrg * 15705b261ecSmrg * Description: 15805b261ecSmrg * 15905b261ecSmrg * This function is for processing a DbeAllocateBackBufferName request. 16005b261ecSmrg * This request allocates a drawable ID used to refer to the back buffer 16105b261ecSmrg * of a window. 16205b261ecSmrg * 16305b261ecSmrg * Return Values: 16405b261ecSmrg * 16505b261ecSmrg * BadAlloc - server can not allocate resources 16605b261ecSmrg * BadIDChoice - id is out of range for client; id is already in use 16705b261ecSmrg * BadMatch - window is not an InputOutput window; 16805b261ecSmrg * visual of window is not on list returned by 16905b261ecSmrg * DBEGetVisualInfo; 17005b261ecSmrg * BadValue - invalid swap action is specified 17105b261ecSmrg * BadWindow - window is not a valid window 17205b261ecSmrg * Success 17305b261ecSmrg * 17405b261ecSmrg *****************************************************************************/ 17505b261ecSmrg 17605b261ecSmrgstatic int 17705b261ecSmrgProcDbeAllocateBackBufferName(ClientPtr client) 17805b261ecSmrg{ 17905b261ecSmrg REQUEST(xDbeAllocateBackBufferNameReq); 18005b261ecSmrg WindowPtr pWin; 18105b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 18205b261ecSmrg DbeWindowPrivPtr pDbeWindowPriv; 18305b261ecSmrg XdbeScreenVisualInfo scrVisInfo; 18405b261ecSmrg register int i; 18505b261ecSmrg Bool visualMatched = FALSE; 18605b261ecSmrg xDbeSwapAction swapAction; 18705b261ecSmrg VisualID visual; 18805b261ecSmrg int status; 1894642e01fSmrg int add_index; 19005b261ecSmrg 19105b261ecSmrg 19205b261ecSmrg REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq); 19305b261ecSmrg 19405b261ecSmrg /* The window must be valid. */ 1954642e01fSmrg status = dixLookupWindow(&pWin, stuff->window, client, DixManageAccess); 19605b261ecSmrg if (status != Success) 19705b261ecSmrg return status; 19805b261ecSmrg 19905b261ecSmrg /* The window must be InputOutput. */ 20005b261ecSmrg if (pWin->drawable.class != InputOutput) 20105b261ecSmrg { 2026747b715Smrg return BadMatch; 20305b261ecSmrg } 20405b261ecSmrg 20505b261ecSmrg /* The swap action must be valid. */ 20605b261ecSmrg swapAction = stuff->swapAction; /* use local var for performance. */ 20705b261ecSmrg if ((swapAction != XdbeUndefined ) && 20805b261ecSmrg (swapAction != XdbeBackground) && 20905b261ecSmrg (swapAction != XdbeUntouched ) && 21005b261ecSmrg (swapAction != XdbeCopied )) 21105b261ecSmrg { 2126747b715Smrg return BadValue; 21305b261ecSmrg } 21405b261ecSmrg 21505b261ecSmrg /* The id must be in range and not already in use. */ 21605b261ecSmrg LEGAL_NEW_RESOURCE(stuff->buffer, client); 21705b261ecSmrg 21805b261ecSmrg /* The visual of the window must be in the list returned by 21905b261ecSmrg * GetVisualInfo. 22005b261ecSmrg */ 22105b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(pWin); 22205b261ecSmrg if (!pDbeScreenPriv->GetVisualInfo) 2236747b715Smrg return BadMatch; /* screen doesn't support double buffering */ 22405b261ecSmrg 22505b261ecSmrg if (!(*pDbeScreenPriv->GetVisualInfo)(pWin->drawable.pScreen, &scrVisInfo)) 22605b261ecSmrg { 22705b261ecSmrg /* GetVisualInfo() failed to allocate visual info data. */ 2286747b715Smrg return BadAlloc; 22905b261ecSmrg } 23005b261ecSmrg 23105b261ecSmrg /* See if the window's visual is on the list. */ 23205b261ecSmrg visual = wVisual(pWin); 23305b261ecSmrg for (i = 0; (i < scrVisInfo.count) && !visualMatched; i++) 23405b261ecSmrg { 23505b261ecSmrg if (scrVisInfo.visinfo[i].visual == visual) 23605b261ecSmrg { 23705b261ecSmrg visualMatched = TRUE; 23805b261ecSmrg } 23905b261ecSmrg } 24005b261ecSmrg 24105b261ecSmrg /* Free what was allocated by the GetVisualInfo() call above. */ 2426747b715Smrg free(scrVisInfo.visinfo); 24305b261ecSmrg 24405b261ecSmrg if (!visualMatched) 24505b261ecSmrg { 2466747b715Smrg return BadMatch; 24705b261ecSmrg } 24805b261ecSmrg 24905b261ecSmrg if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin)) == NULL) 25005b261ecSmrg { 25105b261ecSmrg /* There is no buffer associated with the window. 25205b261ecSmrg * Allocate a window priv. 25305b261ecSmrg */ 25405b261ecSmrg 2556747b715Smrg pDbeWindowPriv = dixAllocateObjectWithPrivates(DbeWindowPrivRec, PRIVATE_DBE_WINDOW); 2564642e01fSmrg if (!pDbeWindowPriv) 2576747b715Smrg return BadAlloc; 25805b261ecSmrg 25905b261ecSmrg /* Fill out window priv information. */ 26005b261ecSmrg pDbeWindowPriv->pWindow = pWin; 26105b261ecSmrg pDbeWindowPriv->width = pWin->drawable.width; 26205b261ecSmrg pDbeWindowPriv->height = pWin->drawable.height; 26305b261ecSmrg pDbeWindowPriv->x = pWin->drawable.x; 26405b261ecSmrg pDbeWindowPriv->y = pWin->drawable.y; 26505b261ecSmrg pDbeWindowPriv->nBufferIDs = 0; 26605b261ecSmrg 26705b261ecSmrg /* Set the buffer ID array pointer to the initial (static) array). */ 26805b261ecSmrg pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs; 26905b261ecSmrg 27005b261ecSmrg /* Initialize the buffer ID list. */ 27105b261ecSmrg pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS; 27205b261ecSmrg pDbeWindowPriv->IDs[0] = stuff->buffer; 2734642e01fSmrg 2744642e01fSmrg add_index = 0; 2754642e01fSmrg for (i = 0; i < DBE_INIT_MAX_IDS; i++) 27605b261ecSmrg { 27705b261ecSmrg pDbeWindowPriv->IDs[i] = DBE_FREE_ID_ELEMENT; 27805b261ecSmrg } 27905b261ecSmrg 28005b261ecSmrg /* Actually connect the window priv to the window. */ 2814642e01fSmrg dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, pDbeWindowPriv); 28205b261ecSmrg 28305b261ecSmrg } /* if -- There is no buffer associated with the window. */ 28405b261ecSmrg 28505b261ecSmrg else 28605b261ecSmrg { 28705b261ecSmrg /* A buffer is already associated with the window. 28805b261ecSmrg * Add the new buffer ID to the array, reallocating the array memory 28905b261ecSmrg * if necessary. 29005b261ecSmrg */ 29105b261ecSmrg 29205b261ecSmrg /* Determine if there is a free element in the ID array. */ 29305b261ecSmrg for (i = 0; i < pDbeWindowPriv->maxAvailableIDs; i++) 29405b261ecSmrg { 29505b261ecSmrg if (pDbeWindowPriv->IDs[i] == DBE_FREE_ID_ELEMENT) 29605b261ecSmrg { 29705b261ecSmrg /* There is still room in the ID array. */ 29805b261ecSmrg break; 29905b261ecSmrg } 30005b261ecSmrg } 30105b261ecSmrg 30205b261ecSmrg if (i == pDbeWindowPriv->maxAvailableIDs) 30305b261ecSmrg { 30405b261ecSmrg /* No more room in the ID array -- reallocate another array. */ 30505b261ecSmrg XID *pIDs; 30605b261ecSmrg 30705b261ecSmrg /* Setup an array pointer for the realloc operation below. */ 30805b261ecSmrg if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS) 30905b261ecSmrg { 31005b261ecSmrg /* We will malloc a new array. */ 31105b261ecSmrg pIDs = NULL; 31205b261ecSmrg } 31305b261ecSmrg else 31405b261ecSmrg { 31505b261ecSmrg /* We will realloc a new array. */ 31605b261ecSmrg pIDs = pDbeWindowPriv->IDs; 31705b261ecSmrg } 31805b261ecSmrg 31905b261ecSmrg /* malloc/realloc a new array and initialize all elements to 0. */ 3206747b715Smrg pDbeWindowPriv->IDs = (XID *)realloc(pIDs, 32105b261ecSmrg (pDbeWindowPriv->maxAvailableIDs+DBE_INCR_MAX_IDS)*sizeof(XID)); 32205b261ecSmrg if (!pDbeWindowPriv->IDs) 32305b261ecSmrg { 3246747b715Smrg return BadAlloc; 32505b261ecSmrg } 32605b261ecSmrg memset(&pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs], 0, 32705b261ecSmrg (pDbeWindowPriv->maxAvailableIDs + DBE_INCR_MAX_IDS - 32805b261ecSmrg pDbeWindowPriv->nBufferIDs) * sizeof(XID)); 32905b261ecSmrg 33005b261ecSmrg if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS) 33105b261ecSmrg { 33205b261ecSmrg /* We just went from using the initial (static) array to a 33305b261ecSmrg * newly allocated array. Copy the IDs from the initial array 33405b261ecSmrg * to the new array. 33505b261ecSmrg */ 33605b261ecSmrg memcpy(pDbeWindowPriv->IDs, pDbeWindowPriv->initIDs, 33705b261ecSmrg DBE_INIT_MAX_IDS * sizeof(XID)); 33805b261ecSmrg } 33905b261ecSmrg 34005b261ecSmrg pDbeWindowPriv->maxAvailableIDs += DBE_INCR_MAX_IDS; 34105b261ecSmrg } 34205b261ecSmrg 3434642e01fSmrg add_index = i; 34405b261ecSmrg 34505b261ecSmrg } /* else -- A buffer is already associated with the window. */ 34605b261ecSmrg 34705b261ecSmrg 34805b261ecSmrg /* Call the DDX routine to allocate the back buffer. */ 34905b261ecSmrg status = (*pDbeScreenPriv->AllocBackBufferName)(pWin, stuff->buffer, 35005b261ecSmrg stuff->swapAction); 35105b261ecSmrg 3524642e01fSmrg if (status == Success) 35305b261ecSmrg { 3544642e01fSmrg pDbeWindowPriv->IDs[add_index] = stuff->buffer; 3554642e01fSmrg if (!AddResource(stuff->buffer, dbeWindowPrivResType, 3564642e01fSmrg (pointer)pDbeWindowPriv)) 3574642e01fSmrg { 3584642e01fSmrg pDbeWindowPriv->IDs[add_index] = DBE_FREE_ID_ELEMENT; 3594642e01fSmrg 3604642e01fSmrg if (pDbeWindowPriv->nBufferIDs == 0) { 3614642e01fSmrg status = BadAlloc; 3624642e01fSmrg goto out_free; 3634642e01fSmrg } 3644642e01fSmrg } 3654642e01fSmrg } else { 36605b261ecSmrg /* The DDX buffer allocation routine failed for the first buffer of 36705b261ecSmrg * this window. 36805b261ecSmrg */ 3694642e01fSmrg if (pDbeWindowPriv->nBufferIDs == 0) { 3704642e01fSmrg goto out_free; 3714642e01fSmrg } 37205b261ecSmrg } 37305b261ecSmrg 37405b261ecSmrg /* Increment the number of buffers (XIDs) associated with this window. */ 37505b261ecSmrg pDbeWindowPriv->nBufferIDs++; 37605b261ecSmrg 37705b261ecSmrg /* Set swap action on all calls. */ 37805b261ecSmrg pDbeWindowPriv->swapAction = stuff->swapAction; 37905b261ecSmrg 3806747b715Smrg return status; 38105b261ecSmrg 3824642e01fSmrgout_free: 3834642e01fSmrg dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, NULL); 3846747b715Smrg free(pDbeWindowPriv); 3856747b715Smrg return status; 3864642e01fSmrg 38705b261ecSmrg} /* ProcDbeAllocateBackBufferName() */ 38805b261ecSmrg 38905b261ecSmrg 39005b261ecSmrg/****************************************************************************** 39105b261ecSmrg * 39205b261ecSmrg * DBE DIX Procedure: ProcDbeDeallocateBackBufferName 39305b261ecSmrg * 39405b261ecSmrg * Description: 39505b261ecSmrg * 39605b261ecSmrg * This function is for processing a DbeDeallocateBackBufferName request. 39705b261ecSmrg * This request frees a drawable ID that was obtained by a 39805b261ecSmrg * DbeAllocateBackBufferName request. 39905b261ecSmrg * 40005b261ecSmrg * Return Values: 40105b261ecSmrg * 40205b261ecSmrg * BadBuffer - buffer to deallocate is not associated with a window 40305b261ecSmrg * Success 40405b261ecSmrg * 40505b261ecSmrg *****************************************************************************/ 40605b261ecSmrg 40705b261ecSmrgstatic int 40805b261ecSmrgProcDbeDeallocateBackBufferName(ClientPtr client) 40905b261ecSmrg{ 41005b261ecSmrg REQUEST(xDbeDeallocateBackBufferNameReq); 41105b261ecSmrg DbeWindowPrivPtr pDbeWindowPriv; 4126747b715Smrg int rc, i; 4136747b715Smrg pointer val; 41405b261ecSmrg 41505b261ecSmrg 41605b261ecSmrg REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq); 41705b261ecSmrg 41805b261ecSmrg /* Buffer name must be valid */ 4196747b715Smrg rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer, 4206747b715Smrg dbeWindowPrivResType, client, 4216747b715Smrg DixDestroyAccess); 4226747b715Smrg if (rc != Success) 4236747b715Smrg return rc; 4246747b715Smrg 4256747b715Smrg rc = dixLookupResourceByType(&val, stuff->buffer, dbeDrawableResType, 4266747b715Smrg client, DixDestroyAccess); 4276747b715Smrg if (rc != Success) 4286747b715Smrg return rc; 42905b261ecSmrg 43005b261ecSmrg /* Make sure that the id is valid for the window. 43105b261ecSmrg * This is paranoid code since we already looked up the ID by type 43205b261ecSmrg * above. 43305b261ecSmrg */ 43405b261ecSmrg 43505b261ecSmrg for (i = 0; i < pDbeWindowPriv->nBufferIDs; i++) 43605b261ecSmrg { 43705b261ecSmrg /* Loop through the ID list to find the ID. */ 43805b261ecSmrg if (pDbeWindowPriv->IDs[i] == stuff->buffer) 43905b261ecSmrg { 44005b261ecSmrg break; 44105b261ecSmrg } 44205b261ecSmrg } 44305b261ecSmrg 44405b261ecSmrg if (i == pDbeWindowPriv->nBufferIDs) 44505b261ecSmrg { 44605b261ecSmrg /* We did not find the ID in the ID list. */ 44705b261ecSmrg client->errorValue = stuff->buffer; 4486747b715Smrg return dbeErrorBase + DbeBadBuffer; 44905b261ecSmrg } 45005b261ecSmrg 45105b261ecSmrg FreeResource(stuff->buffer, RT_NONE); 45205b261ecSmrg 4536747b715Smrg return Success; 45405b261ecSmrg 45505b261ecSmrg} /* ProcDbeDeallocateBackBufferName() */ 45605b261ecSmrg 45705b261ecSmrg 45805b261ecSmrg/****************************************************************************** 45905b261ecSmrg * 46005b261ecSmrg * DBE DIX Procedure: ProcDbeSwapBuffers 46105b261ecSmrg * 46205b261ecSmrg * Description: 46305b261ecSmrg * 46405b261ecSmrg * This function is for processing a DbeSwapBuffers request. 46505b261ecSmrg * This request swaps the buffers for all windows listed, applying the 46605b261ecSmrg * appropriate swap action for each window. 46705b261ecSmrg * 46805b261ecSmrg * Return Values: 46905b261ecSmrg * 47005b261ecSmrg * BadAlloc - local allocation failed; this return value is not defined 47105b261ecSmrg * by the protocol 47205b261ecSmrg * BadMatch - a window in request is not double-buffered; a window in 47305b261ecSmrg * request is listed more than once 47405b261ecSmrg * BadValue - invalid swap action is specified; no swap action is 47505b261ecSmrg * specified 47605b261ecSmrg * BadWindow - a window in request is not valid 47705b261ecSmrg * Success 47805b261ecSmrg * 47905b261ecSmrg *****************************************************************************/ 48005b261ecSmrg 48105b261ecSmrgstatic int 48205b261ecSmrgProcDbeSwapBuffers(ClientPtr client) 48305b261ecSmrg{ 48405b261ecSmrg REQUEST(xDbeSwapBuffersReq); 48505b261ecSmrg WindowPtr pWin; 48605b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 48705b261ecSmrg DbeSwapInfoPtr swapInfo; 48805b261ecSmrg xDbeSwapInfo *dbeSwapInfo; 48905b261ecSmrg int error; 49005b261ecSmrg register int i, j; 49105b261ecSmrg int nStuff; 49205b261ecSmrg 49305b261ecSmrg 49405b261ecSmrg REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq); 49505b261ecSmrg nStuff = stuff->n; /* use local variable for performance. */ 49605b261ecSmrg 49705b261ecSmrg if (nStuff == 0) 49805b261ecSmrg { 4996747b715Smrg return Success; 50005b261ecSmrg } 50105b261ecSmrg 50205b261ecSmrg if (nStuff > UINT32_MAX / sizeof(DbeSwapInfoRec)) 50305b261ecSmrg return BadAlloc; 50405b261ecSmrg 50505b261ecSmrg /* Get to the swap info appended to the end of the request. */ 50605b261ecSmrg dbeSwapInfo = (xDbeSwapInfo *)&stuff[1]; 50705b261ecSmrg 50805b261ecSmrg /* Allocate array to record swap information. */ 5096747b715Smrg swapInfo = (DbeSwapInfoPtr)malloc(nStuff * sizeof(DbeSwapInfoRec)); 51005b261ecSmrg if (swapInfo == NULL) 51105b261ecSmrg { 5126747b715Smrg return BadAlloc; 51305b261ecSmrg } 51405b261ecSmrg 51505b261ecSmrg 51605b261ecSmrg for (i = 0; i < nStuff; i++) 51705b261ecSmrg { 51805b261ecSmrg /* Check all windows to swap. */ 51905b261ecSmrg 52005b261ecSmrg /* Each window must be a valid window - BadWindow. */ 52105b261ecSmrg error = dixLookupWindow(&pWin, dbeSwapInfo[i].window, client, 52205b261ecSmrg DixWriteAccess); 52305b261ecSmrg if (error != Success) { 5246747b715Smrg free(swapInfo); 52505b261ecSmrg return error; 52605b261ecSmrg } 52705b261ecSmrg 52805b261ecSmrg /* Each window must be double-buffered - BadMatch. */ 52905b261ecSmrg if (DBE_WINDOW_PRIV(pWin) == NULL) 53005b261ecSmrg { 5316747b715Smrg free(swapInfo); 5326747b715Smrg return BadMatch; 53305b261ecSmrg } 53405b261ecSmrg 53505b261ecSmrg /* Each window must only be specified once - BadMatch. */ 53605b261ecSmrg for (j = i + 1; j < nStuff; j++) 53705b261ecSmrg { 53805b261ecSmrg if (dbeSwapInfo[i].window == dbeSwapInfo[j].window) 53905b261ecSmrg { 5406747b715Smrg free(swapInfo); 5416747b715Smrg return BadMatch; 54205b261ecSmrg } 54305b261ecSmrg } 54405b261ecSmrg 54505b261ecSmrg /* Each swap action must be valid - BadValue. */ 54605b261ecSmrg if ((dbeSwapInfo[i].swapAction != XdbeUndefined ) && 54705b261ecSmrg (dbeSwapInfo[i].swapAction != XdbeBackground) && 54805b261ecSmrg (dbeSwapInfo[i].swapAction != XdbeUntouched ) && 54905b261ecSmrg (dbeSwapInfo[i].swapAction != XdbeCopied )) 55005b261ecSmrg { 5516747b715Smrg free(swapInfo); 5526747b715Smrg return BadValue; 55305b261ecSmrg } 55405b261ecSmrg 55505b261ecSmrg /* Everything checks out OK. Fill in the swap info array. */ 55605b261ecSmrg swapInfo[i].pWindow = pWin; 55705b261ecSmrg swapInfo[i].swapAction = dbeSwapInfo[i].swapAction; 55805b261ecSmrg 55905b261ecSmrg } /* for (i = 0; i < nStuff; i++) */ 56005b261ecSmrg 56105b261ecSmrg 56205b261ecSmrg /* Call the DDX routine to perform the swap(s). The DDX routine should 56305b261ecSmrg * scan the swap list (swap info), swap any buffers that it knows how to 56405b261ecSmrg * handle, delete them from the list, and update nStuff to indicate how 56505b261ecSmrg * many windows it did not handle. 56605b261ecSmrg * 56705b261ecSmrg * This scheme allows a range of sophistication in the DDX SwapBuffers() 56805b261ecSmrg * implementation. Naive implementations could just swap the first buffer 56905b261ecSmrg * in the list, move the last buffer to the front, decrement nStuff, and 57005b261ecSmrg * return. The next level of sophistication could be to scan the whole 57105b261ecSmrg * list for windows on the same screen. Up another level, the DDX routine 57205b261ecSmrg * could deal with cross-screen synchronization. 57305b261ecSmrg */ 57405b261ecSmrg 57505b261ecSmrg while (nStuff > 0) 57605b261ecSmrg { 57705b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW(swapInfo[0].pWindow); 57805b261ecSmrg error = (*pDbeScreenPriv->SwapBuffers)(client, &nStuff, swapInfo); 57905b261ecSmrg if (error != Success) 58005b261ecSmrg { 5816747b715Smrg free(swapInfo); 5826747b715Smrg return error; 58305b261ecSmrg } 58405b261ecSmrg } 58505b261ecSmrg 5866747b715Smrg free(swapInfo); 5876747b715Smrg return Success; 58805b261ecSmrg 58905b261ecSmrg} /* ProcDbeSwapBuffers() */ 59005b261ecSmrg 59105b261ecSmrg 59205b261ecSmrg/****************************************************************************** 59305b261ecSmrg * 59405b261ecSmrg * DBE DIX Procedure: ProcDbeBeginIdiom 59505b261ecSmrg * 59605b261ecSmrg * Description: 59705b261ecSmrg * 59805b261ecSmrg * This function is for processing a DbeBeginIdiom request. 59905b261ecSmrg * This request informs the server that a complex swap will immediately 60005b261ecSmrg * follow this request. 60105b261ecSmrg * 60205b261ecSmrg * Return Values: 60305b261ecSmrg * 60405b261ecSmrg * Success 60505b261ecSmrg * 60605b261ecSmrg *****************************************************************************/ 60705b261ecSmrg 60805b261ecSmrgstatic int 60905b261ecSmrgProcDbeBeginIdiom(ClientPtr client) 61005b261ecSmrg{ 61105b261ecSmrg /* REQUEST(xDbeBeginIdiomReq); */ 61205b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 61305b261ecSmrg register int i; 61405b261ecSmrg 61505b261ecSmrg 61605b261ecSmrg REQUEST_SIZE_MATCH(xDbeBeginIdiomReq); 61705b261ecSmrg 61805b261ecSmrg for (i = 0; i < screenInfo.numScreens; i++) 61905b261ecSmrg { 62005b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV(screenInfo.screens[i]); 62105b261ecSmrg 62205b261ecSmrg /* Call the DDX begin idiom procedure if there is one. */ 62305b261ecSmrg if (pDbeScreenPriv->BeginIdiom) 62405b261ecSmrg { 62505b261ecSmrg (*pDbeScreenPriv->BeginIdiom)(client); 62605b261ecSmrg } 62705b261ecSmrg } 62805b261ecSmrg 6296747b715Smrg return Success; 63005b261ecSmrg 63105b261ecSmrg} /* ProcDbeBeginIdiom() */ 63205b261ecSmrg 63305b261ecSmrg 63405b261ecSmrg/****************************************************************************** 63505b261ecSmrg * 63605b261ecSmrg * DBE DIX Procedure: ProcDbeGetVisualInfo 63705b261ecSmrg * 63805b261ecSmrg * Description: 63905b261ecSmrg * 64005b261ecSmrg * This function is for processing a ProcDbeGetVisualInfo request. 64105b261ecSmrg * This request returns information about which visuals support 64205b261ecSmrg * double buffering. 64305b261ecSmrg * 64405b261ecSmrg * Return Values: 64505b261ecSmrg * 64605b261ecSmrg * BadDrawable - value in screen specifiers is not a valid drawable 64705b261ecSmrg * Success 64805b261ecSmrg * 64905b261ecSmrg *****************************************************************************/ 65005b261ecSmrg 65105b261ecSmrgstatic int 65205b261ecSmrgProcDbeGetVisualInfo(ClientPtr client) 65305b261ecSmrg{ 65405b261ecSmrg REQUEST(xDbeGetVisualInfoReq); 65505b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 65605b261ecSmrg xDbeGetVisualInfoReply rep; 65705b261ecSmrg Drawable *drawables; 65805b261ecSmrg DrawablePtr *pDrawables = NULL; 65905b261ecSmrg register int i, j, n, rc; 66005b261ecSmrg register int count; /* number of visual infos in reply */ 66105b261ecSmrg register int length; /* length of reply */ 66205b261ecSmrg ScreenPtr pScreen; 66305b261ecSmrg XdbeScreenVisualInfo *pScrVisInfo; 66405b261ecSmrg 66505b261ecSmrg 66605b261ecSmrg REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq); 66705b261ecSmrg 66805b261ecSmrg if (stuff->n > UINT32_MAX / sizeof(DrawablePtr)) 66905b261ecSmrg return BadAlloc; 67005b261ecSmrg /* Make sure any specified drawables are valid. */ 67105b261ecSmrg if (stuff->n != 0) 67205b261ecSmrg { 6736747b715Smrg if (!(pDrawables = (DrawablePtr *)malloc(stuff->n * 67405b261ecSmrg sizeof(DrawablePtr)))) 67505b261ecSmrg { 6766747b715Smrg return BadAlloc; 67705b261ecSmrg } 67805b261ecSmrg 67905b261ecSmrg drawables = (Drawable *)&stuff[1]; 68005b261ecSmrg 68105b261ecSmrg for (i = 0; i < stuff->n; i++) 68205b261ecSmrg { 68305b261ecSmrg rc = dixLookupDrawable(pDrawables+i, drawables[i], client, 0, 6844642e01fSmrg DixGetAttrAccess); 68505b261ecSmrg if (rc != Success) { 6866747b715Smrg free(pDrawables); 68705b261ecSmrg return rc; 68805b261ecSmrg } 68905b261ecSmrg } 69005b261ecSmrg } 69105b261ecSmrg 69205b261ecSmrg count = (stuff->n == 0) ? screenInfo.numScreens : stuff->n; 6939ace9065Smrg if (!(pScrVisInfo = calloc(count, sizeof(XdbeScreenVisualInfo)))) 69405b261ecSmrg { 6956747b715Smrg free(pDrawables); 69605b261ecSmrg 6976747b715Smrg return BadAlloc; 69805b261ecSmrg } 69905b261ecSmrg 70005b261ecSmrg length = 0; 70105b261ecSmrg 70205b261ecSmrg for (i = 0; i < count; i++) 70305b261ecSmrg { 70405b261ecSmrg pScreen = (stuff->n == 0) ? screenInfo.screens[i] : 70505b261ecSmrg pDrawables[i]->pScreen; 70605b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); 70705b261ecSmrg 7084642e01fSmrg rc = XaceHook(XACE_SCREEN_ACCESS, client, pScreen, DixGetAttrAccess); 7099ace9065Smrg if (rc != Success) 7109ace9065Smrg goto freeScrVisInfo; 7119ace9065Smrg 7129ace9065Smrg if (!(*pDbeScreenPriv->GetVisualInfo)(pScreen, &pScrVisInfo[i])) 71305b261ecSmrg { 71405b261ecSmrg /* We failed to alloc pScrVisInfo[i].visinfo. */ 7159ace9065Smrg rc = BadAlloc; 71605b261ecSmrg 71705b261ecSmrg /* Free visinfos that we allocated for previous screen infos.*/ 7189ace9065Smrg goto freeScrVisInfo; 71905b261ecSmrg } 72005b261ecSmrg 72105b261ecSmrg /* Account for n, number of xDbeVisInfo items in list. */ 72205b261ecSmrg length += sizeof(CARD32); 72305b261ecSmrg 72405b261ecSmrg /* Account for n xDbeVisInfo items */ 72505b261ecSmrg length += pScrVisInfo[i].count * sizeof(xDbeVisInfo); 72605b261ecSmrg } 72705b261ecSmrg 72805b261ecSmrg rep.type = X_Reply; 72905b261ecSmrg rep.sequenceNumber = client->sequence; 7306747b715Smrg rep.length = bytes_to_int32(length); 73105b261ecSmrg rep.m = count; 73205b261ecSmrg 73305b261ecSmrg if (client->swapped) 73405b261ecSmrg { 73505b261ecSmrg swaps(&rep.sequenceNumber, n); 73605b261ecSmrg swapl(&rep.length, n); 73705b261ecSmrg swapl(&rep.m, n); 73805b261ecSmrg } 73905b261ecSmrg 74005b261ecSmrg /* Send off reply. */ 74105b261ecSmrg WriteToClient(client, sizeof(xDbeGetVisualInfoReply), (char *)&rep); 74205b261ecSmrg 74305b261ecSmrg for (i = 0; i < count; i++) 74405b261ecSmrg { 74505b261ecSmrg CARD32 data32; 74605b261ecSmrg 74705b261ecSmrg /* For each screen in the reply, send off the visual info */ 74805b261ecSmrg 74905b261ecSmrg /* Send off number of visuals. */ 75005b261ecSmrg data32 = (CARD32)pScrVisInfo[i].count; 75105b261ecSmrg 75205b261ecSmrg if (client->swapped) 75305b261ecSmrg { 75405b261ecSmrg swapl(&data32, n); 75505b261ecSmrg } 75605b261ecSmrg 75705b261ecSmrg WriteToClient(client, sizeof(CARD32), (char *)&data32); 75805b261ecSmrg 75905b261ecSmrg /* Now send off visual info items. */ 76005b261ecSmrg for (j = 0; j < pScrVisInfo[i].count; j++) 76105b261ecSmrg { 76205b261ecSmrg xDbeVisInfo visInfo; 76305b261ecSmrg 76405b261ecSmrg /* Copy the data in the client data structure to a protocol 76505b261ecSmrg * data structure. We will send data to the client from the 76605b261ecSmrg * protocol data structure. 76705b261ecSmrg */ 76805b261ecSmrg 76905b261ecSmrg visInfo.visualID = (CARD32)pScrVisInfo[i].visinfo[j].visual; 77005b261ecSmrg visInfo.depth = (CARD8) pScrVisInfo[i].visinfo[j].depth; 77105b261ecSmrg visInfo.perfLevel = (CARD8) pScrVisInfo[i].visinfo[j].perflevel; 77205b261ecSmrg 77305b261ecSmrg if (client->swapped) 77405b261ecSmrg { 77505b261ecSmrg swapl(&visInfo.visualID, n); 77605b261ecSmrg 77705b261ecSmrg /* We do not need to swap depth and perfLevel since they are 77805b261ecSmrg * already 1 byte quantities. 77905b261ecSmrg */ 78005b261ecSmrg } 78105b261ecSmrg 78205b261ecSmrg /* Write visualID(32), depth(8), perfLevel(8), and pad(16). */ 78305b261ecSmrg WriteToClient(client, 2*sizeof(CARD32), (char *)&visInfo.visualID); 78405b261ecSmrg } 78505b261ecSmrg } 78605b261ecSmrg 7879ace9065Smrg rc = Success; 7889ace9065Smrg 7899ace9065Smrg freeScrVisInfo: 79005b261ecSmrg /* Clean up memory. */ 79105b261ecSmrg for (i = 0; i < count; i++) 79205b261ecSmrg { 7936747b715Smrg free(pScrVisInfo[i].visinfo); 79405b261ecSmrg } 7956747b715Smrg free(pScrVisInfo); 79605b261ecSmrg 7976747b715Smrg free(pDrawables); 79805b261ecSmrg 7999ace9065Smrg return rc; 80005b261ecSmrg 80105b261ecSmrg} /* ProcDbeGetVisualInfo() */ 80205b261ecSmrg 80305b261ecSmrg 80405b261ecSmrg/****************************************************************************** 80505b261ecSmrg * 80605b261ecSmrg * DBE DIX Procedure: ProcDbeGetbackBufferAttributes 80705b261ecSmrg * 80805b261ecSmrg * Description: 80905b261ecSmrg * 81005b261ecSmrg * This function is for processing a ProcDbeGetbackBufferAttributes 81105b261ecSmrg * request. This request returns information about a back buffer. 81205b261ecSmrg * 81305b261ecSmrg * Return Values: 81405b261ecSmrg * 81505b261ecSmrg * Success 81605b261ecSmrg * 81705b261ecSmrg *****************************************************************************/ 81805b261ecSmrg 81905b261ecSmrgstatic int 82005b261ecSmrgProcDbeGetBackBufferAttributes(ClientPtr client) 82105b261ecSmrg{ 82205b261ecSmrg REQUEST(xDbeGetBackBufferAttributesReq); 82305b261ecSmrg xDbeGetBackBufferAttributesReply rep; 82405b261ecSmrg DbeWindowPrivPtr pDbeWindowPriv; 8256747b715Smrg int rc, n; 82605b261ecSmrg 82705b261ecSmrg 82805b261ecSmrg REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq); 82905b261ecSmrg 8306747b715Smrg rc = dixLookupResourceByType((pointer *)&pDbeWindowPriv, stuff->buffer, 8316747b715Smrg dbeWindowPrivResType, client, 8326747b715Smrg DixGetAttrAccess); 8336747b715Smrg if (rc == Success) 83405b261ecSmrg { 8356747b715Smrg rep.attributes = pDbeWindowPriv->pWindow->drawable.id; 83605b261ecSmrg } 83705b261ecSmrg else 83805b261ecSmrg { 8396747b715Smrg rep.attributes = None; 84005b261ecSmrg } 84105b261ecSmrg 84205b261ecSmrg rep.type = X_Reply; 84305b261ecSmrg rep.sequenceNumber = client->sequence; 84405b261ecSmrg rep.length = 0; 84505b261ecSmrg 84605b261ecSmrg if (client->swapped) 84705b261ecSmrg { 84805b261ecSmrg swaps(&rep.sequenceNumber, n); 84905b261ecSmrg swapl(&rep.length, n); 85005b261ecSmrg swapl(&rep.attributes, n); 85105b261ecSmrg } 85205b261ecSmrg 85305b261ecSmrg WriteToClient(client, sizeof(xDbeGetBackBufferAttributesReply), 85405b261ecSmrg (char *)&rep); 8556747b715Smrg return Success; 85605b261ecSmrg 85705b261ecSmrg} /* ProcDbeGetbackBufferAttributes() */ 85805b261ecSmrg 85905b261ecSmrg 86005b261ecSmrg/****************************************************************************** 86105b261ecSmrg * 86205b261ecSmrg * DBE DIX Procedure: ProcDbeDispatch 86305b261ecSmrg * 86405b261ecSmrg * Description: 86505b261ecSmrg * 86605b261ecSmrg * This function dispatches DBE requests. 86705b261ecSmrg * 86805b261ecSmrg *****************************************************************************/ 86905b261ecSmrg 87005b261ecSmrgstatic int 87105b261ecSmrgProcDbeDispatch(ClientPtr client) 87205b261ecSmrg{ 87305b261ecSmrg REQUEST(xReq); 87405b261ecSmrg 87505b261ecSmrg 87605b261ecSmrg switch (stuff->data) 87705b261ecSmrg { 87805b261ecSmrg case X_DbeGetVersion: 87905b261ecSmrg return(ProcDbeGetVersion(client)); 88005b261ecSmrg 88105b261ecSmrg case X_DbeAllocateBackBufferName: 88205b261ecSmrg return(ProcDbeAllocateBackBufferName(client)); 88305b261ecSmrg 88405b261ecSmrg case X_DbeDeallocateBackBufferName: 88505b261ecSmrg return(ProcDbeDeallocateBackBufferName(client)); 88605b261ecSmrg 88705b261ecSmrg case X_DbeSwapBuffers: 88805b261ecSmrg return(ProcDbeSwapBuffers(client)); 88905b261ecSmrg 89005b261ecSmrg case X_DbeBeginIdiom: 89105b261ecSmrg return(ProcDbeBeginIdiom(client)); 89205b261ecSmrg 89305b261ecSmrg case X_DbeEndIdiom: 8946747b715Smrg return Success; 89505b261ecSmrg 89605b261ecSmrg case X_DbeGetVisualInfo: 89705b261ecSmrg return(ProcDbeGetVisualInfo(client)); 89805b261ecSmrg 89905b261ecSmrg case X_DbeGetBackBufferAttributes: 90005b261ecSmrg return(ProcDbeGetBackBufferAttributes(client)); 90105b261ecSmrg 90205b261ecSmrg default: 9036747b715Smrg return BadRequest; 90405b261ecSmrg } 90505b261ecSmrg 90605b261ecSmrg} /* ProcDbeDispatch() */ 90705b261ecSmrg 90805b261ecSmrg 90905b261ecSmrg/****************************************************************************** 91005b261ecSmrg * 91105b261ecSmrg * DBE DIX Procedure: SProcDbeGetVersion 91205b261ecSmrg * 91305b261ecSmrg * Description: 91405b261ecSmrg * 91505b261ecSmrg * This function is for processing a DbeGetVersion request on a swapped 91605b261ecSmrg * server. This request returns the major and minor version numbers of 91705b261ecSmrg * this extension. 91805b261ecSmrg * 91905b261ecSmrg * Return Values: 92005b261ecSmrg * 92105b261ecSmrg * Success 92205b261ecSmrg * 92305b261ecSmrg *****************************************************************************/ 92405b261ecSmrg 92505b261ecSmrgstatic int 92605b261ecSmrgSProcDbeGetVersion(ClientPtr client) 92705b261ecSmrg{ 92805b261ecSmrg REQUEST(xDbeGetVersionReq); 92905b261ecSmrg register int n; 93005b261ecSmrg 93105b261ecSmrg 93205b261ecSmrg swaps(&stuff->length, n); 93305b261ecSmrg return(ProcDbeGetVersion(client)); 93405b261ecSmrg 93505b261ecSmrg} /* SProcDbeGetVersion() */ 93605b261ecSmrg 93705b261ecSmrg 93805b261ecSmrg/****************************************************************************** 93905b261ecSmrg * 94005b261ecSmrg * DBE DIX Procedure: SProcDbeAllocateBackBufferName 94105b261ecSmrg * 94205b261ecSmrg * Description: 94305b261ecSmrg * 94405b261ecSmrg * This function is for processing a DbeAllocateBackBufferName request on 94505b261ecSmrg * a swapped server. This request allocates a drawable ID used to refer 94605b261ecSmrg * to the back buffer of a window. 94705b261ecSmrg * 94805b261ecSmrg * Return Values: 94905b261ecSmrg * 95005b261ecSmrg * BadAlloc - server can not allocate resources 95105b261ecSmrg * BadIDChoice - id is out of range for client; id is already in use 95205b261ecSmrg * BadMatch - window is not an InputOutput window; 95305b261ecSmrg * visual of window is not on list returned by 95405b261ecSmrg * DBEGetVisualInfo; 95505b261ecSmrg * BadValue - invalid swap action is specified 95605b261ecSmrg * BadWindow - window is not a valid window 95705b261ecSmrg * Success 95805b261ecSmrg * 95905b261ecSmrg *****************************************************************************/ 96005b261ecSmrg 96105b261ecSmrgstatic int 96205b261ecSmrgSProcDbeAllocateBackBufferName(ClientPtr client) 96305b261ecSmrg{ 96405b261ecSmrg REQUEST(xDbeAllocateBackBufferNameReq); 96505b261ecSmrg register int n; 96605b261ecSmrg 96705b261ecSmrg swaps(&stuff->length, n); 96805b261ecSmrg REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq); 96905b261ecSmrg 97005b261ecSmrg swapl(&stuff->window, n); 97105b261ecSmrg swapl(&stuff->buffer, n); 97205b261ecSmrg /* stuff->swapAction is a byte. We do not need to swap this field. */ 97305b261ecSmrg 97405b261ecSmrg return(ProcDbeAllocateBackBufferName(client)); 97505b261ecSmrg 97605b261ecSmrg} /* SProcDbeAllocateBackBufferName() */ 97705b261ecSmrg 97805b261ecSmrg 97905b261ecSmrg/****************************************************************************** 98005b261ecSmrg * 98105b261ecSmrg * DBE DIX Procedure: SProcDbeDeallocateBackBufferName 98205b261ecSmrg * 98305b261ecSmrg * Description: 98405b261ecSmrg * 98505b261ecSmrg * This function is for processing a DbeDeallocateBackBufferName request 98605b261ecSmrg * on a swapped server. This request frees a drawable ID that was 98705b261ecSmrg * obtained by a DbeAllocateBackBufferName request. 98805b261ecSmrg * 98905b261ecSmrg * Return Values: 99005b261ecSmrg * 99105b261ecSmrg * BadBuffer - buffer to deallocate is not associated with a window 99205b261ecSmrg * Success 99305b261ecSmrg * 99405b261ecSmrg *****************************************************************************/ 99505b261ecSmrg 99605b261ecSmrgstatic int 99705b261ecSmrgSProcDbeDeallocateBackBufferName(ClientPtr client) 99805b261ecSmrg{ 99905b261ecSmrg REQUEST (xDbeDeallocateBackBufferNameReq); 100005b261ecSmrg register int n; 100105b261ecSmrg 100205b261ecSmrg 100305b261ecSmrg swaps(&stuff->length, n); 100405b261ecSmrg REQUEST_SIZE_MATCH(xDbeDeallocateBackBufferNameReq); 100505b261ecSmrg 100605b261ecSmrg swapl(&stuff->buffer, n); 100705b261ecSmrg 100805b261ecSmrg return(ProcDbeDeallocateBackBufferName(client)); 100905b261ecSmrg 101005b261ecSmrg} /* SProcDbeDeallocateBackBufferName() */ 101105b261ecSmrg 101205b261ecSmrg 101305b261ecSmrg/****************************************************************************** 101405b261ecSmrg * 101505b261ecSmrg * DBE DIX Procedure: SProcDbeSwapBuffers 101605b261ecSmrg * 101705b261ecSmrg * Description: 101805b261ecSmrg * 101905b261ecSmrg * This function is for processing a DbeSwapBuffers request on a swapped 102005b261ecSmrg * server. This request swaps the buffers for all windows listed, 102105b261ecSmrg * applying the appropriate swap action for each window. 102205b261ecSmrg * 102305b261ecSmrg * Return Values: 102405b261ecSmrg * 102505b261ecSmrg * BadMatch - a window in request is not double-buffered; a window in 102605b261ecSmrg * request is listed more than once; all windows in request do 102705b261ecSmrg * not have the same root 102805b261ecSmrg * BadValue - invalid swap action is specified 102905b261ecSmrg * BadWindow - a window in request is not valid 103005b261ecSmrg * Success 103105b261ecSmrg * 103205b261ecSmrg *****************************************************************************/ 103305b261ecSmrg 103405b261ecSmrgstatic int 103505b261ecSmrgSProcDbeSwapBuffers(ClientPtr client) 103605b261ecSmrg{ 103705b261ecSmrg REQUEST(xDbeSwapBuffersReq); 103805b261ecSmrg register int i, n; 103905b261ecSmrg xDbeSwapInfo *pSwapInfo; 104005b261ecSmrg 104105b261ecSmrg 104205b261ecSmrg swaps(&stuff->length, n); 104305b261ecSmrg REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq); 104405b261ecSmrg 104505b261ecSmrg swapl(&stuff->n, n); 104605b261ecSmrg 104705b261ecSmrg if (stuff->n != 0) 104805b261ecSmrg { 104905b261ecSmrg pSwapInfo = (xDbeSwapInfo *)stuff+1; 105005b261ecSmrg 105105b261ecSmrg /* The swap info following the fix part of this request is a window(32) 105205b261ecSmrg * followed by a 1 byte swap action and then 3 pad bytes. We only need 105305b261ecSmrg * to swap the window information. 105405b261ecSmrg */ 105505b261ecSmrg for (i = 0; i < stuff->n; i++) 105605b261ecSmrg { 105705b261ecSmrg swapl(&pSwapInfo->window, n); 105805b261ecSmrg } 105905b261ecSmrg } 106005b261ecSmrg 106105b261ecSmrg return(ProcDbeSwapBuffers(client)); 106205b261ecSmrg 106305b261ecSmrg} /* SProcDbeSwapBuffers() */ 106405b261ecSmrg 106505b261ecSmrg 106605b261ecSmrg/****************************************************************************** 106705b261ecSmrg * 106805b261ecSmrg * DBE DIX Procedure: SProcDbeBeginIdiom 106905b261ecSmrg * 107005b261ecSmrg * Description: 107105b261ecSmrg * 107205b261ecSmrg * This function is for processing a DbeBeginIdiom request on a swapped 107305b261ecSmrg * server. This request informs the server that a complex swap will 107405b261ecSmrg * immediately follow this request. 107505b261ecSmrg * 107605b261ecSmrg * Return Values: 107705b261ecSmrg * 107805b261ecSmrg * Success 107905b261ecSmrg * 108005b261ecSmrg *****************************************************************************/ 108105b261ecSmrg 108205b261ecSmrgstatic int 108305b261ecSmrgSProcDbeBeginIdiom(ClientPtr client) 108405b261ecSmrg{ 108505b261ecSmrg REQUEST(xDbeBeginIdiomReq); 108605b261ecSmrg register int n; 108705b261ecSmrg 108805b261ecSmrg swaps(&stuff->length, n); 108905b261ecSmrg return(ProcDbeBeginIdiom(client)); 109005b261ecSmrg 109105b261ecSmrg} /* SProcDbeBeginIdiom() */ 109205b261ecSmrg 109305b261ecSmrg 109405b261ecSmrg/****************************************************************************** 109505b261ecSmrg * 109605b261ecSmrg * DBE DIX Procedure: SProcDbeGetVisualInfo 109705b261ecSmrg * 109805b261ecSmrg * Description: 109905b261ecSmrg * 110005b261ecSmrg * This function is for processing a ProcDbeGetVisualInfo request on a 110105b261ecSmrg * swapped server. This request returns information about which visuals 110205b261ecSmrg * support double buffering. 110305b261ecSmrg * 110405b261ecSmrg * Return Values: 110505b261ecSmrg * 110605b261ecSmrg * BadDrawable - value in screen specifiers is not a valid drawable 110705b261ecSmrg * Success 110805b261ecSmrg * 110905b261ecSmrg *****************************************************************************/ 111005b261ecSmrg 111105b261ecSmrgstatic int 111205b261ecSmrgSProcDbeGetVisualInfo(ClientPtr client) 111305b261ecSmrg{ 111405b261ecSmrg REQUEST(xDbeGetVisualInfoReq); 111505b261ecSmrg register int n; 111605b261ecSmrg 111705b261ecSmrg 111805b261ecSmrg swaps(&stuff->length, n); 111905b261ecSmrg REQUEST_AT_LEAST_SIZE(xDbeGetVisualInfoReq); 112005b261ecSmrg 112105b261ecSmrg swapl(&stuff->n, n); 112205b261ecSmrg SwapRestL(stuff); 112305b261ecSmrg 112405b261ecSmrg return(ProcDbeGetVisualInfo(client)); 112505b261ecSmrg 112605b261ecSmrg} /* SProcDbeGetVisualInfo() */ 112705b261ecSmrg 112805b261ecSmrg 112905b261ecSmrg/****************************************************************************** 113005b261ecSmrg * 113105b261ecSmrg * DBE DIX Procedure: SProcDbeGetbackBufferAttributes 113205b261ecSmrg * 113305b261ecSmrg * Description: 113405b261ecSmrg * 113505b261ecSmrg * This function is for processing a ProcDbeGetbackBufferAttributes 113605b261ecSmrg * request on a swapped server. This request returns information about a 113705b261ecSmrg * back buffer. 113805b261ecSmrg * 113905b261ecSmrg * Return Values: 114005b261ecSmrg * 114105b261ecSmrg * Success 114205b261ecSmrg * 114305b261ecSmrg *****************************************************************************/ 114405b261ecSmrg 114505b261ecSmrgstatic int 114605b261ecSmrgSProcDbeGetBackBufferAttributes(ClientPtr client) 114705b261ecSmrg{ 114805b261ecSmrg REQUEST (xDbeGetBackBufferAttributesReq); 114905b261ecSmrg register int n; 115005b261ecSmrg 115105b261ecSmrg swaps(&stuff->length, n); 115205b261ecSmrg REQUEST_SIZE_MATCH(xDbeGetBackBufferAttributesReq); 115305b261ecSmrg 115405b261ecSmrg swapl(&stuff->buffer, n); 115505b261ecSmrg 115605b261ecSmrg return(ProcDbeGetBackBufferAttributes(client)); 115705b261ecSmrg 115805b261ecSmrg} /* SProcDbeGetBackBufferAttributes() */ 115905b261ecSmrg 116005b261ecSmrg 116105b261ecSmrg/****************************************************************************** 116205b261ecSmrg * 116305b261ecSmrg * DBE DIX Procedure: SProcDbeDispatch 116405b261ecSmrg * 116505b261ecSmrg * Description: 116605b261ecSmrg * 116705b261ecSmrg * This function dispatches DBE requests on a swapped server. 116805b261ecSmrg * 116905b261ecSmrg *****************************************************************************/ 117005b261ecSmrg 117105b261ecSmrgstatic int 117205b261ecSmrgSProcDbeDispatch(ClientPtr client) 117305b261ecSmrg{ 117405b261ecSmrg REQUEST(xReq); 117505b261ecSmrg 117605b261ecSmrg 117705b261ecSmrg switch (stuff->data) 117805b261ecSmrg { 117905b261ecSmrg case X_DbeGetVersion: 118005b261ecSmrg return(SProcDbeGetVersion(client)); 118105b261ecSmrg 118205b261ecSmrg case X_DbeAllocateBackBufferName: 118305b261ecSmrg return(SProcDbeAllocateBackBufferName(client)); 118405b261ecSmrg 118505b261ecSmrg case X_DbeDeallocateBackBufferName: 118605b261ecSmrg return(SProcDbeDeallocateBackBufferName(client)); 118705b261ecSmrg 118805b261ecSmrg case X_DbeSwapBuffers: 118905b261ecSmrg return(SProcDbeSwapBuffers(client)); 119005b261ecSmrg 119105b261ecSmrg case X_DbeBeginIdiom: 119205b261ecSmrg return(SProcDbeBeginIdiom(client)); 119305b261ecSmrg 119405b261ecSmrg case X_DbeEndIdiom: 11956747b715Smrg return Success; 119605b261ecSmrg 119705b261ecSmrg case X_DbeGetVisualInfo: 119805b261ecSmrg return(SProcDbeGetVisualInfo(client)); 119905b261ecSmrg 120005b261ecSmrg case X_DbeGetBackBufferAttributes: 120105b261ecSmrg return(SProcDbeGetBackBufferAttributes(client)); 120205b261ecSmrg 120305b261ecSmrg default: 12046747b715Smrg return BadRequest; 120505b261ecSmrg } 120605b261ecSmrg 120705b261ecSmrg} /* SProcDbeDispatch() */ 120805b261ecSmrg 120905b261ecSmrg 121005b261ecSmrg/****************************************************************************** 121105b261ecSmrg * 121205b261ecSmrg * DBE DIX Procedure: DbeSetupBackgroundPainter 121305b261ecSmrg * 121405b261ecSmrg * Description: 121505b261ecSmrg * 121605b261ecSmrg * This function sets up pGC to clear pixmaps. 121705b261ecSmrg * 121805b261ecSmrg * Return Values: 121905b261ecSmrg * 122005b261ecSmrg * TRUE - setup was successful 122105b261ecSmrg * FALSE - the window's background state is NONE 122205b261ecSmrg * 122305b261ecSmrg *****************************************************************************/ 122405b261ecSmrg 122505b261ecSmrgstatic Bool 122605b261ecSmrgDbeSetupBackgroundPainter(WindowPtr pWin, GCPtr pGC) 122705b261ecSmrg{ 12286747b715Smrg ChangeGCVal gcvalues[4]; 122905b261ecSmrg int ts_x_origin, ts_y_origin; 123005b261ecSmrg PixUnion background; 123105b261ecSmrg int backgroundState; 123205b261ecSmrg Mask gcmask; 123305b261ecSmrg 123405b261ecSmrg 123505b261ecSmrg /* First take care of any ParentRelative stuff by altering the 123605b261ecSmrg * tile/stipple origin to match the coordinates of the upper-left 123705b261ecSmrg * corner of the first ancestor without a ParentRelative background. 123805b261ecSmrg * This coordinate is, of course, negative. 123905b261ecSmrg */ 124005b261ecSmrg ts_x_origin = ts_y_origin = 0; 124105b261ecSmrg while (pWin->backgroundState == ParentRelative) 124205b261ecSmrg { 124305b261ecSmrg ts_x_origin -= pWin->origin.x; 124405b261ecSmrg ts_y_origin -= pWin->origin.y; 124505b261ecSmrg 124605b261ecSmrg pWin = pWin->parent; 124705b261ecSmrg } 124805b261ecSmrg backgroundState = pWin->backgroundState; 124905b261ecSmrg background = pWin->background; 125005b261ecSmrg 125105b261ecSmrg switch (backgroundState) 125205b261ecSmrg { 125305b261ecSmrg case BackgroundPixel: 12546747b715Smrg gcvalues[0].val = background.pixel; 12556747b715Smrg gcvalues[1].val = FillSolid; 125605b261ecSmrg gcmask = GCForeground|GCFillStyle; 125705b261ecSmrg break; 125805b261ecSmrg 125905b261ecSmrg case BackgroundPixmap: 12606747b715Smrg gcvalues[0].val = FillTiled; 12616747b715Smrg gcvalues[1].ptr = background.pixmap; 12626747b715Smrg gcvalues[2].val = ts_x_origin; 12636747b715Smrg gcvalues[3].val = ts_y_origin; 126405b261ecSmrg gcmask = GCFillStyle|GCTile|GCTileStipXOrigin|GCTileStipYOrigin; 126505b261ecSmrg break; 126605b261ecSmrg 126705b261ecSmrg default: 126805b261ecSmrg /* pWin->backgroundState == None */ 12696747b715Smrg return FALSE; 127005b261ecSmrg } 127105b261ecSmrg 12726747b715Smrg return ChangeGC(NullClient, pGC, gcmask, gcvalues) == 0; 127305b261ecSmrg} /* DbeSetupBackgroundPainter() */ 127405b261ecSmrg 127505b261ecSmrg 127605b261ecSmrg/****************************************************************************** 127705b261ecSmrg * 127805b261ecSmrg * DBE DIX Procedure: DbeDrawableDelete 127905b261ecSmrg * 128005b261ecSmrg * Description: 128105b261ecSmrg * 128205b261ecSmrg * This is the resource delete function for dbeDrawableResType. 128305b261ecSmrg * It is registered when the drawable resource type is created in 128405b261ecSmrg * DbeExtensionInit(). 128505b261ecSmrg * 128605b261ecSmrg * To make resource deletion simple, we do not do anything in this function 128705b261ecSmrg * and leave all resource deleteion to DbeWindowPrivDelete(), which will 128805b261ecSmrg * eventually be called or already has been called. Deletion functions are 128905b261ecSmrg * not guaranteed to be called in any particular order. 129005b261ecSmrg * 129105b261ecSmrg *****************************************************************************/ 129205b261ecSmrgstatic int 129305b261ecSmrgDbeDrawableDelete(pointer pDrawable, XID id) 129405b261ecSmrg{ 12956747b715Smrg return Success; 129605b261ecSmrg 129705b261ecSmrg} /* DbeDrawableDelete() */ 129805b261ecSmrg 129905b261ecSmrg 130005b261ecSmrg/****************************************************************************** 130105b261ecSmrg * 130205b261ecSmrg * DBE DIX Procedure: DbeWindowPrivDelete 130305b261ecSmrg * 130405b261ecSmrg * Description: 130505b261ecSmrg * 130605b261ecSmrg * This is the resource delete function for dbeWindowPrivResType. 130705b261ecSmrg * It is registered when the drawable resource type is created in 130805b261ecSmrg * DbeExtensionInit(). 130905b261ecSmrg * 131005b261ecSmrg *****************************************************************************/ 131105b261ecSmrgstatic int 131205b261ecSmrgDbeWindowPrivDelete(pointer pDbeWinPriv, XID id) 131305b261ecSmrg{ 131405b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 131505b261ecSmrg DbeWindowPrivPtr pDbeWindowPriv = (DbeWindowPrivPtr)pDbeWinPriv; 131605b261ecSmrg int i; 131705b261ecSmrg 131805b261ecSmrg 131905b261ecSmrg /* 132005b261ecSmrg ************************************************************************** 132105b261ecSmrg ** Remove the buffer ID from the ID array. 132205b261ecSmrg ************************************************************************** 132305b261ecSmrg */ 132405b261ecSmrg 132505b261ecSmrg /* Find the ID in the ID array. */ 132605b261ecSmrg i = 0; 132705b261ecSmrg while ((i < pDbeWindowPriv->nBufferIDs) && (pDbeWindowPriv->IDs[i] != id)) 132805b261ecSmrg { 132905b261ecSmrg i++; 133005b261ecSmrg } 133105b261ecSmrg 133205b261ecSmrg if (i == pDbeWindowPriv->nBufferIDs) 133305b261ecSmrg { 133405b261ecSmrg /* We did not find the ID in the array. We should never get here. */ 13356747b715Smrg return BadValue; 133605b261ecSmrg } 133705b261ecSmrg 133805b261ecSmrg /* Remove the ID from the array. */ 133905b261ecSmrg 134005b261ecSmrg if (i < (pDbeWindowPriv->nBufferIDs - 1)) 134105b261ecSmrg { 134205b261ecSmrg /* Compress the buffer ID array, overwriting the ID in the process. */ 134305b261ecSmrg memmove(&pDbeWindowPriv->IDs[i], &pDbeWindowPriv->IDs[i+1], 134405b261ecSmrg (pDbeWindowPriv->nBufferIDs - i - 1) * sizeof(XID)); 134505b261ecSmrg } 134605b261ecSmrg else 134705b261ecSmrg { 134805b261ecSmrg /* We are removing the last ID in the array, in which case, the 134905b261ecSmrg * assignement below is all that we need to do. 135005b261ecSmrg */ 135105b261ecSmrg } 135205b261ecSmrg pDbeWindowPriv->IDs[pDbeWindowPriv->nBufferIDs - 1] = DBE_FREE_ID_ELEMENT; 135305b261ecSmrg 135405b261ecSmrg pDbeWindowPriv->nBufferIDs--; 135505b261ecSmrg 135605b261ecSmrg /* If an extended array was allocated, then check to see if the remaining 135705b261ecSmrg * buffer IDs will fit in the static array. 135805b261ecSmrg */ 135905b261ecSmrg 136005b261ecSmrg if ((pDbeWindowPriv->maxAvailableIDs > DBE_INIT_MAX_IDS) && 136105b261ecSmrg (pDbeWindowPriv->nBufferIDs == DBE_INIT_MAX_IDS)) 136205b261ecSmrg { 136305b261ecSmrg /* Copy the IDs back into the static array. */ 136405b261ecSmrg memcpy(pDbeWindowPriv->initIDs, pDbeWindowPriv->IDs, 136505b261ecSmrg DBE_INIT_MAX_IDS * sizeof(XID)); 136605b261ecSmrg 136705b261ecSmrg /* Free the extended array; use the static array. */ 13686747b715Smrg free(pDbeWindowPriv->IDs); 136905b261ecSmrg pDbeWindowPriv->IDs = pDbeWindowPriv->initIDs; 137005b261ecSmrg pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS; 137105b261ecSmrg } 137205b261ecSmrg 137305b261ecSmrg 137405b261ecSmrg /* 137505b261ecSmrg ************************************************************************** 137605b261ecSmrg ** Perform DDX level tasks. 137705b261ecSmrg ************************************************************************** 137805b261ecSmrg */ 137905b261ecSmrg 138005b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV_FROM_WINDOW_PRIV( 138105b261ecSmrg (DbeWindowPrivPtr)pDbeWindowPriv); 138205b261ecSmrg (*pDbeScreenPriv->WinPrivDelete)((DbeWindowPrivPtr)pDbeWindowPriv, id); 138305b261ecSmrg 138405b261ecSmrg 138505b261ecSmrg /* 138605b261ecSmrg ************************************************************************** 138705b261ecSmrg ** Perform miscellaneous tasks if this is the last buffer associated 138805b261ecSmrg ** with the window. 138905b261ecSmrg ************************************************************************** 139005b261ecSmrg */ 139105b261ecSmrg 139205b261ecSmrg if (pDbeWindowPriv->nBufferIDs == 0) 139305b261ecSmrg { 139405b261ecSmrg /* Reset the DBE window priv pointer. */ 13954642e01fSmrg dixSetPrivate(&pDbeWindowPriv->pWindow->devPrivates, dbeWindowPrivKey, 13964642e01fSmrg NULL); 139705b261ecSmrg 139805b261ecSmrg /* We are done with the window priv. */ 13996747b715Smrg dixFreeObjectWithPrivates(pDbeWindowPriv, PRIVATE_DBE_WINDOW); 140005b261ecSmrg } 140105b261ecSmrg 14026747b715Smrg return Success; 140305b261ecSmrg 140405b261ecSmrg} /* DbeWindowPrivDelete() */ 140505b261ecSmrg 140605b261ecSmrg 140705b261ecSmrg/****************************************************************************** 140805b261ecSmrg * 140905b261ecSmrg * DBE DIX Procedure: DbeResetProc 141005b261ecSmrg * 141105b261ecSmrg * Description: 141205b261ecSmrg * 141305b261ecSmrg * This routine is called at the end of every server generation. 141405b261ecSmrg * It deallocates any memory reserved for the extension and performs any 141505b261ecSmrg * other tasks related to shutting down the extension. 141605b261ecSmrg * 141705b261ecSmrg *****************************************************************************/ 141805b261ecSmrgstatic void 141905b261ecSmrgDbeResetProc(ExtensionEntry *extEntry) 142005b261ecSmrg{ 142105b261ecSmrg int i; 142205b261ecSmrg ScreenPtr pScreen; 142305b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 142405b261ecSmrg 142505b261ecSmrg for (i = 0; i < screenInfo.numScreens; i++) 142605b261ecSmrg { 142705b261ecSmrg pScreen = screenInfo.screens[i]; 142805b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); 142905b261ecSmrg 143005b261ecSmrg if (pDbeScreenPriv) 143105b261ecSmrg { 143205b261ecSmrg /* Unwrap DestroyWindow, which was wrapped in DbeExtensionInit().*/ 143305b261ecSmrg pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow; 143405b261ecSmrg 143505b261ecSmrg if (pDbeScreenPriv->ResetProc) 143605b261ecSmrg (*pDbeScreenPriv->ResetProc)(pScreen); 143705b261ecSmrg 14386747b715Smrg free(pDbeScreenPriv); 143905b261ecSmrg } 144005b261ecSmrg } 144105b261ecSmrg} /* DbeResetProc() */ 144205b261ecSmrg 144305b261ecSmrg 144405b261ecSmrg/****************************************************************************** 144505b261ecSmrg * 144605b261ecSmrg * DBE DIX Procedure: DbeDestroyWindow 144705b261ecSmrg * 144805b261ecSmrg * Description: 144905b261ecSmrg * 145005b261ecSmrg * This is the wrapper for pScreen->DestroyWindow. 145105b261ecSmrg * This function frees buffer resources for a window before it is 145205b261ecSmrg * destroyed. 145305b261ecSmrg * 145405b261ecSmrg *****************************************************************************/ 145505b261ecSmrg 145605b261ecSmrgstatic Bool 145705b261ecSmrgDbeDestroyWindow(WindowPtr pWin) 145805b261ecSmrg{ 145905b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 146005b261ecSmrg DbeWindowPrivPtr pDbeWindowPriv; 146105b261ecSmrg ScreenPtr pScreen; 146205b261ecSmrg Bool ret; 146305b261ecSmrg 146405b261ecSmrg 146505b261ecSmrg /* 146605b261ecSmrg ************************************************************************** 146705b261ecSmrg ** 1. Unwrap the member routine. 146805b261ecSmrg ************************************************************************** 146905b261ecSmrg */ 147005b261ecSmrg 147105b261ecSmrg pScreen = pWin->drawable.pScreen; 147205b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); 147305b261ecSmrg pScreen->DestroyWindow = pDbeScreenPriv->DestroyWindow; 147405b261ecSmrg 147505b261ecSmrg /* 147605b261ecSmrg ************************************************************************** 147705b261ecSmrg ** 2. Do any work necessary before the member routine is called. 147805b261ecSmrg ** 147905b261ecSmrg ** Call the window priv delete function for all buffer IDs associated 148005b261ecSmrg ** with this window. 148105b261ecSmrg ************************************************************************** 148205b261ecSmrg */ 148305b261ecSmrg 148405b261ecSmrg if ((pDbeWindowPriv = DBE_WINDOW_PRIV(pWin))) 148505b261ecSmrg { 148605b261ecSmrg while (pDbeWindowPriv) 148705b261ecSmrg { 148805b261ecSmrg /* *DbeWinPrivDelete() will free the window private and set it to 148905b261ecSmrg * NULL if there are no more buffer IDs associated with this 149005b261ecSmrg * window. 149105b261ecSmrg */ 149205b261ecSmrg FreeResource(pDbeWindowPriv->IDs[0], RT_NONE); 149305b261ecSmrg pDbeWindowPriv = DBE_WINDOW_PRIV(pWin); 149405b261ecSmrg } 149505b261ecSmrg } 149605b261ecSmrg 149705b261ecSmrg /* 149805b261ecSmrg ************************************************************************** 149905b261ecSmrg ** 3. Call the member routine, saving its result if necessary. 150005b261ecSmrg ************************************************************************** 150105b261ecSmrg */ 150205b261ecSmrg 150305b261ecSmrg ret = (*pScreen->DestroyWindow)(pWin); 150405b261ecSmrg 150505b261ecSmrg /* 150605b261ecSmrg ************************************************************************** 150705b261ecSmrg ** 4. Rewrap the member routine, restoring the wrapper value first in case 150805b261ecSmrg ** the wrapper (or something that it wrapped) change this value. 150905b261ecSmrg ************************************************************************** 151005b261ecSmrg */ 151105b261ecSmrg 151205b261ecSmrg pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow; 151305b261ecSmrg pScreen->DestroyWindow = DbeDestroyWindow; 151405b261ecSmrg 151505b261ecSmrg /* 151605b261ecSmrg ************************************************************************** 151705b261ecSmrg ** 5. Do any work necessary after the member routine has been called. 151805b261ecSmrg ** 151905b261ecSmrg ** In this case we do not need to do anything. 152005b261ecSmrg ************************************************************************** 152105b261ecSmrg */ 152205b261ecSmrg 15236747b715Smrg return ret; 152405b261ecSmrg 152505b261ecSmrg} /* DbeDestroyWindow() */ 152605b261ecSmrg 152705b261ecSmrg 152805b261ecSmrg/****************************************************************************** 152905b261ecSmrg * 153005b261ecSmrg * DBE DIX Procedure: DbeExtensionInit 153105b261ecSmrg * 153205b261ecSmrg * Description: 153305b261ecSmrg * 153405b261ecSmrg * Called from InitExtensions in main() 153505b261ecSmrg * 153605b261ecSmrg *****************************************************************************/ 153705b261ecSmrg 153805b261ecSmrgvoid 153905b261ecSmrgDbeExtensionInit(void) 154005b261ecSmrg{ 154105b261ecSmrg ExtensionEntry *extEntry; 154205b261ecSmrg register int i, j; 154305b261ecSmrg ScreenPtr pScreen = NULL; 154405b261ecSmrg DbeScreenPrivPtr pDbeScreenPriv; 154505b261ecSmrg int nStubbedScreens = 0; 154605b261ecSmrg Bool ddxInitSuccess; 154705b261ecSmrg 154805b261ecSmrg#ifdef PANORAMIX 154905b261ecSmrg if(!noPanoramiXExtension) return; 155005b261ecSmrg#endif 155105b261ecSmrg 155205b261ecSmrg /* Create the resource types. */ 155305b261ecSmrg dbeDrawableResType = 15546747b715Smrg CreateNewResourceType(DbeDrawableDelete, "dbeDrawable"); 15556747b715Smrg if (!dbeDrawableResType) 15566747b715Smrg return; 15576747b715Smrg dbeDrawableResType |= RC_DRAWABLE; 15586747b715Smrg 155905b261ecSmrg dbeWindowPrivResType = 15606747b715Smrg CreateNewResourceType(DbeWindowPrivDelete, "dbeWindow"); 15616747b715Smrg if (!dbeWindowPrivResType) 15626747b715Smrg return; 15636747b715Smrg 15646747b715Smrg if (!dixRegisterPrivateKey(&dbeScreenPrivKeyRec, PRIVATE_SCREEN, 0)) 15656747b715Smrg return; 15666747b715Smrg 15676747b715Smrg if (!dixRegisterPrivateKey(&dbeWindowPrivKeyRec, PRIVATE_WINDOW, 0)) 15684642e01fSmrg return; 156905b261ecSmrg 157005b261ecSmrg for (i = 0; i < screenInfo.numScreens; i++) 157105b261ecSmrg { 157205b261ecSmrg /* For each screen, set up DBE screen privates and init DIX and DDX 157305b261ecSmrg * interface. 157405b261ecSmrg */ 157505b261ecSmrg 157605b261ecSmrg pScreen = screenInfo.screens[i]; 157705b261ecSmrg 15786747b715Smrg if (!(pDbeScreenPriv = malloc (sizeof (DbeScreenPrivRec)))) 157905b261ecSmrg { 158005b261ecSmrg /* If we can not alloc a window or screen private, 158105b261ecSmrg * then free any privates that we already alloc'ed and return 158205b261ecSmrg */ 158305b261ecSmrg 158405b261ecSmrg for (j = 0; j < i; j++) 158505b261ecSmrg { 15866747b715Smrg free(dixLookupPrivate(&screenInfo.screens[j]->devPrivates, 15874642e01fSmrg dbeScreenPrivKey)); 15884642e01fSmrg dixSetPrivate(&screenInfo.screens[j]->devPrivates, 15894642e01fSmrg dbeScreenPrivKey, NULL); 159005b261ecSmrg } 159105b261ecSmrg return; 159205b261ecSmrg } 159305b261ecSmrg 15944642e01fSmrg dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, pDbeScreenPriv); 159505b261ecSmrg 159605b261ecSmrg { 15974642e01fSmrg /* We don't have DDX support for DBE anymore */ 159805b261ecSmrg 159905b261ecSmrg#ifndef DISABLE_MI_DBE_BY_DEFAULT 160005b261ecSmrg /* Setup DIX. */ 160105b261ecSmrg pDbeScreenPriv->SetupBackgroundPainter = DbeSetupBackgroundPainter; 160205b261ecSmrg 160305b261ecSmrg /* Setup DDX. */ 160405b261ecSmrg ddxInitSuccess = miDbeInit(pScreen, pDbeScreenPriv); 160505b261ecSmrg 160605b261ecSmrg /* DDX DBE initialization may have the side affect of 160705b261ecSmrg * reallocating pDbeScreenPriv, so we need to update it. 160805b261ecSmrg */ 160905b261ecSmrg pDbeScreenPriv = DBE_SCREEN_PRIV(pScreen); 161005b261ecSmrg 161105b261ecSmrg if (ddxInitSuccess) 161205b261ecSmrg { 161305b261ecSmrg /* Wrap DestroyWindow. The DDX initialization function 161405b261ecSmrg * already wrapped PositionWindow for us. 161505b261ecSmrg */ 161605b261ecSmrg 161705b261ecSmrg pDbeScreenPriv->DestroyWindow = pScreen->DestroyWindow; 161805b261ecSmrg pScreen->DestroyWindow = DbeDestroyWindow; 161905b261ecSmrg } 162005b261ecSmrg else 162105b261ecSmrg { 162205b261ecSmrg /* DDX initialization failed. Stub the screen. */ 162305b261ecSmrg DbeStubScreen(pDbeScreenPriv, &nStubbedScreens); 162405b261ecSmrg } 162505b261ecSmrg#else 162605b261ecSmrg DbeStubScreen(pDbeScreenPriv, &nStubbedScreens); 162705b261ecSmrg#endif 162805b261ecSmrg 16294642e01fSmrg } 163005b261ecSmrg 163105b261ecSmrg } /* for (i = 0; i < screenInfo.numScreens; i++) */ 163205b261ecSmrg 163305b261ecSmrg 163405b261ecSmrg if (nStubbedScreens == screenInfo.numScreens) 163505b261ecSmrg { 163605b261ecSmrg /* All screens stubbed. Clean up and return. */ 163705b261ecSmrg 163805b261ecSmrg for (i = 0; i < screenInfo.numScreens; i++) 163905b261ecSmrg { 16406747b715Smrg free(dixLookupPrivate(&screenInfo.screens[i]->devPrivates, 16414642e01fSmrg dbeScreenPrivKey)); 16424642e01fSmrg dixSetPrivate(&pScreen->devPrivates, dbeScreenPrivKey, NULL); 164305b261ecSmrg } 164405b261ecSmrg return; 164505b261ecSmrg } 164605b261ecSmrg 164705b261ecSmrg 164805b261ecSmrg /* Now add the extension. */ 164905b261ecSmrg extEntry = AddExtension(DBE_PROTOCOL_NAME, DbeNumberEvents, 165005b261ecSmrg DbeNumberErrors, ProcDbeDispatch, SProcDbeDispatch, 165105b261ecSmrg DbeResetProc, StandardMinorOpcode); 165205b261ecSmrg 165305b261ecSmrg dbeErrorBase = extEntry->errorBase; 16546747b715Smrg SetResourceTypeErrorValue(dbeWindowPrivResType, dbeErrorBase + DbeBadBuffer); 16556747b715Smrg SetResourceTypeErrorValue(dbeDrawableResType, dbeErrorBase + DbeBadBuffer); 165605b261ecSmrg 165705b261ecSmrg} /* DbeExtensionInit() */ 165805b261ecSmrg 1659