Blame synfig-osx/launcher/rootless-common.h

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