1 | /*
|
---|
2 | * Copyright 2001-2003 Red Hat Inc., Durham, North Carolina.
|
---|
3 | *
|
---|
4 | * All Rights Reserved.
|
---|
5 | *
|
---|
6 | * Permission is hereby granted, free of charge, to any person obtaining
|
---|
7 | * a copy of this software and associated documentation files (the
|
---|
8 | * "Software"), to deal in the Software without restriction, including
|
---|
9 | * without limitation on the rights to use, copy, modify, merge,
|
---|
10 | * publish, distribute, sublicense, and/or sell copies of the Software,
|
---|
11 | * and to permit persons to whom the Software is furnished to do so,
|
---|
12 | * subject to the following conditions:
|
---|
13 | *
|
---|
14 | * The above copyright notice and this permission notice (including the
|
---|
15 | * next paragraph) shall be included in all copies or substantial
|
---|
16 | * portions of the Software.
|
---|
17 | *
|
---|
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
---|
19 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
---|
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
---|
21 | * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
|
---|
22 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
---|
23 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
---|
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
---|
25 | * SOFTWARE.
|
---|
26 | */
|
---|
27 |
|
---|
28 | /*
|
---|
29 | * Authors:
|
---|
30 | * Kevin E. Martin <[email protected]>
|
---|
31 | * David H. Dawes <[email protected]>
|
---|
32 | * Rickard E. (Rik) Faith <[email protected]>
|
---|
33 | *
|
---|
34 | */
|
---|
35 |
|
---|
36 | /** \file
|
---|
37 | * Main header file included by all other DMX-related files.
|
---|
38 | */
|
---|
39 |
|
---|
40 | /** \mainpage
|
---|
41 | * - <a href="http://dmx.sourceforge.net">DMX Home Page</a>
|
---|
42 | * - <a href="http://sourceforge.net/projects/dmx">DMX Project Page (on
|
---|
43 | * Source Forge)</a>
|
---|
44 | * - <a href="http://dmx.sourceforge.net/dmx.html">Distributed Multihead
|
---|
45 | * X design</a>, the design document for DMX
|
---|
46 | * - <a href="http://dmx.sourceforge.net/DMXSpec.txt">Client-to-Server
|
---|
47 | * DMX Extension to the X Protocol</a>
|
---|
48 | */
|
---|
49 |
|
---|
50 | #ifndef DMX_H
|
---|
51 | #define DMX_H
|
---|
52 |
|
---|
53 | #if HAVE_DMX_CONFIG_H
|
---|
54 | #include <dmx-config.h>
|
---|
55 | #endif
|
---|
56 |
|
---|
57 | #include "gcstruct.h"
|
---|
58 |
|
---|
59 | /* Handle client-side include files in one place. */
|
---|
60 | #include "dmxclient.h"
|
---|
61 |
|
---|
62 | #include "globals.h"
|
---|
63 | #include "scrnintstr.h"
|
---|
64 |
|
---|
65 | #include "picturestr.h"
|
---|
66 |
|
---|
67 | #ifdef GLXEXT
|
---|
68 | #include <GL/glx.h>
|
---|
69 | #include <GL/glxint.h>
|
---|
70 | #endif
|
---|
71 |
|
---|
72 | typedef enum {
|
---|
73 | PosNone = -1,
|
---|
74 | PosAbsolute = 0,
|
---|
75 | PosRightOf,
|
---|
76 | PosLeftOf,
|
---|
77 | PosAbove,
|
---|
78 | PosBelow,
|
---|
79 | PosRelative
|
---|
80 | } PositionType;
|
---|
81 |
|
---|
82 | /** Provide the typedef globally, but keep the contents opaque outside
|
---|
83 | * of the input routines. \see dmxinput.h */
|
---|
84 | typedef struct _DMXInputInfo DMXInputInfo;
|
---|
85 |
|
---|
86 | /** Provide the typedef globally, but keep the contents opaque outside
|
---|
87 | * of the XSync statistic routines. \see dmxstat.c */
|
---|
88 | typedef struct _DMXStatInfo DMXStatInfo;
|
---|
89 |
|
---|
90 | /** Global structure containing information about each backend screen. */
|
---|
91 | typedef struct _DMXScreenInfo {
|
---|
92 | const char *name; /**< Name from command line or config file */
|
---|
93 | int index; /**< Index into dmxScreens global */
|
---|
94 |
|
---|
95 | /*---------- Back-end X server information ----------*/
|
---|
96 |
|
---|
97 | Display *beDisplay; /**< Back-end X server's display */
|
---|
98 | int beWidth; /**< Width of BE display */
|
---|
99 | int beHeight; /**< Height of BE display */
|
---|
100 | int beDepth; /**< Depth of BE display */
|
---|
101 | int beBPP; /**< Bits per pixel of BE display */
|
---|
102 | int beXDPI; /**< Horizontal dots per inch of BE */
|
---|
103 | int beYDPI; /**< Vertical dots per inch of BE */
|
---|
104 |
|
---|
105 | int beNumDepths; /**< Number of depths on BE server */
|
---|
106 | int *beDepths; /**< Depths from BE server */
|
---|
107 |
|
---|
108 | int beNumPixmapFormats; /**< Number of pixmap formats on BE */
|
---|
109 | XPixmapFormatValues *bePixmapFormats; /**< Pixmap formats on BE */
|
---|
110 |
|
---|
111 | int beNumVisuals; /**< Number of visuals on BE */
|
---|
112 | XVisualInfo *beVisuals; /**< Visuals from BE server */
|
---|
113 | int beDefVisualIndex; /**< Default visual index of BE */
|
---|
114 |
|
---|
115 | int beNumDefColormaps; /**< Number of default colormaps */
|
---|
116 | Colormap *beDefColormaps; /**< Default colormaps for DMX server */
|
---|
117 |
|
---|
118 | Pixel beBlackPixel; /**< Default black pixel for BE */
|
---|
119 | Pixel beWhitePixel; /**< Default white pixel for BE */
|
---|
120 |
|
---|
121 | /*---------- Screen window information ----------*/
|
---|
122 |
|
---|
123 | Window scrnWin; /**< "Screen" window on backend display */
|
---|
124 | int scrnX; /**< X offset of "screen" WRT BE display */
|
---|
125 | int scrnY; /**< Y offset of "screen" WRT BE display */
|
---|
126 | int scrnWidth; /**< Width of "screen" */
|
---|
127 | int scrnHeight; /**< Height of "screen" */
|
---|
128 | int scrnXSign; /**< X offset sign of "screen" */
|
---|
129 | int scrnYSign; /**< Y offset sign of "screen" */
|
---|
130 |
|
---|
131 | /** Default drawables for "screen" */
|
---|
132 | Drawable scrnDefDrawables[MAXFORMATS];
|
---|
133 |
|
---|
134 | struct _DMXScreenInfo *next; /**< List of "screens" on same display */
|
---|
135 | struct _DMXScreenInfo *over; /**< List of "screens" that overlap */
|
---|
136 |
|
---|
137 | /*---------- Root window information ----------*/
|
---|
138 |
|
---|
139 | Window rootWin; /**< "Root" window on backend display */
|
---|
140 | int rootX; /**< X offset of "root" window WRT "screen"*/
|
---|
141 | int rootY; /**< Y offset of "root" window WRT "screen"*/
|
---|
142 | int rootWidth; /**< Width of "root" window */
|
---|
143 | int rootHeight; /**< Height of "root" window */
|
---|
144 |
|
---|
145 | int rootXOrigin; /**< Global X origin of "root" window */
|
---|
146 | int rootYOrigin; /**< Global Y origin of "root" window */
|
---|
147 |
|
---|
148 | /*---------- Shadow framebuffer information ----------*/
|
---|
149 |
|
---|
150 | void *shadow; /**< Shadow framebuffer data (if enabled) */
|
---|
151 | XlibGC shadowGC; /**< Default GC used by shadow FB code */
|
---|
152 | XImage *shadowFBImage; /**< Screen image used by shadow FB code */
|
---|
153 |
|
---|
154 | /*---------- Other related information ----------*/
|
---|
155 |
|
---|
156 | int shared; /**< Non-zero if another Xdmx is running */
|
---|
157 |
|
---|
158 | Bool WMRunningOnBE;
|
---|
159 |
|
---|
160 | Cursor noCursor;
|
---|
161 | Cursor curCursor;
|
---|
162 | /* Support for cursors on overlapped
|
---|
163 | * backend displays. */
|
---|
164 | CursorPtr cursor;
|
---|
165 | int cursorVisible;
|
---|
166 | int cursorNotShared; /* for overlapping screens on a backend */
|
---|
167 |
|
---|
168 | PositionType where; /**< Relative layout information */
|
---|
169 | int whereX; /**< Relative layout information */
|
---|
170 | int whereY; /**< Relative layout information */
|
---|
171 | int whereRefScreen; /**< Relative layout information */
|
---|
172 |
|
---|
173 | int savedTimeout; /**< Original screen saver timeout */
|
---|
174 | int dpmsCapable; /**< Non-zero if backend is DPMS capable */
|
---|
175 | int dpmsEnabled; /**< Non-zero if DPMS enabled */
|
---|
176 | int dpmsStandby; /**< Original DPMS standby value */
|
---|
177 | int dpmsSuspend; /**< Original DPMS suspend value */
|
---|
178 | int dpmsOff; /**< Original DPMS off value */
|
---|
179 |
|
---|
180 | DMXStatInfo *stat; /**< Statistics about XSync */
|
---|
181 | Bool needsSync; /**< True if an XSync is pending */
|
---|
182 |
|
---|
183 | #ifdef GLXEXT
|
---|
184 | /** Visual information for glxProxy */
|
---|
185 | int numGlxVisuals;
|
---|
186 | __GLXvisualConfig *glxVisuals;
|
---|
187 | int glxMajorOpcode;
|
---|
188 | int glxErrorBase;
|
---|
189 |
|
---|
190 | /** FB config information for glxProxy */
|
---|
191 | __GLXFBConfig *fbconfigs;
|
---|
192 | int numFBConfigs;
|
---|
193 | #endif
|
---|
194 |
|
---|
195 | /** Function pointers to wrapped screen
|
---|
196 | * functions */
|
---|
197 | CloseScreenProcPtr CloseScreen;
|
---|
198 | SaveScreenProcPtr SaveScreen;
|
---|
199 |
|
---|
200 | CreateGCProcPtr CreateGC;
|
---|
201 |
|
---|
202 | CreateWindowProcPtr CreateWindow;
|
---|
203 | DestroyWindowProcPtr DestroyWindow;
|
---|
204 | PositionWindowProcPtr PositionWindow;
|
---|
205 | ChangeWindowAttributesProcPtr ChangeWindowAttributes;
|
---|
206 | RealizeWindowProcPtr RealizeWindow;
|
---|
207 | UnrealizeWindowProcPtr UnrealizeWindow;
|
---|
208 | RestackWindowProcPtr RestackWindow;
|
---|
209 | WindowExposuresProcPtr WindowExposures;
|
---|
210 | CopyWindowProcPtr CopyWindow;
|
---|
211 |
|
---|
212 | ResizeWindowProcPtr ResizeWindow;
|
---|
213 | ReparentWindowProcPtr ReparentWindow;
|
---|
214 |
|
---|
215 | ChangeBorderWidthProcPtr ChangeBorderWidth;
|
---|
216 |
|
---|
217 | GetImageProcPtr GetImage;
|
---|
218 | GetSpansProcPtr GetSpans;
|
---|
219 |
|
---|
220 | CreatePixmapProcPtr CreatePixmap;
|
---|
221 | DestroyPixmapProcPtr DestroyPixmap;
|
---|
222 | BitmapToRegionProcPtr BitmapToRegion;
|
---|
223 |
|
---|
224 | RealizeFontProcPtr RealizeFont;
|
---|
225 | UnrealizeFontProcPtr UnrealizeFont;
|
---|
226 |
|
---|
227 | CreateColormapProcPtr CreateColormap;
|
---|
228 | DestroyColormapProcPtr DestroyColormap;
|
---|
229 | InstallColormapProcPtr InstallColormap;
|
---|
230 | StoreColorsProcPtr StoreColors;
|
---|
231 |
|
---|
232 | SetShapeProcPtr SetShape;
|
---|
233 |
|
---|
234 | CreatePictureProcPtr CreatePicture;
|
---|
235 | DestroyPictureProcPtr DestroyPicture;
|
---|
236 | ChangePictureClipProcPtr ChangePictureClip;
|
---|
237 | DestroyPictureClipProcPtr DestroyPictureClip;
|
---|
238 |
|
---|
239 | ChangePictureProcPtr ChangePicture;
|
---|
240 | ValidatePictureProcPtr ValidatePicture;
|
---|
241 |
|
---|
242 | CompositeProcPtr Composite;
|
---|
243 | GlyphsProcPtr Glyphs;
|
---|
244 | CompositeRectsProcPtr CompositeRects;
|
---|
245 |
|
---|
246 | InitIndexedProcPtr InitIndexed;
|
---|
247 | CloseIndexedProcPtr CloseIndexed;
|
---|
248 | UpdateIndexedProcPtr UpdateIndexed;
|
---|
249 |
|
---|
250 | TrapezoidsProcPtr Trapezoids;
|
---|
251 | TrianglesProcPtr Triangles;
|
---|
252 | } DMXScreenInfo;
|
---|
253 |
|
---|
254 | /* Global variables available to all Xserver/hw/dmx routines. */
|
---|
255 | extern int dmxNumScreens; /**< Number of dmxScreens */
|
---|
256 | extern DMXScreenInfo *dmxScreens; /**< List of outputs */
|
---|
257 | extern XErrorEvent dmxLastErrorEvent; /**< Last error that
|
---|
258 |
|
---|
259 | * occurred */
|
---|
260 | extern Bool dmxErrorOccurred; /**< True if an error
|
---|
261 |
|
---|
262 | * occurred */
|
---|
263 | extern Bool dmxOffScreenOpt; /**< True if using off
|
---|
264 |
|
---|
265 | * screen
|
---|
266 | * optimizations */
|
---|
267 | extern Bool dmxSubdividePrimitives; /**< True if using the
|
---|
268 |
|
---|
269 | * primitive subdivision
|
---|
270 | * optimization */
|
---|
271 | extern Bool dmxLazyWindowCreation; /**< True if using the
|
---|
272 |
|
---|
273 | * lazy window creation
|
---|
274 | * optimization */
|
---|
275 | extern Bool dmxUseXKB; /**< True if the XKB
|
---|
276 |
|
---|
277 | * extension should be
|
---|
278 | * used with the backend
|
---|
279 | * servers */
|
---|
280 | extern int dmxDepth; /**< Requested depth if
|
---|
281 |
|
---|
282 | * non-zero */
|
---|
283 | #ifdef GLXEXT
|
---|
284 | extern Bool dmxGLXProxy; /**< True if glxProxy
|
---|
285 |
|
---|
286 | * support is enabled */
|
---|
287 | extern Bool dmxGLXSwapGroupSupport; /**< True if glxProxy
|
---|
288 |
|
---|
289 | * support for swap
|
---|
290 | * groups and barriers
|
---|
291 | * is enabled */
|
---|
292 | extern Bool dmxGLXSyncSwap; /**< True if glxProxy
|
---|
293 |
|
---|
294 | * should force an XSync
|
---|
295 | * request after each
|
---|
296 | * swap buffers call */
|
---|
297 | extern Bool dmxGLXFinishSwap; /**< True if glxProxy
|
---|
298 |
|
---|
299 | * should force a
|
---|
300 | * glFinish request
|
---|
301 | * after each swap
|
---|
302 | * buffers call */
|
---|
303 | #endif
|
---|
304 | extern char *dmxFontPath; /**< NULL if no font
|
---|
305 |
|
---|
306 | * path is set on the
|
---|
307 | * command line;
|
---|
308 | * otherwise, a string
|
---|
309 | * of comma separated
|
---|
310 | * paths built from the
|
---|
311 | * command line
|
---|
312 | * specified font
|
---|
313 | * paths */
|
---|
314 | extern Bool dmxIgnoreBadFontPaths; /**< True if bad font
|
---|
315 |
|
---|
316 | * paths should be
|
---|
317 | * ignored during server
|
---|
318 | * init */
|
---|
319 | extern Bool dmxAddRemoveScreens; /**< True if add and
|
---|
320 |
|
---|
321 | * remove screens support
|
---|
322 | * is enabled */
|
---|
323 |
|
---|
324 | /** Wrap screen or GC function pointer */
|
---|
325 | #define DMX_WRAP(_entry, _newfunc, _saved, _actual) \
|
---|
326 | do { \
|
---|
327 | (_saved)->_entry = (_actual)->_entry; \
|
---|
328 | (_actual)->_entry = (_newfunc); \
|
---|
329 | } while (0)
|
---|
330 |
|
---|
331 | /** Unwrap screen or GC function pointer */
|
---|
332 | #define DMX_UNWRAP(_entry, _saved, _actual) \
|
---|
333 | do { \
|
---|
334 | (_actual)->_entry = (_saved)->_entry; \
|
---|
335 | } while (0)
|
---|
336 |
|
---|
337 | /* Define the MAXSCREENSALLOC/FREE macros, when MAXSCREENS patch has not
|
---|
338 | * been applied to sources. */
|
---|
339 | #ifdef MAXSCREENS
|
---|
340 | #define MAXSCREEN_MAKECONSTSTR1(x) #x
|
---|
341 | #define MAXSCREEN_MAKECONSTSTR2(x) MAXSCREEN_MAKECONSTSTR1(x)
|
---|
342 |
|
---|
343 | #define MAXSCREEN_FAILED_TXT "Failed at [" \
|
---|
344 | MAXSCREEN_MAKECONSTSTR2(__LINE__) ":" __FILE__ "] to allocate object: "
|
---|
345 |
|
---|
346 | #define _MAXSCREENSALLOCF(o,size,fatal) \
|
---|
347 | do { \
|
---|
348 | if (!o) { \
|
---|
349 | o = calloc((size), sizeof(*(o))); \
|
---|
350 | if (!o && fatal) FatalError(MAXSCREEN_FAILED_TXT #o); \
|
---|
351 | } \
|
---|
352 | } while (0)
|
---|
353 | #define _MAXSCREENSALLOCR(o,size,retval) \
|
---|
354 | do { \
|
---|
355 | if (!o) { \
|
---|
356 | o = calloc((size), sizeof(*(o))); \
|
---|
357 | if (!o) return retval; \
|
---|
358 | } \
|
---|
359 | } while (0)
|
---|
360 |
|
---|
361 | #define MAXSCREENSFREE(o) \
|
---|
362 | do { \
|
---|
363 | free(o); \
|
---|
364 | o = NULL; \
|
---|
365 | } while (0)
|
---|
366 |
|
---|
367 | #define MAXSCREENSALLOC(o) _MAXSCREENSALLOCF(o,MAXSCREENS, 0)
|
---|
368 | #define MAXSCREENSALLOC_FATAL(o) _MAXSCREENSALLOCF(o,MAXSCREENS, 1)
|
---|
369 | #define MAXSCREENSALLOC_RETURN(o,r) _MAXSCREENSALLOCR(o,MAXSCREENS, (r))
|
---|
370 | #define MAXSCREENSALLOCPLUSONE(o) _MAXSCREENSALLOCF(o,MAXSCREENS+1,0)
|
---|
371 | #define MAXSCREENSALLOCPLUSONE_FATAL(o) _MAXSCREENSALLOCF(o,MAXSCREENS+1,1)
|
---|
372 | #define MAXSCREENSCALLOC(o,m) _MAXSCREENSALLOCF(o,MAXSCREENS*(m),0)
|
---|
373 | #define MAXSCREENSCALLOC_FATAL(o,m) _MAXSCREENSALLOCF(o,MAXSCREENS*(m),1)
|
---|
374 | #endif
|
---|
375 |
|
---|
376 | extern DevPrivateKeyRec dmxGCPrivateKeyRec;
|
---|
377 |
|
---|
378 | #define dmxGCPrivateKey (&dmxGCPrivateKeyRec) /**< Private index for GCs */
|
---|
379 |
|
---|
380 | extern DevPrivateKeyRec dmxWinPrivateKeyRec;
|
---|
381 |
|
---|
382 | #define dmxWinPrivateKey (&dmxWinPrivateKeyRec) /**< Private index for Windows */
|
---|
383 |
|
---|
384 | extern DevPrivateKeyRec dmxPixPrivateKeyRec;
|
---|
385 |
|
---|
386 | #define dmxPixPrivateKey (&dmxPixPrivateKeyRec) /**< Private index for Pixmaps */
|
---|
387 |
|
---|
388 | extern int dmxFontPrivateIndex; /**< Private index for Fonts */
|
---|
389 |
|
---|
390 | extern DevPrivateKeyRec dmxScreenPrivateKeyRec;
|
---|
391 |
|
---|
392 | #define dmxScreenPrivateKey (&dmxScreenPrivateKeyRec) /**< Private index for Screens */
|
---|
393 |
|
---|
394 | extern DevPrivateKeyRec dmxColormapPrivateKeyRec;
|
---|
395 |
|
---|
396 | #define dmxColormapPrivateKey (&dmxColormapPrivateKeyRec) /**< Private index for Colormaps */
|
---|
397 |
|
---|
398 | extern DevPrivateKeyRec dmxPictPrivateKeyRec;
|
---|
399 |
|
---|
400 | #define dmxPictPrivateKey (&dmxPictPrivateKeyRec) /**< Private index for Picts */
|
---|
401 |
|
---|
402 | extern DevPrivateKeyRec dmxGlyphSetPrivateKeyRec;
|
---|
403 |
|
---|
404 | #define dmxGlyphSetPrivateKey (&dmxGlyphSetPrivateKeyRec) /**< Private index for GlyphSets */
|
---|
405 |
|
---|
406 | void DMXExtensionInit(void);
|
---|
407 |
|
---|
408 | #endif /* DMX_H */
|
---|