Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | /* |
2 | * External interface to generic rootless mode | |
3 | */ | |
4 | /* | |
5 | * Copyright (c) 2001 Greg Parker. All Rights Reserved. | |
6 | * Copyright (c) 2002-2003 Torrey T. Lyons. All Rights Reserved. | |
7 | * | |
8 | * Permission is hereby granted, free of charge, to any person obtaining a | |
9 | * copy of this software and associated documentation files (the "Software"), | |
10 | * to deal in the Software without restriction, including without limitation | |
11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
12 | * and/or sell copies of the Software, and to permit persons to whom the | |
13 | * Software is furnished to do so, subject to the following conditions: | |
14 | * | |
15 | * The above copyright notice and this permission notice shall be included in | |
16 | * all copies or substantial portions of the Software. | |
17 | * | |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
21 | * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
22 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
23 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
24 | * DEALINGS IN THE SOFTWARE. | |
25 | * | |
26 | * Except as contained in this notice, the name(s) of the above copyright | |
27 | * holders shall not be used in advertising or otherwise to promote the sale, | |
28 | * use or other dealings in this Software without prior written authorization. | |
29 | */ | |
30 | ||
31 | #ifdef HAVE_DIX_CONFIG_H | |
32 | #include <dix-config.h> | |
33 | #endif | |
34 | ||
35 | #ifndef _ROOTLESS_H | |
36 | #define _ROOTLESS_H | |
37 | ||
38 | #include "rootlessConfig.h" | |
39 | #include "mi.h" | |
40 | #include "gcstruct.h" | |
41 | ||
42 | /* | |
43 | Each top-level rootless window has a one-to-one correspondence to a physical | |
44 | on-screen window. The physical window is refered to as a "frame". | |
45 | */ | |
46 | ||
47 | typedef void *RootlessFrameID; | |
48 | ||
49 | /* | |
50 | * RootlessWindowRec | |
51 | * This structure stores the per-frame data used by the rootless code. | |
52 | * Each top-level X window has one RootlessWindowRec associated with it. | |
53 | */ | |
54 | typedef struct _RootlessWindowRec { | |
55 | // Position and size includes the window border | |
56 | // Position is in per-screen coordinates | |
57 | int x, y; | |
58 | unsigned int width, height; | |
59 | unsigned int borderWidth; | |
60 | int level; | |
61 | ||
62 | RootlessFrameID wid; // implementation specific frame id | |
63 | WindowPtr win; // underlying X window | |
64 | ||
65 | // Valid only when drawing (ie. is_drawing is set) | |
66 | char *pixelData; | |
67 | int bytesPerRow; | |
68 | ||
69 | PixmapPtr pixmap; | |
70 | ||
71 | unsigned int is_drawing:1; // Currently drawing? | |
72 | unsigned int is_reorder_pending:1; | |
73 | unsigned int is_offscreen:1; | |
74 | unsigned int is_obscured:1; | |
75 | } RootlessWindowRec, *RootlessWindowPtr; | |
76 | ||
77 | /* Offset for screen-local to global coordinate transforms */ | |
78 | extern int rootlessGlobalOffsetX; | |
79 | extern int rootlessGlobalOffsetY; | |
80 | ||
81 | /* The minimum number of bytes or pixels for which to use the | |
82 | implementation's accelerated functions. */ | |
83 | extern unsigned int rootless_CopyBytes_threshold; | |
84 | extern unsigned int rootless_CopyWindow_threshold; | |
85 | ||
86 | /* Gravity for window contents during resizing */ | |
87 | enum rl_gravity_enum { | |
88 | RL_GRAVITY_NONE = 0, /* no gravity, fill everything */ | |
89 | RL_GRAVITY_NORTH_WEST = 1, /* anchor to top-left corner */ | |
90 | RL_GRAVITY_NORTH_EAST = 2, /* anchor to top-right corner */ | |
91 | RL_GRAVITY_SOUTH_EAST = 3, /* anchor to bottom-right corner */ | |
92 | RL_GRAVITY_SOUTH_WEST = 4, /* anchor to bottom-left corner */ | |
93 | }; | |
94 | ||
95 | /*------------------------------------------ | |
96 | Rootless Implementation Functions | |
97 | ------------------------------------------*/ | |
98 | ||
99 | /* | |
100 | * Create a new frame. | |
101 | * The frame is created unmapped. | |
102 | * | |
103 | * pFrame RootlessWindowPtr for this frame should be completely | |
104 | * initialized before calling except for pFrame->wid, which | |
105 | * is set by this function. | |
106 | * pScreen Screen on which to place the new frame | |
107 | * newX, newY Position of the frame. | |
108 | * pNewShape Shape for the frame (in frame-local coordinates). NULL for | |
109 | * unshaped frames. | |
110 | */ | |
111 | typedef Bool (*RootlessCreateFrameProc) | |
112 | (RootlessWindowPtr pFrame, ScreenPtr pScreen, int newX, int newY, | |
113 | RegionPtr pNewShape); | |
114 | ||
115 | /* | |
116 | * Destroy a frame. | |
117 | * Drawing is stopped and all updates are flushed before this is called. | |
118 | * | |
119 | * wid Frame id | |
120 | */ | |
121 | typedef void (*RootlessDestroyFrameProc) | |
122 | (RootlessFrameID wid); | |
123 | ||
124 | /* | |
125 | * Move a frame on screen. | |
126 | * Drawing is stopped and all updates are flushed before this is called. | |
127 | * | |
128 | * wid Frame id | |
129 | * pScreen Screen to move the new frame to | |
130 | * newX, newY New position of the frame | |
131 | */ | |
132 | typedef void (*RootlessMoveFrameProc) | |
133 | (RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY); | |
134 | ||
135 | /* | |
136 | * Resize and move a frame. | |
137 | * Drawing is stopped and all updates are flushed before this is called. | |
138 | * | |
139 | * wid Frame id | |
140 | * pScreen Screen to move the new frame to | |
141 | * newX, newY New position of the frame | |
142 | * newW, newH New size of the frame | |
143 | * gravity Gravity for window contents (rl_gravity_enum). This is always | |
144 | * RL_GRAVITY_NONE unless ROOTLESS_RESIZE_GRAVITY is set. | |
145 | */ | |
146 | typedef void (*RootlessResizeFrameProc) | |
147 | (RootlessFrameID wid, ScreenPtr pScreen, | |
148 | int newX, int newY, unsigned int newW, unsigned int newH, | |
149 | unsigned int gravity); | |
150 | ||
151 | /* | |
152 | * Change frame ordering (AKA stacking, layering). | |
153 | * Drawing is stopped before this is called. Unmapped frames are mapped by | |
154 | * setting their ordering. | |
155 | * | |
156 | * wid Frame id | |
157 | * nextWid Frame id of frame that is now above this one or NULL if this | |
158 | * frame is at the top. | |
159 | */ | |
160 | typedef void (*RootlessRestackFrameProc) | |
161 | (RootlessFrameID wid, RootlessFrameID nextWid); | |
162 | ||
163 | /* | |
164 | * Change frame's shape. | |
165 | * Drawing is stopped before this is called. | |
166 | * | |
167 | * wid Frame id | |
168 | * pNewShape New shape for the frame (in frame-local coordinates) | |
169 | * or NULL if now unshaped. | |
170 | */ | |
171 | typedef void (*RootlessReshapeFrameProc) | |
172 | (RootlessFrameID wid, RegionPtr pNewShape); | |
173 | ||
174 | /* | |
175 | * Unmap a frame. | |
176 | * | |
177 | * wid Frame id | |
178 | */ | |
179 | typedef void (*RootlessUnmapFrameProc) | |
180 | (RootlessFrameID wid); | |
181 | ||
182 | /* | |
183 | * Start drawing to a frame. | |
184 | * Prepare a frame for direct access to its backing buffer. | |
185 | * | |
186 | * wid Frame id | |
187 | * pixelData Address of the backing buffer (returned) | |
188 | * bytesPerRow Width in bytes of the backing buffer (returned) | |
189 | */ | |
190 | typedef void (*RootlessStartDrawingProc) | |
191 | (RootlessFrameID wid, char **pixelData, int *bytesPerRow); | |
192 | ||
193 | /* | |
194 | * Stop drawing to a frame. | |
195 | * No drawing to the frame's backing buffer will occur until drawing | |
196 | * is started again. | |
197 | * | |
198 | * wid Frame id | |
199 | * flush Flush drawing updates for this frame to the screen. | |
200 | */ | |
201 | typedef void (*RootlessStopDrawingProc) | |
202 | (RootlessFrameID wid, Bool flush); | |
203 | ||
204 | /* | |
205 | * Flush drawing updates to the screen. | |
206 | * Drawing is stopped before this is called. | |
207 | * | |
208 | * wid Frame id | |
209 | * pDamage Region containing all the changed pixels in frame-lcoal | |
210 | * coordinates. This is clipped to the window's clip. | |
211 | */ | |
212 | typedef void (*RootlessUpdateRegionProc) | |
213 | (RootlessFrameID wid, RegionPtr pDamage); | |
214 | ||
215 | /* | |
216 | * Mark damaged rectangles as requiring redisplay to screen. | |
217 | * | |
218 | * wid Frame id | |
219 | * nrects Number of damaged rectangles | |
220 | * rects Array of damaged rectangles in frame-local coordinates | |
221 | * shift_x, Vector to shift rectangles by | |
222 | * shift_y | |
223 | */ | |
224 | typedef void (*RootlessDamageRectsProc) | |
225 | (RootlessFrameID wid, int nrects, const BoxRec * rects, | |
226 | int shift_x, int shift_y); | |
227 | ||
228 | /* | |
229 | * Switch the window associated with a frame. (Optional) | |
230 | * When a framed window is reparented, the frame is resized and set to | |
231 | * use the new top-level parent. If defined this function will be called | |
232 | * afterwards for implementation specific bookkeeping. | |
233 | * | |
234 | * pFrame Frame whose window has switched | |
235 | * oldWin Previous window wrapped by this frame | |
236 | */ | |
237 | typedef void (*RootlessSwitchWindowProc) | |
238 | (RootlessWindowPtr pFrame, WindowPtr oldWin); | |
239 | ||
240 | /* | |
241 | * Check if window should be reordered. (Optional) | |
242 | * The underlying window system may animate windows being ordered in. | |
243 | * We want them to be mapped but remain ordered out until the animation | |
244 | * completes. If defined this function will be called to check if a | |
245 | * framed window should be reordered now. If this function returns | |
246 | * FALSE, the window will still be mapped from the X11 perspective, but | |
247 | * the RestackFrame function will not be called for its frame. | |
248 | * | |
249 | * pFrame Frame to reorder | |
250 | */ | |
251 | typedef Bool (*RootlessDoReorderWindowProc) | |
252 | (RootlessWindowPtr pFrame); | |
253 | ||
254 | /* | |
255 | * Copy bytes. (Optional) | |
256 | * Source and destinate may overlap and the right thing should happen. | |
257 | * | |
258 | * width Bytes to copy per row | |
259 | * height Number of rows | |
260 | * src Source data | |
261 | * srcRowBytes Width of source in bytes | |
262 | * dst Destination data | |
263 | * dstRowBytes Width of destination in bytes | |
264 | */ | |
265 | typedef void (*RootlessCopyBytesProc) | |
266 | (unsigned int width, unsigned int height, | |
267 | const void *src, unsigned int srcRowBytes, | |
268 | void *dst, unsigned int dstRowBytes); | |
269 | ||
270 | /* | |
271 | * Copy area in frame to another part of frame. (Optional) | |
272 | * | |
273 | * wid Frame id | |
274 | * dstNrects Number of rectangles to copy | |
275 | * dstRects Array of rectangles to copy | |
276 | * dx, dy Number of pixels away to copy area | |
277 | */ | |
278 | typedef void (*RootlessCopyWindowProc) | |
279 | (RootlessFrameID wid, int dstNrects, const BoxRec * dstRects, int dx, int dy); | |
280 | ||
281 | typedef void (*RootlessHideWindowProc) | |
282 | (RootlessFrameID wid); | |
283 | ||
284 | typedef void (*RootlessUpdateColormapProc) | |
285 | (RootlessFrameID wid, ScreenPtr pScreen); | |
286 | ||
287 | /* | |
288 | * Rootless implementation function list | |
289 | */ | |
290 | typedef struct _RootlessFrameProcs { | |
291 | RootlessCreateFrameProc CreateFrame; | |
292 | RootlessDestroyFrameProc DestroyFrame; | |
293 | ||
294 | RootlessMoveFrameProc MoveFrame; | |
295 | RootlessResizeFrameProc ResizeFrame; | |
296 | RootlessRestackFrameProc RestackFrame; | |
297 | RootlessReshapeFrameProc ReshapeFrame; | |
298 | RootlessUnmapFrameProc UnmapFrame; | |
299 | ||
300 | RootlessStartDrawingProc StartDrawing; | |
301 | RootlessStopDrawingProc StopDrawing; | |
302 | RootlessUpdateRegionProc UpdateRegion; | |
303 | RootlessDamageRectsProc DamageRects; | |
304 | ||
305 | /* Optional frame functions */ | |
306 | RootlessSwitchWindowProc SwitchWindow; | |
307 | RootlessDoReorderWindowProc DoReorderWindow; | |
308 | RootlessHideWindowProc HideWindow; | |
309 | RootlessUpdateColormapProc UpdateColormap; | |
310 | ||
311 | /* Optional acceleration functions */ | |
312 | RootlessCopyBytesProc CopyBytes; | |
313 | RootlessCopyWindowProc CopyWindow; | |
314 | } RootlessFrameProcsRec, *RootlessFrameProcsPtr; | |
315 | ||
316 | /* | |
317 | * Initialize rootless mode on the given screen. | |
318 | */ | |
319 | Bool RootlessInit(ScreenPtr pScreen, RootlessFrameProcsPtr procs); | |
320 | ||
321 | /* | |
322 | * Return the frame ID for the physical window displaying the given window. | |
323 | * | |
324 | * create If true and the window has no frame, attempt to create one | |
325 | */ | |
326 | RootlessFrameID RootlessFrameForWindow(WindowPtr pWin, Bool create); | |
327 | ||
328 | /* | |
329 | * Return the top-level parent of a window. | |
330 | * The root is the top-level parent of itself, even though the root is | |
331 | * not otherwise considered to be a top-level window. | |
332 | */ | |
333 | WindowPtr TopLevelParent(WindowPtr pWindow); | |
334 | ||
335 | /* | |
336 | * Prepare a window for direct access to its backing buffer. | |
337 | */ | |
338 | void RootlessStartDrawing(WindowPtr pWindow); | |
339 | ||
340 | /* | |
341 | * Finish drawing to a window's backing buffer. | |
342 | * | |
343 | * flush If true, damaged areas are flushed to the screen. | |
344 | */ | |
345 | void RootlessStopDrawing(WindowPtr pWindow, Bool flush); | |
346 | ||
347 | /* | |
348 | * Alocate a new screen pixmap. | |
349 | * miCreateScreenResources does not do this properly with a null | |
350 | * framebuffer pointer. | |
351 | */ | |
352 | void RootlessUpdateScreenPixmap(ScreenPtr pScreen); | |
353 | ||
354 | /* | |
355 | * Reposition all windows on a screen to their correct positions. | |
356 | */ | |
357 | void RootlessRepositionWindows(ScreenPtr pScreen); | |
358 | ||
359 | /* | |
360 | * Bring all windows to the front of the native stack | |
361 | */ | |
362 | void RootlessOrderAllWindows(Bool include_unhitable); | |
363 | #endif /* _ROOTLESS_H */ |