dmx.h revision 706f2543
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
72typedef 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 */
84typedef struct _DMXInputInfo DMXInputInfo;
85
86/** Provide the typedef globally, but keep the contents opaque outside
87 * of the XSync statistic routines.  \see dmxstat.c */
88typedef struct _DMXStatInfo DMXStatInfo;
89
90/** Global structure containing information about each backend screen. */
91typedef 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    TriStripProcPtr                TriStrip;
253    TriFanProcPtr                  TriFan;
254} DMXScreenInfo;
255
256/* Global variables available to all Xserver/hw/dmx routines. */
257extern int              dmxNumScreens;          /**< Number of dmxScreens */
258extern DMXScreenInfo   *dmxScreens;             /**< List of outputs */
259extern int              dmxShadowFB;            /**< Non-zero if using
260                                                 * shadow frame-buffer
261                                                 * (deprecated) */
262extern XErrorEvent      dmxLastErrorEvent;      /**< Last error that
263                                                 * occurred */
264extern Bool             dmxErrorOccurred;       /**< True if an error
265                                                 * occurred */
266extern Bool             dmxOffScreenOpt;        /**< True if using off
267                                                 * screen
268                                                 * optimizations */
269extern Bool             dmxSubdividePrimitives; /**< True if using the
270                                                 * primitive subdivision
271                                                 * optimization */
272extern Bool             dmxLazyWindowCreation;  /**< True if using the
273                                                 * lazy window creation
274                                                 * optimization */
275extern Bool             dmxUseXKB;              /**< True if the XKB
276                                                 * extension should be
277                                                 * used with the backend
278                                                 * servers */
279extern int              dmxDepth;               /**< Requested depth if
280                                                 * non-zero */
281#ifdef GLXEXT
282extern Bool             dmxGLXProxy;            /**< True if glxProxy
283						 * support is enabled */
284extern Bool             dmxGLXSwapGroupSupport; /**< True if glxProxy
285						 * support for swap
286						 * groups and barriers
287						 * is enabled */
288extern Bool             dmxGLXSyncSwap;         /**< True if glxProxy
289						 * should force an XSync
290						 * request after each
291						 * swap buffers call */
292extern Bool             dmxGLXFinishSwap;       /**< True if glxProxy
293						 * should force a
294						 * glFinish request
295						 * after each swap
296						 * buffers call */
297#endif
298extern char            *dmxFontPath;            /**< NULL if no font
299						 * path is set on the
300						 * command line;
301						 * otherwise, a string
302						 * of comma separated
303						 * paths built from the
304						 * command line
305						 * specified font
306						 * paths */
307extern Bool             dmxIgnoreBadFontPaths;  /**< True if bad font
308						 * paths should be
309						 * ignored during server
310						 * init */
311extern Bool             dmxAddRemoveScreens;    /**< True if add and
312						 * remove screens support
313						 * is enabled */
314
315/** Wrap screen or GC function pointer */
316#define DMX_WRAP(_entry, _newfunc, _saved, _actual)			\
317do {									\
318    (_saved)->_entry  = (_actual)->_entry;				\
319    (_actual)->_entry = (_newfunc);					\
320} while (0)
321
322/** Unwrap screen or GC function pointer */
323#define DMX_UNWRAP(_entry, _saved, _actual)				\
324do {									\
325    (_actual)->_entry = (_saved)->_entry;				\
326} while (0)
327
328/* Define the MAXSCREENSALLOC/FREE macros, when MAXSCREENS patch has not
329 * been applied to sources. */
330#ifdef MAXSCREENS
331#define MAXSCREEN_MAKECONSTSTR1(x) #x
332#define MAXSCREEN_MAKECONSTSTR2(x) MAXSCREEN_MAKECONSTSTR1(x)
333
334#define MAXSCREEN_FAILED_TXT "Failed at ["                              \
335   MAXSCREEN_MAKECONSTSTR2(__LINE__) ":" __FILE__ "] to allocate object: "
336
337#define _MAXSCREENSALLOCF(o,size,fatal)                                 \
338    do {                                                                \
339        if (!o) {                                                       \
340            o = calloc((size), sizeof(*(o)));                          \
341            if (!o && fatal) FatalError(MAXSCREEN_FAILED_TXT #o);       \
342        }                                                               \
343    } while (0)
344#define _MAXSCREENSALLOCR(o,size,retval)                                \
345    do {                                                                \
346        if (!o) {                                                       \
347            o = calloc((size), sizeof(*(o)));                          \
348            if (!o) return retval;                                      \
349        }                                                               \
350    } while (0)
351
352#define MAXSCREENSFREE(o)                                               \
353    do {                                                                \
354        free(o);                                                \
355        o = NULL;                                                       \
356    } while (0)
357
358#define MAXSCREENSALLOC(o)              _MAXSCREENSALLOCF(o,MAXSCREENS,  0)
359#define MAXSCREENSALLOC_FATAL(o)        _MAXSCREENSALLOCF(o,MAXSCREENS,  1)
360#define MAXSCREENSALLOC_RETURN(o,r)     _MAXSCREENSALLOCR(o,MAXSCREENS, (r))
361#define MAXSCREENSALLOCPLUSONE(o)       _MAXSCREENSALLOCF(o,MAXSCREENS+1,0)
362#define MAXSCREENSALLOCPLUSONE_FATAL(o) _MAXSCREENSALLOCF(o,MAXSCREENS+1,1)
363#define MAXSCREENSCALLOC(o,m)           _MAXSCREENSALLOCF(o,MAXSCREENS*(m),0)
364#define MAXSCREENSCALLOC_FATAL(o,m)     _MAXSCREENSALLOCF(o,MAXSCREENS*(m),1)
365#endif
366
367extern DevPrivateKeyRec dmxGCPrivateKeyRec;
368#define dmxGCPrivateKey (&dmxGCPrivateKeyRec) /**< Private index for GCs       */
369
370extern DevPrivateKeyRec dmxWinPrivateKeyRec;
371#define dmxWinPrivateKey (&dmxWinPrivateKeyRec) /**< Private index for Windows   */
372
373extern DevPrivateKeyRec dmxPixPrivateKeyRec;
374#define dmxPixPrivateKey (&dmxPixPrivateKeyRec) /**< Private index for Pixmaps   */
375
376extern int dmxFontPrivateIndex;        /**< Private index for Fonts     */
377
378extern DevPrivateKeyRec dmxScreenPrivateKeyRec;
379#define dmxScreenPrivateKey (&dmxScreenPrivateKeyRec) /**< Private index for Screens   */
380
381extern DevPrivateKeyRec dmxColormapPrivateKeyRec;
382#define dmxColormapPrivateKey (&dmxColormapPrivateKeyRec) /**< Private index for Colormaps */
383
384extern DevPrivateKeyRec dmxPictPrivateKeyRec;
385#define dmxPictPrivateKey (&dmxPictPrivateKeyRec) /**< Private index for Picts     */
386
387extern DevPrivateKeyRec dmxGlyphSetPrivateKeyRec;
388#define dmxGlyphSetPrivateKey (&dmxGlyphSetPrivateKeyRec) /**< Private index for GlyphSets */
389
390#endif /* DMX_H */
391