--- /dev/null
+/*
+ * Common internal rootless definitions and code
+ *
+ * Greg Parker gparker@cs.stanford.edu
+ */
+
+/* Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
+ HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+ Except as contained in this notice, the name(s) of the above
+ copyright holders shall not be used in advertising or otherwise to
+ promote the sale, use or other dealings in this Software without
+ prior written authorization. */
+
+/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/rootlessCommon.h,v 1.6 2002/07/24 05:58:33 torrey Exp $ */
+
+#ifndef _ROOTLESSCOMMON_H
+#define _ROOTLESSCOMMON_H
+
+#include "rootless.h"
+
+#include "pixmapstr.h"
+#include "windowstr.h"
+
+#ifdef RENDER
+#include "picturestr.h"
+#endif
+
+/* Debug output, or not. */
+#ifdef ROOTLESSDEBUG
+#define RL_DEBUG_MSG ErrorF
+#else
+#define RL_DEBUG_MSG(a, ...)
+#endif
+
+#undef MIN
+#define MIN(x,y) ((x) < (y) ? (x) : (y))
+#undef MAX
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+/* Global variables */
+extern int rootlessGCPrivateIndex;
+extern int rootlessScreenPrivateIndex;
+extern int rootlessWindowPrivateIndex;
+extern int rootlessNoDRIDrawing;
+
+/* RootlessGCRec: private per-gc data */
+typedef struct {
+ GCFuncs *originalFuncs;
+ GCOps *originalOps;
+} RootlessGCRec;
+
+/* RootlessWindowRec: private per-window data */
+typedef struct RootlessWindowRec {
+ int x, y;
+ unsigned int width, height;
+ unsigned int borderWidth;
+ int level;
+
+ xp_window_id wid;
+ WindowPtr win;
+
+ /* Valid when locked (i.e. is_drawing is set) */
+ void *data;
+ unsigned int rowbytes;
+
+ PixmapPtr pixmap;
+ PixmapPtr oldPixmap;
+
+ unsigned long unrealize_time; /* in seconds */
+
+ unsigned int is_drawing :1;
+ unsigned int is_update_disabled :1;
+ unsigned int is_reorder_pending :1;
+ unsigned int is_offscreen :1;
+ unsigned int is_obscured :1;
+} RootlessWindowRec;
+
+/* RootlessScreenRec: per-screen private data */
+typedef struct {
+ ScreenPtr pScreen;
+
+ CreateScreenResourcesProcPtr CreateScreenResources;
+ CloseScreenProcPtr CloseScreen;
+
+ CreateWindowProcPtr CreateWindow;
+ DestroyWindowProcPtr DestroyWindow;
+ RealizeWindowProcPtr RealizeWindow;
+ UnrealizeWindowProcPtr UnrealizeWindow;
+ ReparentWindowProcPtr ReparentWindow;
+ MoveWindowProcPtr MoveWindow;
+ ResizeWindowProcPtr ResizeWindow;
+ RestackWindowProcPtr RestackWindow;
+ ChangeBorderWidthProcPtr ChangeBorderWidth;
+ PositionWindowProcPtr PositionWindow;
+ ChangeWindowAttributesProcPtr ChangeWindowAttributes;
+
+ CreateGCProcPtr CreateGC;
+ PaintWindowBackgroundProcPtr PaintWindowBackground;
+ PaintWindowBorderProcPtr PaintWindowBorder;
+ CopyWindowProcPtr CopyWindow;
+ GetImageProcPtr GetImage;
+ SourceValidateProcPtr SourceValidate;
+
+ MarkOverlappedWindowsProcPtr MarkOverlappedWindows;
+ ValidateTreeProcPtr ValidateTree;
+
+#ifdef SHAPE
+ SetShapeProcPtr SetShape;
+#endif
+
+#ifdef RENDER
+ CompositeProcPtr Composite;
+ GlyphsProcPtr Glyphs;
+#endif
+
+ InstallColormapProcPtr InstallColormap;
+ UninstallColormapProcPtr UninstallColormap;
+ StoreColorsProcPtr StoreColors;
+
+ void *pixmap_data;
+ unsigned int pixmap_data_size;
+
+ ColormapPtr colormap;
+
+ void *redisplay_timer;
+ CARD32 last_redisplay;
+
+ unsigned int redisplay_timer_set :1;
+ unsigned int redisplay_queued :1;
+ unsigned int redisplay_expired :1;
+ unsigned int colormap_changed :1;
+} RootlessScreenRec;
+
+
+/* "Definition of the Porting Layer for the X11 Sample Server" says
+ unwrap and rewrap of screen functions is unnecessary, but
+ screen->CreateGC changes after a call to cfbCreateGC. */
+
+#define SCREEN_UNWRAP(screen, fn) \
+ screen->fn = SCREENREC(screen)->fn;
+
+#define SCREEN_WRAP(screen, fn) \
+ SCREENREC(screen)->fn = screen->fn; \
+ screen->fn = Rootless##fn
+
+/* Accessors for screen and window privates */
+
+#define SCREENREC(pScreen) \
+ ((RootlessScreenRec*)(pScreen)->devPrivates[rootlessScreenPrivateIndex].ptr)
+
+#define WINREC(pWin) \
+ ((RootlessWindowRec *)(pWin)->devPrivates[rootlessWindowPrivateIndex].ptr)
+
+/* BoxRec manipulators (Copied from shadowfb) */
+
+#define TRIM_BOX(box, pGC) { \
+ BoxPtr extents = &pGC->pCompositeClip->extents;\
+ if(box.x1 < extents->x1) box.x1 = extents->x1; \
+ if(box.x2 > extents->x2) box.x2 = extents->x2; \
+ if(box.y1 < extents->y1) box.y1 = extents->y1; \
+ if(box.y2 > extents->y2) box.y2 = extents->y2; \
+}
+
+#define TRANSLATE_BOX(box, pDraw) { \
+ box.x1 += pDraw->x; \
+ box.x2 += pDraw->x; \
+ box.y1 += pDraw->y; \
+ box.y2 += pDraw->y; \
+}
+
+#define TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC) { \
+ TRANSLATE_BOX(box, pDraw); \
+ TRIM_BOX(box, pGC); \
+}
+
+#define BOX_NOT_EMPTY(box) \
+ (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
+
+/* We don't want to clip windows to the edge of the screen. HUGE_ROOT
+ temporarily makes the root window really big. This is needed as a
+ wrapper around any function that calls SetWinSize or SetBorderSize
+ which clip a window against its parents, including the root. */
+
+extern RegionRec rootlessHugeRoot;
+
+#define HUGE_ROOT(pWin) \
+ do { \
+ WindowPtr w = pWin; \
+ while (w->parent != NULL) \
+ w = w->parent; \
+ saveRoot = w->winSize; \
+ w->winSize = rootlessHugeRoot; \
+ } while (0)
+
+#define NORMAL_ROOT(pWin) \
+ do { \
+ WindowPtr w = pWin; \
+ while (w->parent != NULL) \
+ w = w->parent; \
+ w->winSize = saveRoot; \
+ } while (0)
+
+/* Returns TRUE if this window is a top-level window (i.e. child of the root)
+ The root is not a top-level window. */
+#define IsTopLevel(pWin) \
+ ((pWin) != NULL && (pWin)->parent != NULL && (pWin)->parent->parent == NULL)
+
+/* Returns TRUE if this window is a root window */
+#define IsRoot(pWin) \
+ ((pWin) == WindowTable[(pWin)->drawable.pScreen->myNum])
+
+/* Returns the top-level parent of pWindow.
+ The root is the top-level parent of itself, even though the root is
+ not otherwise considered to be a top-level window. */
+extern WindowPtr TopLevelParent (WindowPtr pWindow);
+
+/* Returns TRUE if this window is visible inside a frame (e.g. it is
+ visible and has a top-level or root parent) */
+extern Bool IsFramedWindow (WindowPtr pWin);
+
+/* Adjust base address of pixmap by DX,DY */
+extern void TranslatePixmapBase (PixmapPtr pPix, int dx, int dy);
+
+/* Prepare a window for direct access to its backing buffer. */
+extern void RootlessStartDrawing (WindowPtr pWindow);
+
+/* Mark that no more drawing operations will hit the window until ``start
+ drawing'' is issued again. */
+extern void RootlessFinishedDrawing (WindowPtr pWindow);
+
+/* Finish drawing to a window's backing buffer. */
+extern void RootlessStopDrawing (WindowPtr pWindow, Bool flush);
+
+/* Routines that cause regions to get redrawn.
+ DamageRegion and DamageRect are in global coordinates.
+ DamageBox is in window-local coordinates. */
+extern void RootlessDamageRegion (WindowPtr pWindow, RegionPtr pRegion);
+extern void RootlessDamageRect (WindowPtr pWindow, int x, int y, int w, int h);
+extern void RootlessDamageBox (WindowPtr pWindow, BoxPtr pBox);
+extern void RootlessRedisplay (WindowPtr pWindow);
+extern void RootlessRedisplayScreen (ScreenPtr pScreen);
+
+extern void RootlessQueueRedisplay (ScreenPtr pScreen);
+extern Bool RootlessMayRedisplay (ScreenPtr pScreen);
+extern void RootlessScreenExpose (ScreenPtr pScreen);
+
+/* Return the colormap currently installed on the given screen. */
+extern ColormapPtr RootlessGetColormap (ScreenPtr pScreen);
+
+/* Convert colormap to ARGB. */
+extern Bool RootlessResolveColormap (ScreenPtr pScreen, int first_color,
+ int n_colors, uint32_t *colors);
+
+extern void RootlessFlushWindowColormap (WindowPtr pWin);
+extern void RootlessFlushScreenColormaps (ScreenPtr pScreen);
+
+/* Move windows back to their position relative to the screen origin. */
+extern void RootlessRepositionWindow (WindowPtr pWin);
+extern void RootlessRepositionWindows (ScreenPtr pScreen);
+
+/* Move the window to it's correct place in the physical stacking order */
+extern void RootlessReorderWindow (WindowPtr pWin);
+
+/* Bit mask for alpha channel with a particular number of bits per
+ pixel. Note that we only care for 32bpp data. OS X uses planar alpha
+ for 16bpp. */
+#define RootlessAlphaMask(bpp) ((bpp) == 32 ? 0xFF000000 : 0)
+
+#ifdef RENDER
+extern void RootlessComposite(CARD8 op, PicturePtr pSrc,
+ PicturePtr pMask, PicturePtr pDst,
+ INT16 xSrc, INT16 ySrc,
+ INT16 xMask, INT16 yMask,
+ INT16 xDst, INT16 yDst,
+ CARD16 width, CARD16 height);
+#endif
+
+extern void RootlessNativeWindowStateChanged (xp_window_id id,
+ unsigned int state);
+
+extern void RootlessEnableRoot (ScreenPtr pScreen);
+extern void RootlessDisableRoot (ScreenPtr pScreen);
+extern void RootlessSetWindowLevel (WindowPtr pWin, int level);
+
+#endif /* _ROOTLESSCOMMON_H */