61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/*
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Common internal rootless definitions and code
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/*
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Copyright (c) 2001 Greg Parker. All Rights Reserved.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Copyright (c) 2002-2004 Torrey T. Lyons. All Rights Reserved.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Permission is hereby granted, free of charge, to any person obtaining a
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * copy of this software and associated documentation files (the "Software"),
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * to deal in the Software without restriction, including without limitation
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * the rights to use, copy, modify, merge, publish, distribute, sublicense,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * and/or sell copies of the Software, and to permit persons to whom the
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Software is furnished to do so, subject to the following conditions:
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * The above copyright notice and this permission notice shall be included in
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * all copies or substantial portions of the Software.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * DEALINGS IN THE SOFTWARE.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync *
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Except as contained in this notice, the name(s) of the above copyright
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * holders shall not be used in advertising or otherwise to promote the sale,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * use or other dealings in this Software without prior written authorization.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifdef HAVE_DIX_CONFIG_H
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include <dix-config.h>
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include <stdint.h>
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifndef _ROOTLESSCOMMON_H
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define _ROOTLESSCOMMON_H
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "misc.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "rootless.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "fb.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "scrnintstr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#include "picturestr.h"
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Debug output, or not.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#ifdef ROOTLESSDEBUG
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define RL_DEBUG_MSG ErrorF
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#else
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define RL_DEBUG_MSG(a, ...)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Global variables
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncextern DevPrivateKeyRec rootlessGCPrivateKeyRec;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define rootlessGCPrivateKey (&rootlessGCPrivateKeyRec)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncextern DevPrivateKeyRec rootlessScreenPrivateKeyRec;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define rootlessScreenPrivateKey (&rootlessScreenPrivateKeyRec)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncextern DevPrivateKeyRec rootlessWindowPrivateKeyRec;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define rootlessWindowPrivateKey (&rootlessWindowPrivateKeyRec)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncextern DevPrivateKeyRec rootlessWindowOldPixmapPrivateKeyRec;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define rootlessWindowOldPixmapPrivateKey (&rootlessWindowOldPixmapPrivateKeyRec)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// RootlessGCRec: private per-gc data
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsynctypedef struct {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync GCFuncs *originalFuncs;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync GCOps *originalOps;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync} RootlessGCRec;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// RootlessScreenRec: per-screen private data
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsynctypedef struct _RootlessScreenRec {
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync // Rootless implementation functions
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync RootlessFrameProcsPtr imp;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync // Wrapped screen functions
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CreateScreenResourcesProcPtr CreateScreenResources;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CloseScreenProcPtr CloseScreen;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CreateWindowProcPtr CreateWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync DestroyWindowProcPtr DestroyWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync RealizeWindowProcPtr RealizeWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync UnrealizeWindowProcPtr UnrealizeWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync MoveWindowProcPtr MoveWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ResizeWindowProcPtr ResizeWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync RestackWindowProcPtr RestackWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ReparentWindowProcPtr ReparentWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ChangeBorderWidthProcPtr ChangeBorderWidth;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync PositionWindowProcPtr PositionWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ChangeWindowAttributesProcPtr ChangeWindowAttributes;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CreateGCProcPtr CreateGC;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CopyWindowProcPtr CopyWindow;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync GetImageProcPtr GetImage;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SourceValidateProcPtr SourceValidate;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync MarkOverlappedWindowsProcPtr MarkOverlappedWindows;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ValidateTreeProcPtr ValidateTree;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SetShapeProcPtr SetShape;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync CompositeProcPtr Composite;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync GlyphsProcPtr Glyphs;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync InstallColormapProcPtr InstallColormap;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync UninstallColormapProcPtr UninstallColormap;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync StoreColorsProcPtr StoreColors;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync void *pixmap_data;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int pixmap_data_size;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ColormapPtr colormap;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync void *redisplay_timer;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int redisplay_timer_set:1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int redisplay_queued:1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int redisplay_expired:1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync unsigned int colormap_changed:1;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync} RootlessScreenRec, *RootlessScreenPtr;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// "Definition of the Porting Layer for the X11 Sample Server" says
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// unwrap and rewrap of screen functions is unnecessary, but
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// screen->CreateGC changes after a call to cfbCreateGC.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SCREEN_UNWRAP(screen, fn) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync screen->fn = SCREENREC(screen)->fn;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SCREEN_WRAP(screen, fn) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SCREENREC(screen)->fn = screen->fn; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync screen->fn = Rootless##fn
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Accessors for screen and window privates
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SCREENREC(pScreen) ((RootlessScreenRec *) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync dixLookupPrivate(&(pScreen)->devPrivates, rootlessScreenPrivateKey))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SETSCREENREC(pScreen, v) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync dixSetPrivate(&(pScreen)->devPrivates, rootlessScreenPrivateKey, v)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define WINREC(pWin) ((RootlessWindowRec *) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync dixLookupPrivate(&(pWin)->devPrivates, rootlessWindowPrivateKey))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SETWINREC(pWin, v) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync dixSetPrivate(&(pWin)->devPrivates, rootlessWindowPrivateKey, v)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Call a rootless implementation function.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Many rootless implementation functions are allowed to be NULL.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define CallFrameProc(pScreen, proc, params) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (SCREENREC(pScreen)->frameProcs.proc) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync RL_DEBUG_MSG("calling frame proc " #proc " "); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync SCREENREC(pScreen)->frameProcs.proc params; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync }
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// BoxRec manipulators
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Copied from shadowfb
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define TRIM_BOX(box, pGC) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync BoxPtr extents = &pGC->pCompositeClip->extents;\
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if(box.x1 < extents->x1) box.x1 = extents->x1; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if(box.x2 > extents->x2) box.x2 = extents->x2; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if(box.y1 < extents->y1) box.y1 = extents->y1; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if(box.y2 > extents->y2) box.y2 = extents->y2; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync}
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define TRANSLATE_BOX(box, pDraw) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync box.x1 += pDraw->x; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync box.x2 += pDraw->x; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync box.y1 += pDraw->y; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync box.y2 += pDraw->y; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync}
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync TRANSLATE_BOX(box, pDraw); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync TRIM_BOX(box, pGC); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync}
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define BOX_NOT_EMPTY(box) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// HUGE_ROOT and NORMAL_ROOT
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// We don't want to clip windows to the edge of the screen.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// HUGE_ROOT temporarily makes the root window really big.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// This is needed as a wrapper around any function that calls
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// SetWinSize or SetBorderSize which clip a window against its
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// parents, including the root.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncextern RegionRec rootlessHugeRoot;
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define HUGE_ROOT(pWin) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync do { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync WindowPtr w = pWin; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (w->parent) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync w = w->parent; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync saveRoot = w->winSize; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync w->winSize = rootlessHugeRoot; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync } while (0)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define NORMAL_ROOT(pWin) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync do { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync WindowPtr w = pWin; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync while (w->parent) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync w = w->parent; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync w->winSize = saveRoot; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync } while (0)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Returns TRUE if this window is a top-level window (i.e. child of the root)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// The root is not a top-level window.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define IsTopLevel(pWin) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ((pWin) && (pWin)->parent && !(pWin)->parent->parent)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Returns TRUE if this window is a root window
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define IsRoot(pWin) \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ((pWin) == (pWin)->drawable.pScreen->root)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/*
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * SetPixmapBaseToScreen
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Move the given pixmap's base address to where pixel (0, 0)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * would be if the pixmap's actual data started at (x, y).
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * Can't access the bits before the first word of the drawable's data in
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync * rootless mode, so make sure our base address is always 32-bit aligned.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#define SetPixmapBaseToScreen(pix, _x, _y) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync PixmapPtr _pPix = (PixmapPtr) (pix); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync _pPix->devPrivate.ptr = (char *) (_pPix->devPrivate.ptr) - \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync ((int)(_x) * _pPix->drawable.bitsPerPixel/8 + \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync (int)(_y) * _pPix->devKind); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync if (_pPix->drawable.bitsPerPixel != FB_UNIT) { \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync size_t _diff = ((size_t) _pPix->devPrivate.ptr) & \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync (FB_UNIT / CHAR_BIT - 1); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync _pPix->devPrivate.ptr = (char *) (_pPix->devPrivate.ptr) - \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync _diff; \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync _pPix->drawable.x = _diff / \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync (_pPix->drawable.bitsPerPixel / CHAR_BIT); \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync } \
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync}
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Returns TRUE if this window is visible inside a frame
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// (e.g. it is visible and has a top-level or root parent)
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncBool IsFramedWindow(WindowPtr pWin);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Routines that cause regions to get redrawn.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// DamageRegion and DamageRect are in global coordinates.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// DamageBox is in window-local coordinates.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessDamageRegion(WindowPtr pWindow, RegionPtr pRegion);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessDamageRect(WindowPtr pWindow, int x, int y, int w, int h);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessDamageBox(WindowPtr pWindow, BoxPtr pBox);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessRedisplay(WindowPtr pWindow);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessRedisplayScreen(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessQueueRedisplay(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* Return the colormap currently installed on the given screen. */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncColormapPtr RootlessGetColormap(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync/* Convert colormap to ARGB. */
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncBool RootlessResolveColormap(ScreenPtr pScreen, int first_color,
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync int n_colors, uint32_t * colors);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessFlushWindowColormap(WindowPtr pWin);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessFlushScreenColormaps(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Move a window to its proper location on the screen.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessRepositionWindow(WindowPtr pWin);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync// Move the window to it's correct place in the physical stacking order.
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessReorderWindow(WindowPtr pWin);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessScreenExpose(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessHideAllWindows(void);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessShowAllWindows(void);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessUpdateRooted(Bool state);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessEnableRoot(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessDisableRoot(ScreenPtr pScreen);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsyncvoid RootlessSetPixmapOfAncestors(WindowPtr pWin);
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync
61cb83a8ccd1dd7f671f31fa93c9d8b7be09b4ccvboxsync#endif /* _ROOTLESSCOMMON_H */