1/*
2 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 * Copyright © 2003 Keith Packard
24 *
25 * Permission to use, copy, modify, distribute, and sell this software and its
26 * documentation for any purpose is hereby granted without fee, provided that
27 * the above copyright notice appear in all copies and that both that
28 * copyright notice and this permission notice appear in supporting
29 * documentation, and that the name of Keith Packard not be used in
30 * advertising or publicity pertaining to distribution of the software without
31 * specific, written prior permission.  Keith Packard makes no
32 * representations about the suitability of this software for any purpose.  It
33 * is provided "as is" without express or implied warranty.
34 *
35 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
36 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
37 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
38 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
39 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
40 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
41 * PERFORMANCE OF THIS SOFTWARE.
42 */
43
44#ifdef HAVE_DIX_CONFIG_H
45#include <dix-config.h>
46#endif
47
48#ifndef _COMPINT_H_
49#define _COMPINT_H_
50
51#include "misc.h"
52#include "scrnintstr.h"
53#include "os.h"
54#include "regionstr.h"
55#include "validate.h"
56#include "windowstr.h"
57#include "input.h"
58#include "resource.h"
59#include "colormapst.h"
60#include "cursorstr.h"
61#include "dixstruct.h"
62#include "gcstruct.h"
63#include "servermd.h"
64#include "dixevents.h"
65#include "globals.h"
66#include "picturestr.h"
67#include "extnsionst.h"
68#include "privates.h"
69#include "mi.h"
70#include "damage.h"
71#include "damageextint.h"
72#include "xfixes.h"
73#include <X11/extensions/compositeproto.h>
74#include "compositeext.h"
75#include <assert.h>
76
77/*
78 *  enable this for debugging
79
80    #define COMPOSITE_DEBUG
81 */
82
83typedef struct _CompClientWindow {
84    struct _CompClientWindow *next;
85    XID id;
86    int update;
87} CompClientWindowRec, *CompClientWindowPtr;
88
89typedef struct _CompWindow {
90    RegionRec borderClip;
91    DamagePtr damage;           /* for automatic update mode */
92    Bool damageRegistered;
93    Bool damaged;
94    int update;
95    CompClientWindowPtr clients;
96    int oldx;
97    int oldy;
98    PixmapPtr pOldPixmap;
99    int borderClipX, borderClipY;
100} CompWindowRec, *CompWindowPtr;
101
102#define COMP_ORIGIN_INVALID	    0x80000000
103
104typedef struct _CompSubwindows {
105    int update;
106    CompClientWindowPtr clients;
107} CompSubwindowsRec, *CompSubwindowsPtr;
108
109#ifndef COMP_INCLUDE_RGB24_VISUAL
110#define COMP_INCLUDE_RGB24_VISUAL 0
111#endif
112
113typedef struct _CompOverlayClientRec *CompOverlayClientPtr;
114
115typedef struct _CompOverlayClientRec {
116    CompOverlayClientPtr pNext;
117    ClientPtr pClient;
118    ScreenPtr pScreen;
119    XID resource;
120} CompOverlayClientRec;
121
122typedef struct _CompImplicitRedirectException {
123    XID parentVisual;
124    XID winVisual;
125} CompImplicitRedirectException;
126
127typedef struct _CompScreen {
128    PositionWindowProcPtr PositionWindow;
129    CopyWindowProcPtr CopyWindow;
130    CreateWindowProcPtr CreateWindow;
131    DestroyWindowProcPtr DestroyWindow;
132    RealizeWindowProcPtr RealizeWindow;
133    UnrealizeWindowProcPtr UnrealizeWindow;
134    ClipNotifyProcPtr ClipNotify;
135    /*
136     * Called from ConfigureWindow, these
137     * three track changes to the offscreen storage
138     * geometry
139     */
140    ConfigNotifyProcPtr ConfigNotify;
141    MoveWindowProcPtr MoveWindow;
142    ResizeWindowProcPtr ResizeWindow;
143    ChangeBorderWidthProcPtr ChangeBorderWidth;
144    /*
145     * Reparenting has an effect on Subwindows redirect
146     */
147    ReparentWindowProcPtr ReparentWindow;
148
149    /*
150     * Colormaps for new visuals better not get installed
151     */
152    InstallColormapProcPtr InstallColormap;
153
154    /*
155     * Fake backing store via automatic redirection
156     */
157    ChangeWindowAttributesProcPtr ChangeWindowAttributes;
158
159    Bool pendingScreenUpdate;
160
161    CloseScreenProcPtr CloseScreen;
162    int numAlternateVisuals;
163    VisualID *alternateVisuals;
164    int numImplicitRedirectExceptions;
165    CompImplicitRedirectException *implicitRedirectExceptions;
166
167    WindowPtr pOverlayWin;
168    Window overlayWid;
169    CompOverlayClientPtr pOverlayClients;
170
171    SourceValidateProcPtr SourceValidate;
172} CompScreenRec, *CompScreenPtr;
173
174extern DevPrivateKeyRec CompScreenPrivateKeyRec;
175
176#define CompScreenPrivateKey (&CompScreenPrivateKeyRec)
177
178extern DevPrivateKeyRec CompWindowPrivateKeyRec;
179
180#define CompWindowPrivateKey (&CompWindowPrivateKeyRec)
181
182extern DevPrivateKeyRec CompSubwindowsPrivateKeyRec;
183
184#define CompSubwindowsPrivateKey (&CompSubwindowsPrivateKeyRec)
185
186#define GetCompScreen(s) ((CompScreenPtr) \
187    dixLookupPrivate(&(s)->devPrivates, CompScreenPrivateKey))
188#define GetCompWindow(w) ((CompWindowPtr) \
189    dixLookupPrivate(&(w)->devPrivates, CompWindowPrivateKey))
190#define GetCompSubwindows(w) ((CompSubwindowsPtr) \
191    dixLookupPrivate(&(w)->devPrivates, CompSubwindowsPrivateKey))
192
193extern RESTYPE CompositeClientSubwindowsType;
194extern RESTYPE CompositeClientOverlayType;
195
196/*
197 * compalloc.c
198 */
199
200Bool
201 compRedirectWindow(ClientPtr pClient, WindowPtr pWin, int update);
202
203void
204 compFreeClientWindow(WindowPtr pWin, XID id);
205
206int
207 compUnredirectWindow(ClientPtr pClient, WindowPtr pWin, int update);
208
209int
210 compRedirectSubwindows(ClientPtr pClient, WindowPtr pWin, int update);
211
212void
213 compFreeClientSubwindows(WindowPtr pWin, XID id);
214
215int
216 compUnredirectSubwindows(ClientPtr pClient, WindowPtr pWin, int update);
217
218int
219 compRedirectOneSubwindow(WindowPtr pParent, WindowPtr pWin);
220
221int
222 compUnredirectOneSubwindow(WindowPtr pParent, WindowPtr pWin);
223
224Bool
225 compAllocPixmap(WindowPtr pWin);
226
227void
228 compSetParentPixmap(WindowPtr pWin);
229
230void
231 compRestoreWindow(WindowPtr pWin, PixmapPtr pPixmap);
232
233Bool
234
235compReallocPixmap(WindowPtr pWin, int x, int y,
236                  unsigned int w, unsigned int h, int bw);
237
238void compMarkAncestors(WindowPtr pWin);
239
240/*
241 * compinit.c
242 */
243
244Bool
245 compScreenInit(ScreenPtr pScreen);
246
247/*
248 * compoverlay.c
249 */
250
251void
252 compFreeOverlayClient(CompOverlayClientPtr pOcToDel);
253
254CompOverlayClientPtr
255compFindOverlayClient(ScreenPtr pScreen, ClientPtr pClient);
256
257CompOverlayClientPtr
258compCreateOverlayClient(ScreenPtr pScreen, ClientPtr pClient);
259
260Bool
261 compCreateOverlayWindow(ScreenPtr pScreen);
262
263void
264 compDestroyOverlayWindow(ScreenPtr pScreen);
265
266/*
267 * compwindow.c
268 */
269
270#ifdef COMPOSITE_DEBUG
271void
272 compCheckTree(ScreenPtr pScreen);
273#else
274#define compCheckTree(s)
275#endif
276
277void
278 compSetPixmap(WindowPtr pWin, PixmapPtr pPixmap, int bw);
279
280Bool
281 compCheckRedirect(WindowPtr pWin);
282
283Bool
284 compPositionWindow(WindowPtr pWin, int x, int y);
285
286Bool
287 compRealizeWindow(WindowPtr pWin);
288
289Bool
290 compUnrealizeWindow(WindowPtr pWin);
291
292void
293 compClipNotify(WindowPtr pWin, int dx, int dy);
294
295void
296 compMoveWindow(WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind);
297
298void
299
300compResizeWindow(WindowPtr pWin, int x, int y,
301                 unsigned int w, unsigned int h, WindowPtr pSib);
302
303void
304 compChangeBorderWidth(WindowPtr pWin, unsigned int border_width);
305
306void
307 compReparentWindow(WindowPtr pWin, WindowPtr pPriorParent);
308
309Bool
310 compCreateWindow(WindowPtr pWin);
311
312Bool
313 compDestroyWindow(WindowPtr pWin);
314
315void
316 compSetRedirectBorderClip(WindowPtr pWin, RegionPtr pRegion);
317
318RegionPtr
319 compGetRedirectBorderClip(WindowPtr pWin);
320
321void
322 compCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
323
324void
325 compPaintChildrenToWindow(WindowPtr pWin);
326
327WindowPtr
328 CompositeRealChildHead(WindowPtr pWin);
329
330int
331 DeleteWindowNoInputDevices(void *value, XID wid);
332
333int
334
335compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
336                 int bw, WindowPtr pSib);
337
338void PanoramiXCompositeInit(void);
339void PanoramiXCompositeReset(void);
340
341#endif                          /* _COMPINT_H_ */
342