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 <kem@redhat.com>
31  *   David H. Dawes <dawes@xfree86.org>
32  *   Rickard E. (Rik) Faith <faith@redhat.com>
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 */
409