2
* Copyright © 2005 Novell, Inc.
4
* Permission to use, copy, modify, distribute, and sell this software
5
* and its documentation for any purpose is hereby granted without
6
* fee, provided that the above copyright notice appear in all copies
7
* and that both that copyright notice and this permission notice
8
* appear in supporting documentation, and that the name of
9
* Novell, Inc. not be used in advertising or publicity pertaining to
10
* distribution of the software without specific, written prior permission.
11
* Novell, Inc. makes no representations about the suitability of this
12
* software for any purpose. It is provided "as is" without express or
15
* NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
17
* NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
19
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
* Author: David Reveman <davidr@novell.com>
29
#include "mipointer.h"
36
#define DEFAULT_DDX_MODULE_NAME "xglx"
38
static char *ddxModuleName = DEFAULT_DDX_MODULE_NAME;
40
xglScreenInfoRec xglScreenInfo = {
42
DEFAULT_GEOMETRY_DATA_TYPE,
43
DEFAULT_GEOMETRY_USAGE,
48
{ FALSE, FALSE, { 0, 0, 0, 0 } },
49
{ FALSE, FALSE, { 0, 0, 0, 0 } },
50
{ FALSE, FALSE, { 0, 0, 0, 0 } },
51
{ FALSE, FALSE, { 0, 0, 0, 0 } }
56
static Bool loadGlx = TRUE;
59
static char *glxExtLogFile = 0;
64
typedef struct _xglDDXFunc {
65
void (*initOutput) (ScreenInfo *pScreenInfo,
68
void (*initInput) (int argc,
70
Bool (*legalModifier) (unsigned int key,
72
void (*processInputEvents) (void);
73
void (*useMsg) (void);
74
int (*processArgument) (int argc,
78
void (*giveUp) (void);
79
void (*osVendorInit) (void);
82
static xglDDXFuncRec __ddxFunc;
84
#define SYMFUNC(name) ((void *) (name))
85
#define SYMVAR(name) ((void *) &(name))
88
* The following table is used to make sure that all symbols required by
89
* dynamically loaded modules are present in the main program. Add more symbols
95
SYMFUNC (xglSetPixmapFormats),
98
SYMFUNC (mieqEnqueue),
100
SYMFUNC (mieqProcessInputEvents),
101
SYMFUNC (miPointerAbsoluteCursor),
102
SYMFUNC (miRegisterPointerDevice),
103
SYMFUNC (miPointerWarpCursor),
104
SYMFUNC (miDCInitialize),
105
SYMFUNC (miPointerAbsoluteCursor),
106
SYMFUNC (miPointerUpdate),
107
SYMFUNC (miRegisterRedirectBorderClipProc)
110
#define SYM(ptr, name) { (void **) &(ptr), (name) }
113
xglEnsureDDXModule (void)
117
static void *ddxHandle = 0;
118
static Bool status = TRUE;
124
/* GLX and GLcore modules must be loaded with RTLD_NOW and RTLD_LOCAL
125
flags before DDX module which is linked to libGL and should be
126
loaded with RTLD_GLOBAL. */
129
if (!xglLoadGLXModules ())
130
FatalError ("No GLX modules loaded");
135
__xglGLXLogFp = fopen (glxExtLogFile, "w");
137
perror ("InitOutput");
148
xglSymbolRec sym[] = {
149
SYM (__ddxFunc.initOutput, "InitOutput"),
150
SYM (__ddxFunc.initInput, "InitInput"),
151
SYM (__ddxFunc.legalModifier, "LegalModifier"),
152
SYM (__ddxFunc.processInputEvents, "ProcessInputEvents"),
153
SYM (__ddxFunc.useMsg, "ddxUseMsg"),
154
SYM (__ddxFunc.processArgument, "ddxProcessArgument"),
155
SYM (__ddxFunc.abort, "AbortDDX"),
156
SYM (__ddxFunc.giveUp, "ddxGiveUp"),
157
SYM (__ddxFunc.osVendorInit, "OsVendorInit")
160
ddxHandle = xglLoadModule (ddxModuleName, RTLD_NOW | RTLD_GLOBAL);
162
return (status = FALSE);
164
if (!xglLookupSymbols (ddxHandle, sym, sizeof (sym) / sizeof (sym[0])))
166
xglUnloadModule (ddxHandle);
169
return (status = FALSE);
181
InitOutput (ScreenInfo *pScreenInfo,
187
if (!xglEnsureDDXModule ())
188
FatalError ("No DDX module loaded");
190
(*__ddxFunc.initOutput) (pScreenInfo, argc, argv);
194
LegalModifier (unsigned int key,
197
return (*__ddxFunc.legalModifier) (key, pDev);
201
ProcessInputEvents (void)
203
(*__ddxFunc.processInputEvents) ();
210
if (!xglEnsureDDXModule ())
211
FatalError ("No DDX module loaded");
213
(*__ddxFunc.initInput) (argc, argv);
219
ErrorF ("\nXgl usage:\n");
220
ErrorF ("-ddx module specify ddx module\n");
223
ErrorF ("-noglx don't load glx extension\n");
226
ErrorF ("-glxlog file glx extension log file\n");
233
if (xglEnsureDDXModule ())
234
(*__ddxFunc.useMsg) ();
238
ddxProcessArgument (int argc,
242
static Bool checkDDX = FALSE;
249
for (j = i; j < argc; j++)
251
if (!strcmp (argv[j], "-ddx"))
254
ddxModuleName = argv[j];
258
else if (!strcmp (argv[j], "-noglx"))
264
else if (!strcmp (argv[j], "-glxlog"))
267
glxExtLogFile = argv[j];
277
if (!strcmp (argv[i], "-ddx"))
286
else if (!strcmp (argv[i], "-noglx"))
292
else if (!strcmp (argv[i], "-glxlog"))
303
skip = xglProcessArgument (argc, argv, i);
307
if (xglEnsureDDXModule ())
308
return (*__ddxFunc.processArgument) (argc, argv, i);
316
if (xglEnsureDDXModule ())
317
(*__ddxFunc.abort) ();
323
if (xglEnsureDDXModule ())
324
(*__ddxFunc.giveUp) ();
330
if (xglEnsureDDXModule ())
331
(*__ddxFunc.osVendorInit) ();
334
void ddxInitGlobals()