#ifndef _ROOTLESSCOMMON_H
#define _ROOTLESSCOMMON_H
#include "rootless.h"
#include "pixmapstr.h"
#include "windowstr.h"
#ifdef RENDER
#include "picturestr.h"
#endif
#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))
extern int rootlessGCPrivateIndex;
extern int rootlessScreenPrivateIndex;
extern int rootlessWindowPrivateIndex;
extern int rootlessNoDRIDrawing;
typedef struct {
GCFuncs *originalFuncs;
GCOps *originalOps;
} RootlessGCRec;
typedef struct RootlessWindowRec {
int x, y;
unsigned int width, height;
unsigned int borderWidth;
int level;
xp_window_id wid;
WindowPtr win;
void *data;
unsigned int rowbytes;
PixmapPtr pixmap;
PixmapPtr oldPixmap;
unsigned long unrealize_time;
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;
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;
#define SCREEN_UNWRAP(screen, fn) \
screen->fn = SCREENREC(screen)->fn;
#define SCREEN_WRAP(screen, fn) \
SCREENREC(screen)->fn = screen->fn; \
screen->fn = Rootless##fn
#define SCREENREC(pScreen) \
((RootlessScreenRec*)(pScreen)->devPrivates[rootlessScreenPrivateIndex].ptr)
#define WINREC(pWin) \
((RootlessWindowRec *)(pWin)->devPrivates[rootlessWindowPrivateIndex].ptr)
#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))
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)
#define IsTopLevel(pWin) \
((pWin) != NULL && (pWin)->parent != NULL && (pWin)->parent->parent == NULL)
#define IsRoot(pWin) \
((pWin) == WindowTable[(pWin)->drawable.pScreen->myNum])
extern WindowPtr TopLevelParent (WindowPtr pWindow);
extern Bool IsFramedWindow (WindowPtr pWin);
extern void TranslatePixmapBase (PixmapPtr pPix, int dx, int dy);
extern void RootlessStartDrawing (WindowPtr pWindow);
extern void RootlessFinishedDrawing (WindowPtr pWindow);
extern void RootlessStopDrawing (WindowPtr pWindow, Bool flush);
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);
extern ColormapPtr RootlessGetColormap (ScreenPtr pScreen);
extern Bool RootlessResolveColormap (ScreenPtr pScreen, int first_color,
int n_colors, uint32_t *colors);
extern void RootlessFlushWindowColormap (WindowPtr pWin);
extern void RootlessFlushScreenColormaps (ScreenPtr pScreen);
extern void RootlessRepositionWindow (WindowPtr pWin);
extern void RootlessRepositionWindows (ScreenPtr pScreen);
extern void RootlessReorderWindow (WindowPtr pWin);
#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