diff options
author | dawes <dawes> | 2001-08-22 18:00:13 +0000 |
---|---|---|
committer | dawes <dawes> | 2001-08-22 18:00:13 +0000 |
commit | 17362840eb4dbe0675167830431b12d1fd4c9330 (patch) | |
tree | 6add1e688d4c63197f4dabf3241bb70f419369cc /xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h | |
parent | e5dfd25589ad48b9d324f9c84c67b1a97bbe4944 (diff) |
Initial revision
Diffstat (limited to 'xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h')
-rw-r--r-- | xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h b/xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h new file mode 100644 index 000000000..de5c65b57 --- /dev/null +++ b/xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h @@ -0,0 +1,209 @@ +/* + * Common internal rootless definitions and code + * + * Greg Parker gparker@cs.stanford.edu + */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/rootlessCommon.h,v 1.2 2001/07/01 03:24:57 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 + + +// Global variables +extern int rootlessGCPrivateIndex; +extern int rootlessScreenPrivateIndex; +extern int rootlessWindowPrivateIndex; + + +// RootlessGCRec: private per-gc data +typedef struct { + GCFuncs *originalFuncs; + GCOps *originalOps; +} RootlessGCRec; + + +// RootlessWindowRec: private per-window data +typedef struct RootlessWindowRec { + RootlessFrameRec frame; + RegionRec damage; + unsigned int borderWidth; // needed for MoveWindow(VTOther) (%$#@!!!) + PixmapPtr pixmap; +} RootlessWindowRec; + + +// RootlessScreenRec: per-screen private data +typedef struct { + ScreenPtr pScreen; + RootlessFrameProcs frameProcs; + + CloseScreenProcPtr CloseScreen; + + CreateWindowProcPtr CreateWindow; + DestroyWindowProcPtr DestroyWindow; + RealizeWindowProcPtr RealizeWindow; + UnrealizeWindowProcPtr UnrealizeWindow; + MoveWindowProcPtr MoveWindow; + ResizeWindowProcPtr ResizeWindow; + RestackWindowProcPtr RestackWindow; + ChangeBorderWidthProcPtr ChangeBorderWidth; + PositionWindowProcPtr PositionWindow; + ChangeWindowAttributesProcPtr ChangeWindowAttributes; + + CreateGCProcPtr CreateGC; + PaintWindowBackgroundProcPtr PaintWindowBackground; + PaintWindowBorderProcPtr PaintWindowBorder; + CopyWindowProcPtr CopyWindow; + GetImageProcPtr GetImage; + + MarkOverlappedWindowsProcPtr MarkOverlappedWindows; + ValidateTreeProcPtr ValidateTree; + +#ifdef SHAPE + SetShapeProcPtr SetShape; +#endif + +#ifdef RENDER + CompositeProcPtr Composite; + GlyphsProcPtr Glyphs; +#endif + +} 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) + + +// Call a rootless implementation function. +// Many rootless implementation functions are allowed to be NULL. +#define CallFrameProc(pScreen, proc, params) \ + if (SCREENREC(pScreen)->frameProcs.proc) { \ + RL_DEBUG_MSG("calling frame proc " #proc " "); \ + SCREENREC(pScreen)->frameProcs.proc params; \ + } + + +// 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)) + + +// HUGE_ROOT and NORMAL_ROOT +// 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) \ + { \ + WindowPtr w = pWin; \ + while (w->parent) w = w->parent; \ + saveRoot = w->winSize; \ + w->winSize = rootlessHugeRoot; \ + } + +#define NORMAL_ROOT(pWin) \ + { \ + WindowPtr w = pWin; \ + while (w->parent) w = w->parent; \ + w->winSize = saveRoot; \ + } + + +// 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) && (pWin)->parent && !(pWin)->parent->parent) + +// 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. +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) +Bool IsFramedWindow(WindowPtr pWin); + +// Move the given pixmap's base address to where pixel (0, 0) +// would be if the pixmap's actual data started at (x, y) +void SetPixmapBaseToScreen(PixmapPtr pix, int x, int y); + +// Update pWindow's pixmap. +// This needs to be called every time a window moves relative to +// its top-level parent, or the parent's pixmap data is reallocated. +void UpdatePixmap(WindowPtr pWindow); + +// Routines that cause regions to get redrawn. +// DamageRegion and DamageRect are GLOBAL coords +// DamageBox is WINDOW-LOCAL coords +void RootlessDamageRegion(WindowPtr pWindow, RegionPtr pRegion); +void RootlessDamageRect(WindowPtr pWindow, int x, int y, int w, int h); +void RootlessDamageBox(WindowPtr pWindow, BoxPtr pBox); +void RootlessRedisplay(WindowPtr pWindow); +void RootlessRedisplayScreen(ScreenPtr pScreen); + +#endif // _ROOTLESSCOMMON_H |