|
Carlos Lopez |
a09598 |
/* $XFree86: xc/programs/Xserver/GL/dri/dri.c,v 1.34 2001/12/10 19:07:19 dawes Exp $ */
|
|
Carlos Lopez |
a09598 |
/**************************************************************************
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
|
Carlos Lopez |
a09598 |
Copyright 2000 VA Linux Systems, Inc.
|
|
Carlos Lopez |
a09598 |
Copyright (c) 2002 Apple Computer, Inc.
|
|
Carlos Lopez |
a09598 |
All Rights Reserved.
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Permission is hereby granted, free of charge, to any person obtaining a
|
|
Carlos Lopez |
a09598 |
copy of this software and associated documentation files (the
|
|
Carlos Lopez |
a09598 |
"Software"), to deal in the Software without restriction, including
|
|
Carlos Lopez |
a09598 |
without limitation the rights to use, copy, modify, merge, publish,
|
|
Carlos Lopez |
a09598 |
distribute, sub license, and/or sell copies of the Software, and to
|
|
Carlos Lopez |
a09598 |
permit persons to whom the Software is furnished to do so, subject to
|
|
Carlos Lopez |
a09598 |
the following conditions:
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
The above copyright notice and this permission notice (including the
|
|
Carlos Lopez |
a09598 |
next paragraph) shall be included in all copies or substantial portions
|
|
Carlos Lopez |
a09598 |
of the Software.
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
Carlos Lopez |
a09598 |
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Carlos Lopez |
a09598 |
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
|
Carlos Lopez |
a09598 |
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
|
Carlos Lopez |
a09598 |
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
Carlos Lopez |
a09598 |
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
Carlos Lopez |
a09598 |
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
**************************************************************************/
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* Authors:
|
|
Carlos Lopez |
a09598 |
* Jens Owen <jens@valinux.com></jens@valinux.com>
|
|
Carlos Lopez |
a09598 |
* Rickard E. (Rik) Faith <faith@valinux.com></faith@valinux.com>
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#ifdef XFree86LOADER
|
|
Carlos Lopez |
a09598 |
#include "xf86.h"
|
|
Carlos Lopez |
a09598 |
#include "xf86_ansic.h"
|
|
Carlos Lopez |
a09598 |
#else
|
|
Carlos Lopez |
a09598 |
#include <sys time.h=""></sys>
|
|
Carlos Lopez |
a09598 |
#include <unistd.h></unistd.h>
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#define NEED_REPLIES
|
|
Carlos Lopez |
a09598 |
#define NEED_EVENTS
|
|
Carlos Lopez |
a09598 |
#include "X.h"
|
|
Carlos Lopez |
a09598 |
#include "Xproto.h"
|
|
Carlos Lopez |
a09598 |
#include "misc.h"
|
|
Carlos Lopez |
a09598 |
#include "dixstruct.h"
|
|
Carlos Lopez |
a09598 |
#include "extnsionst.h"
|
|
Carlos Lopez |
a09598 |
#include "colormapst.h"
|
|
Carlos Lopez |
a09598 |
#include "cursorstr.h"
|
|
Carlos Lopez |
a09598 |
#include "scrnintstr.h"
|
|
Carlos Lopez |
a09598 |
#include "windowstr.h"
|
|
Carlos Lopez |
a09598 |
#include "servermd.h"
|
|
Carlos Lopez |
a09598 |
#define _APPLEDRI_SERVER_
|
|
Carlos Lopez |
a09598 |
#include "appledristr.h"
|
|
Carlos Lopez |
a09598 |
#include "swaprep.h"
|
|
Carlos Lopez |
a09598 |
#include "dri-surface.h"
|
|
Carlos Lopez |
a09598 |
#include "dristruct.h"
|
|
Carlos Lopez |
a09598 |
#include "mi.h"
|
|
Carlos Lopez |
a09598 |
#include "mipointer.h"
|
|
Carlos Lopez |
a09598 |
#include "rootless-common.h"
|
|
Carlos Lopez |
a09598 |
#include "x-hash.h"
|
|
Carlos Lopez |
a09598 |
#include "x-hook.h"
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#include <availabilitymacros.h></availabilitymacros.h>
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static int DRIScreenPrivIndex = -1;
|
|
Carlos Lopez |
a09598 |
static int DRIWindowPrivIndex = -1;
|
|
Carlos Lopez |
a09598 |
static int DRIPixmapPrivIndex = -1;
|
|
Carlos Lopez |
a09598 |
static unsigned long DRIGeneration = 0;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static RESTYPE DRIDrawablePrivResType;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static x_hash_table *surface_hash; /* maps surface ids -> drawablePrivs */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIScreenInit(ScreenPtr pScreen)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
int i;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (DRIGeneration != serverGeneration) {
|
|
Carlos Lopez |
a09598 |
if ((DRIScreenPrivIndex = AllocateScreenPrivateIndex()) < 0)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
DRIGeneration = serverGeneration;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv = (DRIScreenPrivPtr) xcalloc(1, sizeof(DRIScreenPrivRec));
|
|
Carlos Lopez |
a09598 |
if (!pDRIPriv) {
|
|
Carlos Lopez |
a09598 |
pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pScreen->devPrivates[DRIScreenPrivIndex].ptr = (pointer) pDRIPriv;
|
|
Carlos Lopez |
a09598 |
pDRIPriv->directRenderingSupport = TRUE;
|
|
Carlos Lopez |
a09598 |
pDRIPriv->nrWindows = 0;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Initialize drawable tables */
|
|
Carlos Lopez |
a09598 |
for( i=0; i < DRI_MAX_DRAWABLES; i++) {
|
|
Carlos Lopez |
a09598 |
pDRIPriv->DRIDrawables[i] = NULL;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIFinishScreenInit(ScreenPtr pScreen)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Wrap DRI support */
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
|
|
Carlos Lopez |
a09598 |
pScreen->ValidateTree = DRIValidateTree;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
|
|
Carlos Lopez |
a09598 |
pScreen->PostValidateTree = DRIPostValidateTree;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
|
|
Carlos Lopez |
a09598 |
pScreen->WindowExposures = DRIWindowExposures;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
|
|
Carlos Lopez |
a09598 |
pScreen->CopyWindow = DRICopyWindow;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
|
|
Carlos Lopez |
a09598 |
pScreen->ClipNotify = DRIClipNotify;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
ErrorF("[DRI] screen %d installation complete\n", pScreen->myNum);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRICloseScreen(ScreenPtr pScreen)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIPriv && pDRIPriv->directRenderingSupport) {
|
|
Carlos Lopez |
a09598 |
xfree(pDRIPriv);
|
|
Carlos Lopez |
a09598 |
pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIExtensionInit(void)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
int i;
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (DRIScreenPrivIndex < 0) {
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Allocate a window private index with a zero sized private area for
|
|
Carlos Lopez |
a09598 |
* each window, then should a window become a DRI window, we'll hang
|
|
Carlos Lopez |
a09598 |
* a DRIWindowPrivateRec off of this private index.
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
if ((DRIWindowPrivIndex = AllocateWindowPrivateIndex()) < 0)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
if ((DRIPixmapPrivIndex = AllocatePixmapPrivateIndex()) < 0)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
for (i = 0; i < screenInfo.numScreens; i++)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
pScreen = screenInfo.screens[i];
|
|
Carlos Lopez |
a09598 |
if (!AllocateWindowPrivate(pScreen, DRIWindowPrivIndex, 0))
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
if (!AllocatePixmapPrivate(pScreen, DRIPixmapPrivIndex, 0))
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRIReset(void)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/*
|
|
Carlos Lopez |
a09598 |
* This stub routine is called when the X Server recycles, resources
|
|
Carlos Lopez |
a09598 |
* allocated by DRIExtensionInit need to be managed here.
|
|
Carlos Lopez |
a09598 |
*
|
|
Carlos Lopez |
a09598 |
* Currently this routine is a stub because all the interesting resources
|
|
Carlos Lopez |
a09598 |
* are managed via the screen init process.
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIPriv)
|
|
Carlos Lopez |
a09598 |
*isCapable = pDRIPriv->directRenderingSupport;
|
|
Carlos Lopez |
a09598 |
else
|
|
Carlos Lopez |
a09598 |
*isCapable = FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIAuthConnection(ScreenPtr pScreen, unsigned int magic)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if 0
|
|
Carlos Lopez |
a09598 |
/* FIXME: something? */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
static void
|
|
Carlos Lopez |
a09598 |
DRIUpdateSurface (DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
WindowPtr pTopWin;
|
|
Carlos Lopez |
a09598 |
xp_window_changes wc;
|
|
Carlos Lopez |
a09598 |
unsigned int flags = 0;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv->sid == 0)
|
|
Carlos Lopez |
a09598 |
return;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
|
Carlos Lopez |
a09598 |
wc.depth = (pDraw->bitsPerPixel == 32 ? XP_DEPTH_ARGB8888
|
|
Carlos Lopez |
a09598 |
: pDraw->bitsPerPixel == 16 ? XP_DEPTH_RGB555 : XP_DEPTH_NIL);
|
|
Carlos Lopez |
a09598 |
if (wc.depth != XP_DEPTH_NIL)
|
|
Carlos Lopez |
a09598 |
flags |= XP_DEPTH;
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW) {
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = (WindowPtr) pDraw;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (&pWin->drawable, FALSE);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pTopWin = TopLevelParent (pWin);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
wc.x = pWin->drawable.x - (pTopWin->drawable.x - pTopWin->borderWidth);
|
|
Carlos Lopez |
a09598 |
wc.y = pWin->drawable.y - (pTopWin->drawable.y - pTopWin->borderWidth);
|
|
Carlos Lopez |
a09598 |
wc.width = pWin->drawable.width;
|
|
Carlos Lopez |
a09598 |
wc.height = pWin->drawable.height;
|
|
Carlos Lopez |
a09598 |
wc.bit_gravity = XP_GRAVITY_NONE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
wc.shape_nrects = REGION_NUM_RECTS (&pWin->clipList);
|
|
Carlos Lopez |
a09598 |
wc.shape_rects = REGION_RECTS (&pWin->clipList);
|
|
Carlos Lopez |
a09598 |
wc.shape_tx = - (pTopWin->drawable.x - pTopWin->borderWidth);
|
|
Carlos Lopez |
a09598 |
wc.shape_ty = - (pTopWin->drawable.y - pTopWin->borderWidth);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
flags |= XP_BOUNDS | XP_SHAPE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->x = pWin->drawable.x - pTopWin->borderWidth;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->y = pWin->drawable.y - pTopWin->borderWidth;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
} else if (pDraw->type == DRAWABLE_PIXMAP) {
|
|
Carlos Lopez |
a09598 |
wc.x = 0;
|
|
Carlos Lopez |
a09598 |
wc.y = 0;
|
|
Carlos Lopez |
a09598 |
wc.width = pDraw->width;
|
|
Carlos Lopez |
a09598 |
wc.height = pDraw->height;
|
|
Carlos Lopez |
a09598 |
wc.bit_gravity = XP_GRAVITY_NONE;
|
|
Carlos Lopez |
a09598 |
flags |= XP_BOUNDS;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xp_configure_surface (pDRIDrawablePriv->sid, flags, &wc);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRICreateSurface (ScreenPtr pScreen, Drawable id,
|
|
Carlos Lopez |
a09598 |
DrawablePtr pDrawable, xp_client_id client_id,
|
|
Carlos Lopez |
a09598 |
xp_surface_id *surface_id, unsigned int ret_key[2],
|
|
Carlos Lopez |
a09598 |
void (*notify) (void *arg, void *data), void *notify_data)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin;
|
|
Carlos Lopez |
a09598 |
PixmapPtr pPix;
|
|
Carlos Lopez |
a09598 |
xp_window_id wid = 0;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDrawable->type == DRAWABLE_WINDOW) {
|
|
Carlos Lopez |
a09598 |
pWin = (WindowPtr)pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv == NULL) {
|
|
Carlos Lopez |
a09598 |
WindowPtr pTopWin;
|
|
Carlos Lopez |
a09598 |
xp_error err;
|
|
Carlos Lopez |
a09598 |
xp_window_changes wc;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pTopWin = TopLevelParent (pWin);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* allocate a DRI Window Private record */
|
|
Carlos Lopez |
a09598 |
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(DRIDrawablePrivRec)))) {
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->pDraw = pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->pScreen = pScreen;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->refCount = 0;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->drawableIndex = -1;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->notifiers = NULL;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* find the physical window */
|
|
Carlos Lopez |
a09598 |
wid = RootlessGetPhysicalWindow (pTopWin, TRUE);
|
|
Carlos Lopez |
a09598 |
if (wid == 0) {
|
|
Carlos Lopez |
a09598 |
xfree (pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* allocate the physical surface */
|
|
Carlos Lopez |
a09598 |
err = xp_create_surface (wid, &pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
if (err != Success) {
|
|
Carlos Lopez |
a09598 |
xfree (pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Make it visible */
|
|
Carlos Lopez |
a09598 |
wc.stack_mode = XP_MAPPED_ABOVE;
|
|
Carlos Lopez |
a09598 |
wc.sibling = 0;
|
|
Carlos Lopez |
a09598 |
err = xp_configure_surface (pDRIDrawablePriv->sid,
|
|
Carlos Lopez |
a09598 |
XP_STACKING, &wc);
|
|
Carlos Lopez |
a09598 |
if (err != Success)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xp_destroy_surface (pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
xfree (pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* save private off of preallocated index */
|
|
Carlos Lopez |
a09598 |
pWin->devPrivates[DRIWindowPrivIndex].ptr = (pointer)pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
|
Carlos Lopez |
a09598 |
else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
|
Carlos Lopez |
a09598 |
pPix = (PixmapPtr)pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv == NULL) {
|
|
Carlos Lopez |
a09598 |
xp_error err;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* allocate a DRI Window Private record */
|
|
Carlos Lopez |
a09598 |
if (!(pDRIDrawablePriv = xcalloc(1, sizeof(DRIDrawablePrivRec)))) {
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->pDraw = pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->pScreen = pScreen;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->refCount = 0;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->drawableIndex = -1;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->notifiers = NULL;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Passing a null window id to Xplugin in 10.3+ asks for
|
|
Carlos Lopez |
a09598 |
an accelerated offscreen surface. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
err = xp_create_surface (0, &pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
if (err != Success) {
|
|
Carlos Lopez |
a09598 |
xfree (pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* save private off of preallocated index */
|
|
Carlos Lopez |
a09598 |
pPix->devPrivates[DRIPixmapPrivIndex].ptr = (pointer)pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
else { /* for GLX 1.3, a PBuffer */
|
|
Carlos Lopez |
a09598 |
/* NOT_DONE */
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Finish initialization of new surfaces */
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv->refCount == 0) {
|
|
Carlos Lopez |
a09598 |
unsigned int key[2] = {0};
|
|
Carlos Lopez |
a09598 |
xp_error err;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* try to give the client access to the surface
|
|
Carlos Lopez |
a09598 |
FIXME: how to export pixmaps? */
|
|
Carlos Lopez |
a09598 |
if (client_id != 0 && wid != 0)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
err = xp_export_surface (wid, pDRIDrawablePriv->sid,
|
|
Carlos Lopez |
a09598 |
client_id, key);
|
|
Carlos Lopez |
a09598 |
if (err != Success) {
|
|
Carlos Lopez |
a09598 |
xp_destroy_surface (pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
xfree (pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->key[0] = key[0];
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->key[1] = key[1];
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
++pDRIPriv->nrWindows;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* and stash it by surface id */
|
|
Carlos Lopez |
a09598 |
if (surface_hash == NULL)
|
|
Carlos Lopez |
a09598 |
surface_hash = x_hash_table_new (NULL, NULL, NULL, NULL);
|
|
Carlos Lopez |
a09598 |
x_hash_table_insert (surface_hash,
|
|
Carlos Lopez |
a09598 |
(void *) pDRIDrawablePriv->sid, pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* track this in case this window is destroyed */
|
|
Carlos Lopez |
a09598 |
AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Initialize shape */
|
|
Carlos Lopez |
a09598 |
DRIUpdateSurface (pDRIDrawablePriv, pDrawable);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->refCount++;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
*surface_id = pDRIDrawablePriv->sid;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (ret_key != NULL) {
|
|
Carlos Lopez |
a09598 |
ret_key[0] = pDRIDrawablePriv->key[0];
|
|
Carlos Lopez |
a09598 |
ret_key[1] = pDRIDrawablePriv->key[1];
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (notify != NULL) {
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->notifiers = x_hook_add (pDRIDrawablePriv->notifiers,
|
|
Carlos Lopez |
a09598 |
notify, notify_data);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIDestroySurface(ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
|
|
Carlos Lopez |
a09598 |
void (*notify) (void *, void *), void *notify_data)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDrawable->type == DRAWABLE_WINDOW) {
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW((WindowPtr)pDrawable);
|
|
Carlos Lopez |
a09598 |
} else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP((PixmapPtr)pDrawable);
|
|
Carlos Lopez |
a09598 |
} else {
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv != NULL) {
|
|
Carlos Lopez |
a09598 |
if (notify != NULL) {
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->notifiers = x_hook_remove (pDRIDrawablePriv->notifiers,
|
|
Carlos Lopez |
a09598 |
notify, notify_data);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
if (--pDRIDrawablePriv->refCount <= 0) {
|
|
Carlos Lopez |
a09598 |
/* This calls back to DRIDrawablePrivDelete
|
|
Carlos Lopez |
a09598 |
which frees the private area */
|
|
Carlos Lopez |
a09598 |
FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivDelete(pointer pResource, XID id)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DrawablePtr pDrawable = (DrawablePtr)pResource;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDrawable->pScreen);
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = NULL;
|
|
Carlos Lopez |
a09598 |
PixmapPtr pPix = NULL;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDrawable->type == DRAWABLE_WINDOW) {
|
|
Carlos Lopez |
a09598 |
pWin = (WindowPtr)pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (pDrawable, FALSE);
|
|
Carlos Lopez |
a09598 |
pDRIPriv->drawing = x_list_remove (pDRIPriv->drawing,
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
} else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
|
Carlos Lopez |
a09598 |
pPix = (PixmapPtr)pDrawable;
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv == NULL)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv->drawableIndex != -1) {
|
|
Carlos Lopez |
a09598 |
/* release drawable table entry */
|
|
Carlos Lopez |
a09598 |
pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv->sid != 0) {
|
|
Carlos Lopez |
a09598 |
xp_destroy_surface (pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
x_hash_table_remove (surface_hash, (void *) pDRIDrawablePriv->sid);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv->notifiers != NULL)
|
|
Carlos Lopez |
a09598 |
x_hook_free (pDRIDrawablePriv->notifiers);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xfree(pDRIDrawablePriv);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDrawable->type == DRAWABLE_WINDOW) {
|
|
Carlos Lopez |
a09598 |
pWin->devPrivates[DRIWindowPrivIndex].ptr = NULL;
|
|
Carlos Lopez |
a09598 |
} else if (pDrawable->type == DRAWABLE_PIXMAP) {
|
|
Carlos Lopez |
a09598 |
pPix->devPrivates[DRIPixmapPrivIndex].ptr = NULL;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
--pDRIPriv->nrWindows;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if(pDRIDrawablePriv) {
|
|
Carlos Lopez |
a09598 |
/* FIXME: something? */
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
(*pScreen->WindowExposures)(pWin, prgn, bsreg);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
|
|
Carlos Lopez |
a09598 |
pScreen->WindowExposures = DRIWindowExposures;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if(pDRIPriv->nrWindows > 0) {
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW (pWin);
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv != NULL) {
|
|
Carlos Lopez |
a09598 |
DRIUpdateSurface (pDRIDrawablePriv, &pWin->drawable);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* unwrap */
|
|
Carlos Lopez |
a09598 |
pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* call lower layers */
|
|
Carlos Lopez |
a09598 |
(*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* rewrap */
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
|
|
Carlos Lopez |
a09598 |
pScreen->CopyWindow = DRICopyWindow;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
int
|
|
Carlos Lopez |
a09598 |
DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen = pParent->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
int returnValue;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* unwrap */
|
|
Carlos Lopez |
a09598 |
pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* call lower layers */
|
|
Carlos Lopez |
a09598 |
returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* rewrap */
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
|
|
Carlos Lopez |
a09598 |
pScreen->ValidateTree = DRIValidateTree;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return returnValue;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pParent) {
|
|
Carlos Lopez |
a09598 |
pScreen = pParent->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
} else {
|
|
Carlos Lopez |
a09598 |
pScreen = pChild->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIPriv->wrap.PostValidateTree) {
|
|
Carlos Lopez |
a09598 |
/* unwrap */
|
|
Carlos Lopez |
a09598 |
pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* call lower layers */
|
|
Carlos Lopez |
a09598 |
(*pScreen->PostValidateTree)(pParent, pChild, kind);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* rewrap */
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
|
|
Carlos Lopez |
a09598 |
pScreen->PostValidateTree = DRIPostValidateTree;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRIClipNotify(WindowPtr pWin, int dx, int dy)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
|
|
Carlos Lopez |
a09598 |
DRIUpdateSurface (pDRIDrawablePriv, &pWin->drawable);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if(pDRIPriv->wrap.ClipNotify) {
|
|
Carlos Lopez |
a09598 |
pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
(*pScreen->ClipNotify)(pWin, dx, dy);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
|
|
Carlos Lopez |
a09598 |
pScreen->ClipNotify = DRIClipNotify;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* This lets get at the unwrapped functions so that they can correctly
|
|
Carlos Lopez |
a09598 |
* call the lowerlevel functions, and choose whether they will be
|
|
Carlos Lopez |
a09598 |
* called at every level of recursion (eg in validatetree).
|
|
Carlos Lopez |
a09598 |
*/
|
|
Carlos Lopez |
a09598 |
DRIWrappedFuncsRec *
|
|
Carlos Lopez |
a09598 |
DRIGetWrappedFuncs(ScreenPtr pScreen)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
return &(DRI_SCREEN_PRIV(pScreen)->wrap);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRIQueryVersion(int *majorVersion,
|
|
Carlos Lopez |
a09598 |
int *minorVersion,
|
|
Carlos Lopez |
a09598 |
int *patchVersion)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
*majorVersion = APPLE_DRI_MAJOR_VERSION;
|
|
Carlos Lopez |
a09598 |
*minorVersion = APPLE_DRI_MINOR_VERSION;
|
|
Carlos Lopez |
a09598 |
*patchVersion = APPLE_DRI_PATCH_VERSION;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRISurfaceNotify (xp_surface_id id, int kind)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
|
|
Carlos Lopez |
a09598 |
DRISurfaceNotifyArg arg;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
arg.id = id;
|
|
Carlos Lopez |
a09598 |
arg.kind = kind;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (surface_hash != NULL)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv = x_hash_table_lookup (surface_hash,
|
|
Carlos Lopez |
a09598 |
(void *) id, NULL);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIDrawablePriv == NULL)
|
|
Carlos Lopez |
a09598 |
return;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (kind == AppleDRISurfaceNotifyDestroyed)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
pDRIDrawablePriv->sid = 0;
|
|
Carlos Lopez |
a09598 |
x_hash_table_remove (surface_hash, (void *) id);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
x_hook_run (pDRIDrawablePriv->notifiers, &arg);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (kind == AppleDRISurfaceNotifyDestroyed)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* Kill off the handle. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
FreeResourceByType (pDRIDrawablePriv->pDraw->id,
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivResType, FALSE);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Experimental support for X drawing directly into VRAM surfaces. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIStartDrawing (DrawablePtr pDraw)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
#else
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr priv = NULL;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
|
|
Carlos Lopez |
a09598 |
#if 0
|
|
Carlos Lopez |
a09598 |
/* FIXME: support pixmaps */
|
|
Carlos Lopez |
a09598 |
else if (pDraw->type == DRAWABLE_PIXMAP)
|
|
Carlos Lopez |
a09598 |
priv = DRI_DRAWABLE_PRIV_FROM_PIXMAP ((PixmapPtr)pDraw);
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (priv == NULL)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pDRIPriv = DRI_SCREEN_PRIV(priv->pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (!priv->is_drawing)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xp_error err;
|
|
Carlos Lopez |
a09598 |
xp_box r;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
err = xp_lock_window (priv->sid, NULL, NULL,
|
|
Carlos Lopez |
a09598 |
&priv->data, &priv->rowbytes, &r);
|
|
Carlos Lopez |
a09598 |
if (err != Success)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = (WindowPtr) pDraw;
|
|
Carlos Lopez |
a09598 |
int bw = wBorderWidth (pWin);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
priv->pixmap =
|
|
Carlos Lopez |
a09598 |
GetScratchPixmapHeader(pWin->drawable.pScreen, r.x2 - r.x1,
|
|
Carlos Lopez |
a09598 |
r.y2 - r.y1, pWin->drawable.depth,
|
|
Carlos Lopez |
a09598 |
pWin->drawable.bitsPerPixel,
|
|
Carlos Lopez |
a09598 |
priv->rowbytes, priv->data);
|
|
Carlos Lopez |
a09598 |
TranslatePixmapBase (priv->pixmap,
|
|
Carlos Lopez |
a09598 |
- (pWin->drawable.x - bw),
|
|
Carlos Lopez |
a09598 |
- (pWin->drawable.y - bw));
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
priv->is_drawing = TRUE;
|
|
Carlos Lopez |
a09598 |
pDRIPriv->drawing = x_list_prepend (pDRIPriv->drawing, priv);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = (WindowPtr) pDraw;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
priv->oldPixmap = pWin->drawable.pScreen->GetWindowPixmap (pWin);
|
|
Carlos Lopez |
a09598 |
pWin->drawable.pScreen->SetWindowPixmap (pWin, priv->pixmap);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
#endif
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (DrawablePtr pDraw, Bool flush)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
#else
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr priv = NULL;
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
|
|
Carlos Lopez |
a09598 |
else if (pDraw->type == DRAWABLE_PIXMAP)
|
|
Carlos Lopez |
a09598 |
priv = DRI_DRAWABLE_PRIV_FROM_PIXMAP ((PixmapPtr)pDraw);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (priv == NULL)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pScreen = priv->pScreen;
|
|
Carlos Lopez |
a09598 |
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (priv->is_drawing)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xp_unlock_window (priv->sid, flush);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
FreeScratchPixmapHeader (priv->pixmap);
|
|
Carlos Lopez |
a09598 |
pScreen->SetWindowPixmap ((WindowPtr)pDraw, priv->oldPixmap);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
priv->pixmap = NULL;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* If we didn't flush don't forget that we still need to.. */
|
|
Carlos Lopez |
a09598 |
if (flush)
|
|
Carlos Lopez |
a09598 |
pDRIPriv->drawing = x_list_remove (pDRIPriv->drawing, priv);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
priv->is_drawing = FALSE;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
else if (flush)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
xp_flush_window (priv->sid);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
#endif /* 10.3 */
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* true iff two Boxes overlap */
|
|
Carlos Lopez |
a09598 |
#define EXTENTCHECK(r1,r2) \
|
|
Carlos Lopez |
a09598 |
(!( ((r1)->x2 <= (r2)->x1) || \
|
|
Carlos Lopez |
a09598 |
((r1)->x1 >= (r2)->x2) || \
|
|
Carlos Lopez |
a09598 |
((r1)->y2 <= (r2)->y1) || \
|
|
Carlos Lopez |
a09598 |
((r1)->y1 >= (r2)->y2) ) )
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
Bool
|
|
Carlos Lopez |
a09598 |
DRIDamageRegion (DrawablePtr pDraw, RegionPtr pRegion)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
#else
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr priv = NULL;
|
|
Carlos Lopez |
a09598 |
RegionRec clipped;
|
|
Carlos Lopez |
a09598 |
BoxPtr b1, b2;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (priv == NULL)
|
|
Carlos Lopez |
a09598 |
return FALSE;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* adapted from RootlessDamageRegion () */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = (WindowPtr) pDraw;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
b1 = REGION_EXTENTS (pWin->drawable.pScreen, &pWin->borderClip);
|
|
Carlos Lopez |
a09598 |
b2 = REGION_EXTENTS (pWin->drawable.pScreen, pRegion);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (EXTENTCHECK (b1, b2))
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* Regions may overlap. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (REGION_NUM_RECTS (pRegion) == 1)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
int in;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* Damaged region only has a single rect, so we can
|
|
Carlos Lopez |
a09598 |
just compare that against the region */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
in = RECT_IN_REGION (pWin->drawable.pScreen, &pWin->borderClip,
|
|
Carlos Lopez |
a09598 |
REGION_RECTS (pRegion));
|
|
Carlos Lopez |
a09598 |
if (in == rgnIN)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* clip totally contains pRegion */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xp_mark_window (priv->sid, REGION_NUM_RECTS (pRegion),
|
|
Carlos Lopez |
a09598 |
REGION_RECTS (pRegion),
|
|
Carlos Lopez |
a09598 |
-priv->x, -priv->y);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
RootlessQueueRedisplay (pWin->drawable.pScreen);
|
|
Carlos Lopez |
a09598 |
goto out;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
else if (in == rgnOUT)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
/* clip doesn't contain pRegion */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
goto out;
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* clip overlaps pRegion, need to intersect */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
REGION_INIT (pWin->drawable.pScreen, &clipped, NullBox, 0);
|
|
Carlos Lopez |
a09598 |
REGION_INTERSECT (pWin->drawable.pScreen, &clipped,
|
|
Carlos Lopez |
a09598 |
&pWin->borderClip, pRegion);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
xp_mark_window (priv->sid, REGION_NUM_RECTS (&clipped),
|
|
Carlos Lopez |
a09598 |
REGION_RECTS (&clipped), -priv->x, -priv->y);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
REGION_UNINIT (pWin->drawable.pScreen, &clipped);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
RootlessQueueRedisplay (pWin->drawable.pScreen);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
out:
|
|
Carlos Lopez |
a09598 |
return TRUE;
|
|
Carlos Lopez |
a09598 |
#endif /* 10.3 */
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRISynchronizeDrawable (DrawablePtr pDraw, Bool flush)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr priv;
|
|
Carlos Lopez |
a09598 |
x_list *node, *copy;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
pScreen = pDraw->pScreen;
|
|
Carlos Lopez |
a09598 |
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIPriv == NULL || pDRIPriv->drawing == NULL)
|
|
Carlos Lopez |
a09598 |
return;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDraw->type == DRAWABLE_WINDOW)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
WindowPtr pWin = TopLevelParent ((WindowPtr) pDraw);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
/* need to find _any_ window under pWin that is drawing. Scan the
|
|
Carlos Lopez |
a09598 |
list looking for candidates. */
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
copy = x_list_copy (pDRIPriv->drawing);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
for (node = copy; node != NULL; node = node->next)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
priv = node->data;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (priv->pDraw->type == DRAWABLE_WINDOW
|
|
Carlos Lopez |
a09598 |
&& TopLevelParent ((WindowPtr) priv->pDraw) == pWin)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (priv->pDraw, flush);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
x_list_free (copy);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
else
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (pDraw, flush);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
#endif /* 10.3 */
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
void
|
|
Carlos Lopez |
a09598 |
DRISynchronize (Bool flush)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
|
|
Carlos Lopez |
a09598 |
int i;
|
|
Carlos Lopez |
a09598 |
ScreenPtr pScreen;
|
|
Carlos Lopez |
a09598 |
DRIScreenPrivPtr pDRIPriv;
|
|
Carlos Lopez |
a09598 |
DRIDrawablePrivPtr priv;
|
|
Carlos Lopez |
a09598 |
x_list *node, *copy;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
for (i = 0; i < screenInfo.numScreens; i++)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
pScreen = screenInfo.screens[i];
|
|
Carlos Lopez |
a09598 |
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
if (pDRIPriv == NULL || pDRIPriv->drawing == NULL)
|
|
Carlos Lopez |
a09598 |
continue;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
copy = x_list_copy (pDRIPriv->drawing);
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
for (node = copy; node != NULL; node = node->next)
|
|
Carlos Lopez |
a09598 |
{
|
|
Carlos Lopez |
a09598 |
priv = node->data;
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
DRIStopDrawing (priv->pDraw, flush);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
|
|
Carlos Lopez |
a09598 |
x_list_free (copy);
|
|
Carlos Lopez |
a09598 |
}
|
|
Carlos Lopez |
a09598 |
#endif /* 10.3 */
|
|
Carlos Lopez |
a09598 |
}
|