scrnintstr.h revision 35c4bbdf
105b261ecSmrg/*********************************************************** 205b261ecSmrg 305b261ecSmrgCopyright 1987, 1998 The Open Group 405b261ecSmrg 505b261ecSmrgPermission to use, copy, modify, distribute, and sell this software and its 605b261ecSmrgdocumentation for any purpose is hereby granted without fee, provided that 705b261ecSmrgthe above copyright notice appear in all copies and that both that 805b261ecSmrgcopyright notice and this permission notice appear in supporting 905b261ecSmrgdocumentation. 1005b261ecSmrg 1105b261ecSmrgThe above copyright notice and this permission notice shall be included in 1205b261ecSmrgall copies or substantial portions of the Software. 1305b261ecSmrg 1405b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1505b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1605b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1705b261ecSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 1805b261ecSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1905b261ecSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2005b261ecSmrg 2105b261ecSmrgExcept as contained in this notice, the name of The Open Group shall not be 2205b261ecSmrgused in advertising or otherwise to promote the sale, use or other dealings 2305b261ecSmrgin this Software without prior written authorization from The Open Group. 2405b261ecSmrg 2505b261ecSmrgCopyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. 2605b261ecSmrg 2705b261ecSmrg All Rights Reserved 2805b261ecSmrg 2935c4bbdfSmrgPermission to use, copy, modify, and distribute this software and its 3035c4bbdfSmrgdocumentation for any purpose and without fee is hereby granted, 3105b261ecSmrgprovided that the above copyright notice appear in all copies and that 3235c4bbdfSmrgboth that copyright notice and this permission notice appear in 3305b261ecSmrgsupporting documentation, and that the name of Digital not be 3405b261ecSmrgused in advertising or publicity pertaining to distribution of the 3535c4bbdfSmrgsoftware without specific, written prior permission. 3605b261ecSmrg 3705b261ecSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 3805b261ecSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 3905b261ecSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 4005b261ecSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 4105b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 4205b261ecSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 4305b261ecSmrgSOFTWARE. 4405b261ecSmrg 4505b261ecSmrg******************************************************************/ 4605b261ecSmrg 4705b261ecSmrg#ifndef SCREENINTSTRUCT_H 4805b261ecSmrg#define SCREENINTSTRUCT_H 4905b261ecSmrg 5005b261ecSmrg#include "screenint.h" 5105b261ecSmrg#include "regionstr.h" 5205b261ecSmrg#include "colormap.h" 5305b261ecSmrg#include "cursor.h" 5405b261ecSmrg#include "validate.h" 5505b261ecSmrg#include <X11/Xproto.h> 5605b261ecSmrg#include "dix.h" 574642e01fSmrg#include "privates.h" 5835c4bbdfSmrg#include <X11/extensions/randr.h> 5905b261ecSmrg 6005b261ecSmrgtypedef struct _PixmapFormat { 6135c4bbdfSmrg unsigned char depth; 6235c4bbdfSmrg unsigned char bitsPerPixel; 6335c4bbdfSmrg unsigned char scanlinePad; 6435c4bbdfSmrg} PixmapFormatRec; 6535c4bbdfSmrg 6605b261ecSmrgtypedef struct _Visual { 6735c4bbdfSmrg VisualID vid; 6835c4bbdfSmrg short class; 6935c4bbdfSmrg short bitsPerRGBValue; 7035c4bbdfSmrg short ColormapEntries; 7135c4bbdfSmrg short nplanes; /* = log2 (ColormapEntries). This does not 7235c4bbdfSmrg * imply that the screen has this many planes. 7335c4bbdfSmrg * it may have more or fewer */ 7435c4bbdfSmrg unsigned long redMask, greenMask, blueMask; 7535c4bbdfSmrg int offsetRed, offsetGreen, offsetBlue; 7635c4bbdfSmrg} VisualRec; 7705b261ecSmrg 7805b261ecSmrgtypedef struct _Depth { 7935c4bbdfSmrg unsigned char depth; 8035c4bbdfSmrg short numVids; 8135c4bbdfSmrg VisualID *vids; /* block of visual ids for this depth */ 8235c4bbdfSmrg} DepthRec; 8305b261ecSmrg 846747b715Smrgtypedef struct _ScreenSaverStuff { 856747b715Smrg WindowPtr pWindow; 8635c4bbdfSmrg XID wid; 8735c4bbdfSmrg char blanked; 8835c4bbdfSmrg Bool (*ExternalScreenSaver) (ScreenPtr /*pScreen */ , 8935c4bbdfSmrg int /*xstate */ , 9035c4bbdfSmrg Bool /*force */ ); 916747b715Smrg} ScreenSaverStuffRec; 926747b715Smrg 9305b261ecSmrg/* 9405b261ecSmrg * There is a typedef for each screen function pointer so that code that 9505b261ecSmrg * needs to declare a screen function pointer (e.g. in a screen private 9605b261ecSmrg * or as a local variable) can easily do so and retain full type checking. 9705b261ecSmrg */ 9805b261ecSmrg 9935c4bbdfSmrgtypedef Bool (*CloseScreenProcPtr) (ScreenPtr /*pScreen */ ); 10035c4bbdfSmrg 10135c4bbdfSmrgtypedef void (*QueryBestSizeProcPtr) (int /*class */ , 10235c4bbdfSmrg unsigned short * /*pwidth */ , 10335c4bbdfSmrg unsigned short * /*pheight */ , 10435c4bbdfSmrg ScreenPtr /*pScreen */ ); 10535c4bbdfSmrg 10635c4bbdfSmrgtypedef Bool (*SaveScreenProcPtr) (ScreenPtr /*pScreen */ , 10735c4bbdfSmrg int /*on */ ); 10835c4bbdfSmrg 10935c4bbdfSmrgtypedef void (*GetImageProcPtr) (DrawablePtr /*pDrawable */ , 11035c4bbdfSmrg int /*sx */ , 11135c4bbdfSmrg int /*sy */ , 11235c4bbdfSmrg int /*w */ , 11335c4bbdfSmrg int /*h */ , 11435c4bbdfSmrg unsigned int /*format */ , 11535c4bbdfSmrg unsigned long /*planeMask */ , 11635c4bbdfSmrg char * /*pdstLine */ ); 11735c4bbdfSmrg 11835c4bbdfSmrgtypedef void (*GetSpansProcPtr) (DrawablePtr /*pDrawable */ , 11935c4bbdfSmrg int /*wMax */ , 12035c4bbdfSmrg DDXPointPtr /*ppt */ , 12135c4bbdfSmrg int * /*pwidth */ , 12235c4bbdfSmrg int /*nspans */ , 12335c4bbdfSmrg char * /*pdstStart */ ); 12435c4bbdfSmrg 12535c4bbdfSmrgtypedef void (*SourceValidateProcPtr) (DrawablePtr /*pDrawable */ , 12635c4bbdfSmrg int /*x */ , 12735c4bbdfSmrg int /*y */ , 12835c4bbdfSmrg int /*width */ , 12935c4bbdfSmrg int /*height */ , 13035c4bbdfSmrg unsigned int /*subWindowMode */ ); 13135c4bbdfSmrg 13235c4bbdfSmrgtypedef Bool (*CreateWindowProcPtr) (WindowPtr /*pWindow */ ); 13335c4bbdfSmrg 13435c4bbdfSmrgtypedef Bool (*DestroyWindowProcPtr) (WindowPtr /*pWindow */ ); 13535c4bbdfSmrg 13635c4bbdfSmrgtypedef Bool (*PositionWindowProcPtr) (WindowPtr /*pWindow */ , 13735c4bbdfSmrg int /*x */ , 13835c4bbdfSmrg int /*y */ ); 13935c4bbdfSmrg 14035c4bbdfSmrgtypedef Bool (*ChangeWindowAttributesProcPtr) (WindowPtr /*pWindow */ , 14135c4bbdfSmrg unsigned long /*mask */ ); 14235c4bbdfSmrg 14335c4bbdfSmrgtypedef Bool (*RealizeWindowProcPtr) (WindowPtr /*pWindow */ ); 14435c4bbdfSmrg 14535c4bbdfSmrgtypedef Bool (*UnrealizeWindowProcPtr) (WindowPtr /*pWindow */ ); 14635c4bbdfSmrg 14735c4bbdfSmrgtypedef void (*RestackWindowProcPtr) (WindowPtr /*pWindow */ , 14835c4bbdfSmrg WindowPtr /*pOldNextSib */ ); 14935c4bbdfSmrg 15035c4bbdfSmrgtypedef int (*ValidateTreeProcPtr) (WindowPtr /*pParent */ , 15135c4bbdfSmrg WindowPtr /*pChild */ , 15235c4bbdfSmrg VTKind /*kind */ ); 15335c4bbdfSmrg 15435c4bbdfSmrgtypedef void (*PostValidateTreeProcPtr) (WindowPtr /*pParent */ , 15535c4bbdfSmrg WindowPtr /*pChild */ , 15635c4bbdfSmrg VTKind /*kind */ ); 15735c4bbdfSmrg 15835c4bbdfSmrgtypedef void (*WindowExposuresProcPtr) (WindowPtr /*pWindow */ , 15935c4bbdfSmrg RegionPtr /*prgn */); 16035c4bbdfSmrg 16135c4bbdfSmrgtypedef void (*PaintWindowProcPtr) (WindowPtr /*pWindow*/, 16235c4bbdfSmrg RegionPtr /*pRegion*/, 16335c4bbdfSmrg int /*what*/); 16435c4bbdfSmrg 16535c4bbdfSmrgtypedef void (*CopyWindowProcPtr) (WindowPtr /*pWindow */ , 16635c4bbdfSmrg DDXPointRec /*ptOldOrg */ , 16735c4bbdfSmrg RegionPtr /*prgnSrc */ ); 16835c4bbdfSmrg 16935c4bbdfSmrgtypedef void (*ClearToBackgroundProcPtr) (WindowPtr /*pWindow */ , 17035c4bbdfSmrg int /*x */ , 17135c4bbdfSmrg int /*y */ , 17235c4bbdfSmrg int /*w */ , 17335c4bbdfSmrg int /*h */ , 17435c4bbdfSmrg Bool /*generateExposures */ ); 17535c4bbdfSmrg 17635c4bbdfSmrgtypedef void (*ClipNotifyProcPtr) (WindowPtr /*pWindow */ , 17735c4bbdfSmrg int /*dx */ , 17835c4bbdfSmrg int /*dy */ ); 17905b261ecSmrg 1804642e01fSmrg/* pixmap will exist only for the duration of the current rendering operation */ 1814642e01fSmrg#define CREATE_PIXMAP_USAGE_SCRATCH 1 1824642e01fSmrg/* pixmap will be the backing pixmap for a redirected window */ 1834642e01fSmrg#define CREATE_PIXMAP_USAGE_BACKING_PIXMAP 2 1844642e01fSmrg/* pixmap will contain a glyph */ 1854642e01fSmrg#define CREATE_PIXMAP_USAGE_GLYPH_PICTURE 3 18635c4bbdfSmrg/* pixmap will be shared */ 18735c4bbdfSmrg#define CREATE_PIXMAP_USAGE_SHARED 4 18835c4bbdfSmrg 18935c4bbdfSmrgtypedef PixmapPtr (*CreatePixmapProcPtr) (ScreenPtr /*pScreen */ , 19035c4bbdfSmrg int /*width */ , 19135c4bbdfSmrg int /*height */ , 19235c4bbdfSmrg int /*depth */ , 19335c4bbdfSmrg unsigned /*usage_hint */ ); 19435c4bbdfSmrg 19535c4bbdfSmrgtypedef Bool (*DestroyPixmapProcPtr) (PixmapPtr /*pPixmap */ ); 19635c4bbdfSmrg 19735c4bbdfSmrgtypedef Bool (*RealizeFontProcPtr) (ScreenPtr /*pScreen */ , 19835c4bbdfSmrg FontPtr /*pFont */ ); 19935c4bbdfSmrg 20035c4bbdfSmrgtypedef Bool (*UnrealizeFontProcPtr) (ScreenPtr /*pScreen */ , 20135c4bbdfSmrg FontPtr /*pFont */ ); 20235c4bbdfSmrg 20335c4bbdfSmrgtypedef void (*ConstrainCursorProcPtr) (DeviceIntPtr /*pDev */ , 20435c4bbdfSmrg ScreenPtr /*pScreen */ , 20535c4bbdfSmrg BoxPtr /*pBox */ ); 20635c4bbdfSmrg 20735c4bbdfSmrgtypedef void (*CursorLimitsProcPtr) (DeviceIntPtr /* pDev */ , 20835c4bbdfSmrg ScreenPtr /*pScreen */ , 20935c4bbdfSmrg CursorPtr /*pCursor */ , 21035c4bbdfSmrg BoxPtr /*pHotBox */ , 21135c4bbdfSmrg BoxPtr /*pTopLeftBox */ ); 21235c4bbdfSmrg 21335c4bbdfSmrgtypedef Bool (*DisplayCursorProcPtr) (DeviceIntPtr /* pDev */ , 21435c4bbdfSmrg ScreenPtr /*pScreen */ , 21535c4bbdfSmrg CursorPtr /*pCursor */ ); 21635c4bbdfSmrg 21735c4bbdfSmrgtypedef Bool (*RealizeCursorProcPtr) (DeviceIntPtr /* pDev */ , 21835c4bbdfSmrg ScreenPtr /*pScreen */ , 21935c4bbdfSmrg CursorPtr /*pCursor */ ); 22035c4bbdfSmrg 22135c4bbdfSmrgtypedef Bool (*UnrealizeCursorProcPtr) (DeviceIntPtr /* pDev */ , 22235c4bbdfSmrg ScreenPtr /*pScreen */ , 22335c4bbdfSmrg CursorPtr /*pCursor */ ); 22435c4bbdfSmrg 22535c4bbdfSmrgtypedef void (*RecolorCursorProcPtr) (DeviceIntPtr /* pDev */ , 22635c4bbdfSmrg ScreenPtr /*pScreen */ , 22735c4bbdfSmrg CursorPtr /*pCursor */ , 22835c4bbdfSmrg Bool /*displayed */ ); 22935c4bbdfSmrg 23035c4bbdfSmrgtypedef Bool (*SetCursorPositionProcPtr) (DeviceIntPtr /* pDev */ , 23135c4bbdfSmrg ScreenPtr /*pScreen */ , 23235c4bbdfSmrg int /*x */ , 23335c4bbdfSmrg int /*y */ , 23435c4bbdfSmrg Bool /*generateEvent */ ); 23535c4bbdfSmrg 23635c4bbdfSmrgtypedef Bool (*CreateGCProcPtr) (GCPtr /*pGC */ ); 23735c4bbdfSmrg 23835c4bbdfSmrgtypedef Bool (*CreateColormapProcPtr) (ColormapPtr /*pColormap */ ); 23935c4bbdfSmrg 24035c4bbdfSmrgtypedef void (*DestroyColormapProcPtr) (ColormapPtr /*pColormap */ ); 24135c4bbdfSmrg 24235c4bbdfSmrgtypedef void (*InstallColormapProcPtr) (ColormapPtr /*pColormap */ ); 24335c4bbdfSmrg 24435c4bbdfSmrgtypedef void (*UninstallColormapProcPtr) (ColormapPtr /*pColormap */ ); 24535c4bbdfSmrg 24635c4bbdfSmrgtypedef int (*ListInstalledColormapsProcPtr) (ScreenPtr /*pScreen */ , 24735c4bbdfSmrg XID * /*pmaps */ ); 24835c4bbdfSmrg 24935c4bbdfSmrgtypedef void (*StoreColorsProcPtr) (ColormapPtr /*pColormap */ , 25035c4bbdfSmrg int /*ndef */ , 25135c4bbdfSmrg xColorItem * /*pdef */ ); 25235c4bbdfSmrg 25335c4bbdfSmrgtypedef void (*ResolveColorProcPtr) (unsigned short * /*pred */ , 25435c4bbdfSmrg unsigned short * /*pgreen */ , 25535c4bbdfSmrg unsigned short * /*pblue */ , 25635c4bbdfSmrg VisualPtr /*pVisual */ ); 25735c4bbdfSmrg 25835c4bbdfSmrgtypedef RegionPtr (*BitmapToRegionProcPtr) (PixmapPtr /*pPix */ ); 25935c4bbdfSmrg 26035c4bbdfSmrgtypedef void (*ScreenBlockHandlerProcPtr) (ScreenPtr pScreen, 26135c4bbdfSmrg void *pTimeout, 26235c4bbdfSmrg void *pReadmask); 26335c4bbdfSmrg 26435c4bbdfSmrgtypedef void (*ScreenWakeupHandlerProcPtr) (ScreenPtr pScreen, 26535c4bbdfSmrg unsigned long result, 26635c4bbdfSmrg void *pReadMask); 26735c4bbdfSmrg 26835c4bbdfSmrgtypedef Bool (*CreateScreenResourcesProcPtr) (ScreenPtr /*pScreen */ ); 26935c4bbdfSmrg 27035c4bbdfSmrgtypedef Bool (*ModifyPixmapHeaderProcPtr) (PixmapPtr pPixmap, 27135c4bbdfSmrg int width, 27235c4bbdfSmrg int height, 27335c4bbdfSmrg int depth, 27435c4bbdfSmrg int bitsPerPixel, 27535c4bbdfSmrg int devKind, 27635c4bbdfSmrg void *pPixData); 27735c4bbdfSmrg 27835c4bbdfSmrgtypedef PixmapPtr (*GetWindowPixmapProcPtr) (WindowPtr /*pWin */ ); 27935c4bbdfSmrg 28035c4bbdfSmrgtypedef void (*SetWindowPixmapProcPtr) (WindowPtr /*pWin */ , 28135c4bbdfSmrg PixmapPtr /*pPix */ ); 28235c4bbdfSmrg 28335c4bbdfSmrgtypedef PixmapPtr (*GetScreenPixmapProcPtr) (ScreenPtr /*pScreen */ ); 28435c4bbdfSmrg 28535c4bbdfSmrgtypedef void (*SetScreenPixmapProcPtr) (PixmapPtr /*pPix */ ); 28635c4bbdfSmrg 28735c4bbdfSmrgtypedef void (*MarkWindowProcPtr) (WindowPtr /*pWin */ ); 28835c4bbdfSmrg 28935c4bbdfSmrgtypedef Bool (*MarkOverlappedWindowsProcPtr) (WindowPtr /*parent */ , 29035c4bbdfSmrg WindowPtr /*firstChild */ , 29135c4bbdfSmrg WindowPtr * /*pLayerWin */ ); 29235c4bbdfSmrg 29335c4bbdfSmrgtypedef int (*ConfigNotifyProcPtr) (WindowPtr /*pWin */ , 29435c4bbdfSmrg int /*x */ , 29535c4bbdfSmrg int /*y */ , 29635c4bbdfSmrg int /*w */ , 29735c4bbdfSmrg int /*h */ , 29835c4bbdfSmrg int /*bw */ , 29935c4bbdfSmrg WindowPtr /*pSib */ ); 30035c4bbdfSmrg 30135c4bbdfSmrgtypedef void (*MoveWindowProcPtr) (WindowPtr /*pWin */ , 30235c4bbdfSmrg int /*x */ , 30335c4bbdfSmrg int /*y */ , 30435c4bbdfSmrg WindowPtr /*pSib */ , 30535c4bbdfSmrg VTKind /*kind */ ); 3064642e01fSmrg 30735c4bbdfSmrgtypedef void (*ResizeWindowProcPtr) (WindowPtr /*pWin */ , 30835c4bbdfSmrg int /*x */ , 30935c4bbdfSmrg int /*y */ , 31035c4bbdfSmrg unsigned int /*w */ , 31135c4bbdfSmrg unsigned int /*h */ , 31235c4bbdfSmrg WindowPtr /*pSib */ 31335c4bbdfSmrg ); 31435c4bbdfSmrg 31535c4bbdfSmrgtypedef WindowPtr (*GetLayerWindowProcPtr) (WindowPtr /*pWin */ 31635c4bbdfSmrg ); 31735c4bbdfSmrg 31835c4bbdfSmrgtypedef void (*HandleExposuresProcPtr) (WindowPtr /*pWin */ ); 31935c4bbdfSmrg 32035c4bbdfSmrgtypedef void (*ReparentWindowProcPtr) (WindowPtr /*pWin */ , 32135c4bbdfSmrg WindowPtr /*pPriorParent */ ); 32235c4bbdfSmrg 32335c4bbdfSmrgtypedef void (*SetShapeProcPtr) (WindowPtr /*pWin */ , 32435c4bbdfSmrg int /* kind */ ); 32535c4bbdfSmrg 32635c4bbdfSmrgtypedef void (*ChangeBorderWidthProcPtr) (WindowPtr /*pWin */ , 32735c4bbdfSmrg unsigned int /*width */ ); 32835c4bbdfSmrg 32935c4bbdfSmrgtypedef void (*MarkUnrealizedWindowProcPtr) (WindowPtr /*pChild */ , 33035c4bbdfSmrg WindowPtr /*pWin */ , 33135c4bbdfSmrg Bool /*fromConfigure */ ); 33235c4bbdfSmrg 33335c4bbdfSmrgtypedef Bool (*DeviceCursorInitializeProcPtr) (DeviceIntPtr /* pDev */ , 33435c4bbdfSmrg ScreenPtr /* pScreen */ ); 33535c4bbdfSmrg 33635c4bbdfSmrgtypedef void (*DeviceCursorCleanupProcPtr) (DeviceIntPtr /* pDev */ , 33735c4bbdfSmrg ScreenPtr /* pScreen */ ); 33835c4bbdfSmrg 33935c4bbdfSmrgtypedef void (*ConstrainCursorHarderProcPtr) (DeviceIntPtr, ScreenPtr, int, 34035c4bbdfSmrg int *, int *); 34135c4bbdfSmrg 34235c4bbdfSmrg 34335c4bbdfSmrgtypedef Bool (*SharePixmapBackingProcPtr)(PixmapPtr, ScreenPtr, void **); 34435c4bbdfSmrg 34535c4bbdfSmrgtypedef Bool (*SetSharedPixmapBackingProcPtr)(PixmapPtr, void *); 34635c4bbdfSmrg 34735c4bbdfSmrgtypedef Bool (*StartPixmapTrackingProcPtr)(PixmapPtr, PixmapPtr, 34835c4bbdfSmrg int x, int y, 34935c4bbdfSmrg int dst_x, int dst_y, 35035c4bbdfSmrg Rotation rotation); 35135c4bbdfSmrg 35235c4bbdfSmrgtypedef Bool (*StopPixmapTrackingProcPtr)(PixmapPtr, PixmapPtr); 35335c4bbdfSmrg 35435c4bbdfSmrgtypedef Bool (*ReplaceScanoutPixmapProcPtr)(DrawablePtr, PixmapPtr, Bool); 35535c4bbdfSmrg 35635c4bbdfSmrgtypedef WindowPtr (*XYToWindowProcPtr)(ScreenPtr pScreen, 35735c4bbdfSmrg SpritePtr pSprite, int x, int y); 35835c4bbdfSmrg 35935c4bbdfSmrgtypedef int (*NameWindowPixmapProcPtr)(WindowPtr, PixmapPtr, CARD32); 36035c4bbdfSmrg 36135c4bbdfSmrg/* Wrapping Screen procedures 36235c4bbdfSmrg 36335c4bbdfSmrg There are a few modules in the X server which dynamically add and 36435c4bbdfSmrg remove themselves from various screen procedure call chains. 36535c4bbdfSmrg 36635c4bbdfSmrg For example, the BlockHandler is dynamically modified by: 36735c4bbdfSmrg 36835c4bbdfSmrg * xf86Rotate 36935c4bbdfSmrg * miSprite 37035c4bbdfSmrg * composite 37135c4bbdfSmrg * render (for animated cursors) 37235c4bbdfSmrg 37335c4bbdfSmrg Correctly manipulating this chain is complicated by the fact that 37435c4bbdfSmrg the chain is constructed through a sequence of screen private 37535c4bbdfSmrg structures, each holding the next screen->proc pointer. 37635c4bbdfSmrg 37735c4bbdfSmrg To add a module to a screen->proc chain is fairly simple; just save 37835c4bbdfSmrg the current screen->proc value in the module screen private 37935c4bbdfSmrg and store the module's function in the screen->proc location. 38035c4bbdfSmrg 38135c4bbdfSmrg Removing a screen proc is a bit trickier. It seems like all you 38235c4bbdfSmrg need to do is set the screen->proc pointer back to the value saved 38335c4bbdfSmrg in your screen private. However, if some other module has come 38435c4bbdfSmrg along and wrapped on top of you, then the right place to store the 38535c4bbdfSmrg previous screen->proc value is actually in the wrapping module's 38635c4bbdfSmrg screen private structure(!). Of course, you have no idea what 38735c4bbdfSmrg other module may have wrapped on top, nor could you poke inside 38835c4bbdfSmrg its screen private in any case. 38935c4bbdfSmrg 39035c4bbdfSmrg To make this work, we restrict the unwrapping process to happen 39135c4bbdfSmrg during the invocation of the screen proc itself, and then we 39235c4bbdfSmrg require the screen proc to take some care when manipulating the 39335c4bbdfSmrg screen proc functions pointers. 39435c4bbdfSmrg 39535c4bbdfSmrg The requirements are: 39635c4bbdfSmrg 39735c4bbdfSmrg 1) The screen proc must set the screen->proc pointer back to the 39835c4bbdfSmrg value saved in its screen private before calling outside its 39935c4bbdfSmrg module. 40035c4bbdfSmrg 40135c4bbdfSmrg 2a) If the screen proc wants to be remove itself from the chain, 40235c4bbdfSmrg it must not manipulate screen->proc pointer again before 40335c4bbdfSmrg returning. 40435c4bbdfSmrg 40535c4bbdfSmrg 2b) If the screen proc wants to remain in the chain, it must: 40635c4bbdfSmrg 40735c4bbdfSmrg 2b.1) Re-fetch the screen->proc pointer and store that in 40835c4bbdfSmrg its screen private. This ensures that any changes 40935c4bbdfSmrg to the chain will be preserved. 41035c4bbdfSmrg 41135c4bbdfSmrg 2b.2) Set screen->proc back to itself 41235c4bbdfSmrg 41335c4bbdfSmrg One key requirement here is that these steps must wrap not just 41435c4bbdfSmrg any invocation of the nested screen->proc value, but must nest 41535c4bbdfSmrg essentially any calls outside the current module. This ensures 41635c4bbdfSmrg that other modules can reliably manipulate screen->proc wrapping 41735c4bbdfSmrg using these same rules. 41835c4bbdfSmrg 41935c4bbdfSmrg For example, the animated cursor code in render has two macros, 42035c4bbdfSmrg Wrap and Unwrap. 42135c4bbdfSmrg 42235c4bbdfSmrg #define Unwrap(as,s,elt) ((s)->elt = (as)->elt) 42335c4bbdfSmrg 42435c4bbdfSmrg Unwrap takes the screen private (as), the screen (s) and the 42535c4bbdfSmrg member name (elt), and restores screen->proc to that saved in the 42635c4bbdfSmrg screen private. 42735c4bbdfSmrg 42835c4bbdfSmrg #define Wrap(as,s,elt,func) (((as)->elt = (s)->elt), (s)->elt = func) 42935c4bbdfSmrg 43035c4bbdfSmrg Wrap takes the screen private (as), the screen (s), the member 43135c4bbdfSmrg name (elt) and the wrapping function (func). It saves the 43235c4bbdfSmrg current screen->proc value in the screen private, and then sets the 43335c4bbdfSmrg screen->proc to the local wrapping function. 43435c4bbdfSmrg 43535c4bbdfSmrg Within each of these functions, there's a pretty simple pattern: 43635c4bbdfSmrg 43735c4bbdfSmrg Unwrap(as, pScreen, UnrealizeCursor); 43835c4bbdfSmrg 43935c4bbdfSmrg // Do local stuff, including possibly calling down through 44035c4bbdfSmrg // pScreen->UnrealizeCursor 44135c4bbdfSmrg 44235c4bbdfSmrg Wrap(as, pScreen, UnrealizeCursor, AnimCurUnrealizeCursor); 44335c4bbdfSmrg 44435c4bbdfSmrg The wrapping block handler is a bit different; it does the Unwrap, 44535c4bbdfSmrg the local operations and then only re-Wraps if the hook is still 44635c4bbdfSmrg required. Unwrap occurrs at the top of each function, just after 44735c4bbdfSmrg entry, and Wrap occurrs at the bottom of each function, just 44835c4bbdfSmrg before returning. 44935c4bbdfSmrg */ 4509ace9065Smrg 45105b261ecSmrgtypedef struct _Screen { 45235c4bbdfSmrg int myNum; /* index of this instance in Screens[] */ 45335c4bbdfSmrg ATOM id; 45435c4bbdfSmrg short x, y, width, height; 45535c4bbdfSmrg short mmWidth, mmHeight; 45635c4bbdfSmrg short numDepths; 45735c4bbdfSmrg unsigned char rootDepth; 45835c4bbdfSmrg DepthPtr allowedDepths; 45935c4bbdfSmrg unsigned long rootVisual; 46035c4bbdfSmrg unsigned long defColormap; 46135c4bbdfSmrg short minInstalledCmaps, maxInstalledCmaps; 46235c4bbdfSmrg char backingStoreSupport, saveUnderSupport; 46335c4bbdfSmrg unsigned long whitePixel, blackPixel; 46435c4bbdfSmrg GCPtr GCperDepth[MAXFORMATS + 1]; 46535c4bbdfSmrg /* next field is a stipple to use as default in 46635c4bbdfSmrg a GC. we don't build default tiles of all depths 46735c4bbdfSmrg because they are likely to be of a color 46835c4bbdfSmrg different from the default fg pixel, so 46935c4bbdfSmrg we don't win anything by building 47035c4bbdfSmrg a standard one. 47135c4bbdfSmrg */ 47235c4bbdfSmrg PixmapPtr PixmapPerDepth[1]; 47335c4bbdfSmrg void *devPrivate; 47435c4bbdfSmrg short numVisuals; 47535c4bbdfSmrg VisualPtr visuals; 47635c4bbdfSmrg WindowPtr root; 4776747b715Smrg ScreenSaverStuffRec screensaver; 47805b261ecSmrg 47935c4bbdfSmrg DevPrivateSetRec screenSpecificPrivates[PRIVATE_LAST]; 48035c4bbdfSmrg 48105b261ecSmrg /* Random screen procedures */ 48205b261ecSmrg 48335c4bbdfSmrg CloseScreenProcPtr CloseScreen; 48435c4bbdfSmrg QueryBestSizeProcPtr QueryBestSize; 48535c4bbdfSmrg SaveScreenProcPtr SaveScreen; 48635c4bbdfSmrg GetImageProcPtr GetImage; 48735c4bbdfSmrg GetSpansProcPtr GetSpans; 48835c4bbdfSmrg SourceValidateProcPtr SourceValidate; 48905b261ecSmrg 49005b261ecSmrg /* Window Procedures */ 49105b261ecSmrg 49235c4bbdfSmrg CreateWindowProcPtr CreateWindow; 49335c4bbdfSmrg DestroyWindowProcPtr DestroyWindow; 49435c4bbdfSmrg PositionWindowProcPtr PositionWindow; 49505b261ecSmrg ChangeWindowAttributesProcPtr ChangeWindowAttributes; 49635c4bbdfSmrg RealizeWindowProcPtr RealizeWindow; 49735c4bbdfSmrg UnrealizeWindowProcPtr UnrealizeWindow; 49835c4bbdfSmrg ValidateTreeProcPtr ValidateTree; 49935c4bbdfSmrg PostValidateTreeProcPtr PostValidateTree; 50035c4bbdfSmrg WindowExposuresProcPtr WindowExposures; 50135c4bbdfSmrg CopyWindowProcPtr CopyWindow; 50235c4bbdfSmrg ClearToBackgroundProcPtr ClearToBackground; 50335c4bbdfSmrg ClipNotifyProcPtr ClipNotify; 50435c4bbdfSmrg RestackWindowProcPtr RestackWindow; 50535c4bbdfSmrg PaintWindowProcPtr PaintWindow; 50605b261ecSmrg 50705b261ecSmrg /* Pixmap procedures */ 50805b261ecSmrg 50935c4bbdfSmrg CreatePixmapProcPtr CreatePixmap; 51035c4bbdfSmrg DestroyPixmapProcPtr DestroyPixmap; 51105b261ecSmrg 51205b261ecSmrg /* Font procedures */ 51305b261ecSmrg 51435c4bbdfSmrg RealizeFontProcPtr RealizeFont; 51535c4bbdfSmrg UnrealizeFontProcPtr UnrealizeFont; 51605b261ecSmrg 51705b261ecSmrg /* Cursor Procedures */ 51805b261ecSmrg 51935c4bbdfSmrg ConstrainCursorProcPtr ConstrainCursor; 5209ace9065Smrg ConstrainCursorHarderProcPtr ConstrainCursorHarder; 52135c4bbdfSmrg CursorLimitsProcPtr CursorLimits; 52235c4bbdfSmrg DisplayCursorProcPtr DisplayCursor; 52335c4bbdfSmrg RealizeCursorProcPtr RealizeCursor; 52435c4bbdfSmrg UnrealizeCursorProcPtr UnrealizeCursor; 52535c4bbdfSmrg RecolorCursorProcPtr RecolorCursor; 52635c4bbdfSmrg SetCursorPositionProcPtr SetCursorPosition; 52705b261ecSmrg 52805b261ecSmrg /* GC procedures */ 52905b261ecSmrg 53035c4bbdfSmrg CreateGCProcPtr CreateGC; 53105b261ecSmrg 53205b261ecSmrg /* Colormap procedures */ 53305b261ecSmrg 53435c4bbdfSmrg CreateColormapProcPtr CreateColormap; 53535c4bbdfSmrg DestroyColormapProcPtr DestroyColormap; 53635c4bbdfSmrg InstallColormapProcPtr InstallColormap; 53735c4bbdfSmrg UninstallColormapProcPtr UninstallColormap; 53805b261ecSmrg ListInstalledColormapsProcPtr ListInstalledColormaps; 53935c4bbdfSmrg StoreColorsProcPtr StoreColors; 54035c4bbdfSmrg ResolveColorProcPtr ResolveColor; 54105b261ecSmrg 54205b261ecSmrg /* Region procedures */ 54305b261ecSmrg 54435c4bbdfSmrg BitmapToRegionProcPtr BitmapToRegion; 54505b261ecSmrg 54605b261ecSmrg /* os layer procedures */ 54705b261ecSmrg 54835c4bbdfSmrg ScreenBlockHandlerProcPtr BlockHandler; 54935c4bbdfSmrg ScreenWakeupHandlerProcPtr WakeupHandler; 55005b261ecSmrg 55105b261ecSmrg /* anybody can get a piece of this array */ 55235c4bbdfSmrg PrivateRec *devPrivates; 55305b261ecSmrg 55405b261ecSmrg CreateScreenResourcesProcPtr CreateScreenResources; 55535c4bbdfSmrg ModifyPixmapHeaderProcPtr ModifyPixmapHeader; 55605b261ecSmrg 55735c4bbdfSmrg GetWindowPixmapProcPtr GetWindowPixmap; 55835c4bbdfSmrg SetWindowPixmapProcPtr SetWindowPixmap; 55935c4bbdfSmrg GetScreenPixmapProcPtr GetScreenPixmap; 56035c4bbdfSmrg SetScreenPixmapProcPtr SetScreenPixmap; 56135c4bbdfSmrg NameWindowPixmapProcPtr NameWindowPixmap; 56205b261ecSmrg 56335c4bbdfSmrg PixmapPtr pScratchPixmap; /* scratch pixmap "pool" */ 56405b261ecSmrg 56535c4bbdfSmrg unsigned int totalPixmapSize; 56605b261ecSmrg 56735c4bbdfSmrg MarkWindowProcPtr MarkWindow; 56805b261ecSmrg MarkOverlappedWindowsProcPtr MarkOverlappedWindows; 56935c4bbdfSmrg ConfigNotifyProcPtr ConfigNotify; 57035c4bbdfSmrg MoveWindowProcPtr MoveWindow; 57135c4bbdfSmrg ResizeWindowProcPtr ResizeWindow; 57235c4bbdfSmrg GetLayerWindowProcPtr GetLayerWindow; 57335c4bbdfSmrg HandleExposuresProcPtr HandleExposures; 57435c4bbdfSmrg ReparentWindowProcPtr ReparentWindow; 57505b261ecSmrg 57635c4bbdfSmrg SetShapeProcPtr SetShape; 57705b261ecSmrg 57835c4bbdfSmrg ChangeBorderWidthProcPtr ChangeBorderWidth; 57935c4bbdfSmrg MarkUnrealizedWindowProcPtr MarkUnrealizedWindow; 58005b261ecSmrg 5814642e01fSmrg /* Device cursor procedures */ 5824642e01fSmrg DeviceCursorInitializeProcPtr DeviceCursorInitialize; 58335c4bbdfSmrg DeviceCursorCleanupProcPtr DeviceCursorCleanup; 5849ace9065Smrg 5859ace9065Smrg /* set it in driver side if X server can copy the framebuffer content. 5869ace9065Smrg * Meant to be used together with '-background none' option, avoiding 5879ace9065Smrg * malicious users to steal framebuffer's content if that would be the 5889ace9065Smrg * default */ 58935c4bbdfSmrg Bool canDoBGNoneRoot; 59035c4bbdfSmrg 59135c4bbdfSmrg Bool isGPU; 59235c4bbdfSmrg 59335c4bbdfSmrg struct xorg_list unattached_list; 59435c4bbdfSmrg struct xorg_list unattached_head; 59535c4bbdfSmrg 59635c4bbdfSmrg ScreenPtr current_master; 59735c4bbdfSmrg 59835c4bbdfSmrg struct xorg_list output_slave_list; 59935c4bbdfSmrg struct xorg_list output_head; 60035c4bbdfSmrg 60135c4bbdfSmrg SharePixmapBackingProcPtr SharePixmapBacking; 60235c4bbdfSmrg SetSharedPixmapBackingProcPtr SetSharedPixmapBacking; 60335c4bbdfSmrg 60435c4bbdfSmrg StartPixmapTrackingProcPtr StartPixmapTracking; 60535c4bbdfSmrg StopPixmapTrackingProcPtr StopPixmapTracking; 60635c4bbdfSmrg 60735c4bbdfSmrg struct xorg_list pixmap_dirty_list; 60835c4bbdfSmrg struct xorg_list offload_slave_list; 60935c4bbdfSmrg struct xorg_list offload_head; 61035c4bbdfSmrg 61135c4bbdfSmrg ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap; 61235c4bbdfSmrg XYToWindowProcPtr XYToWindow; 61305b261ecSmrg} ScreenRec; 61405b261ecSmrg 61535c4bbdfSmrgstatic inline RegionPtr 61635c4bbdfSmrgBitmapToRegion(ScreenPtr _pScreen, PixmapPtr pPix) 61735c4bbdfSmrg{ 61835c4bbdfSmrg return (*(_pScreen)->BitmapToRegion) (pPix); /* no mi version?! */ 6196747b715Smrg} 6206747b715Smrg 62105b261ecSmrgtypedef struct _ScreenInfo { 62235c4bbdfSmrg int imageByteOrder; 62335c4bbdfSmrg int bitmapScanlineUnit; 62435c4bbdfSmrg int bitmapScanlinePad; 62535c4bbdfSmrg int bitmapBitOrder; 62635c4bbdfSmrg int numPixmapFormats; 62735c4bbdfSmrg PixmapFormatRec formats[MAXFORMATS]; 62835c4bbdfSmrg int numScreens; 62935c4bbdfSmrg ScreenPtr screens[MAXSCREENS]; 63035c4bbdfSmrg int numGPUScreens; 63135c4bbdfSmrg ScreenPtr gpuscreens[MAXGPUSCREENS]; 63235c4bbdfSmrg int x; /* origin */ 63335c4bbdfSmrg int y; /* origin */ 63435c4bbdfSmrg int width; /* total width of all screens together */ 63535c4bbdfSmrg int height; /* total height of all screens together */ 63605b261ecSmrg} ScreenInfo; 63705b261ecSmrg 6386747b715Smrgextern _X_EXPORT ScreenInfo screenInfo; 63905b261ecSmrg 64035c4bbdfSmrgextern _X_EXPORT void InitOutput(ScreenInfo * /*pScreenInfo */ , 64135c4bbdfSmrg int /*argc */ , 64235c4bbdfSmrg char ** /*argv */ ); 64305b261ecSmrg 64435c4bbdfSmrg#endif /* SCREENINTSTRUCT_H */ 645