miinitext.c revision f7df2e56
105b261ecSmrg/***********************************************************
205b261ecSmrg
305b261ecSmrgCopyright 1987, 1998  The Open Group
405b261ecSmrg
505b261ecSmrgPermission to use, copy, modify, distribute, and sell this software and its
605b261ecSmrgdocumentation for any purpose is hereby granted without fee, provided that
705b261ecSmrgthe above copyright notice appear in all copies and that both that
805b261ecSmrgcopyright notice and this permission notice appear in supporting
905b261ecSmrgdocumentation.
1005b261ecSmrg
1105b261ecSmrgThe above copyright notice and this permission notice shall be included in
1205b261ecSmrgall copies or substantial portions of the Software.
1305b261ecSmrg
1405b261ecSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1505b261ecSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1605b261ecSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1705b261ecSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
1805b261ecSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1905b261ecSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2005b261ecSmrg
2105b261ecSmrgExcept as contained in this notice, the name of The Open Group shall not be
2205b261ecSmrgused in advertising or otherwise to promote the sale, use or other dealings
2305b261ecSmrgin this Software without prior written authorization from The Open Group.
2405b261ecSmrg
2505b261ecSmrgCopyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
2605b261ecSmrg
2705b261ecSmrg                        All Rights Reserved
2805b261ecSmrg
29f7df2e56SmrgPermission to use, copy, modify, and distribute this software and its
30f7df2e56Smrgdocumentation for any purpose and without fee is hereby granted,
3105b261ecSmrgprovided that the above copyright notice appear in all copies and that
32f7df2e56Smrgboth that copyright notice and this permission notice appear in
3305b261ecSmrgsupporting documentation, and that the name of Digital not be
3405b261ecSmrgused in advertising or publicity pertaining to distribution of the
35f7df2e56Smrgsoftware without specific, written prior permission.
3605b261ecSmrg
3705b261ecSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
3805b261ecSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
3905b261ecSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
4005b261ecSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
4105b261ecSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
4205b261ecSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
4305b261ecSmrgSOFTWARE.
4405b261ecSmrg
4505b261ecSmrg******************************************************************/
4605b261ecSmrg
47f7df2e56Smrg/*
48f7df2e56Smrg * Copyright (c) 2000 by The XFree86 Project, Inc.
49f7df2e56Smrg *
50f7df2e56Smrg * Permission is hereby granted, free of charge, to any person obtaining a
51f7df2e56Smrg * copy of this software and associated documentation files (the "Software"),
52f7df2e56Smrg * to deal in the Software without restriction, including without limitation
53f7df2e56Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
54f7df2e56Smrg * and/or sell copies of the Software, and to permit persons to whom the
55f7df2e56Smrg * Software is furnished to do so, subject to the following conditions:
56f7df2e56Smrg *
57f7df2e56Smrg * The above copyright notice and this permission notice shall be included in
58f7df2e56Smrg * all copies or substantial portions of the Software.
59f7df2e56Smrg *
60f7df2e56Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61f7df2e56Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62f7df2e56Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
63f7df2e56Smrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
64f7df2e56Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
65f7df2e56Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
66f7df2e56Smrg * OTHER DEALINGS IN THE SOFTWARE.
67f7df2e56Smrg *
68f7df2e56Smrg * Except as contained in this notice, the name of the copyright holder(s)
69f7df2e56Smrg * and author(s) shall not be used in advertising or otherwise to promote
70f7df2e56Smrg * the sale, use or other dealings in this Software without prior written
71f7df2e56Smrg * authorization from the copyright holder(s) and author(s).
72f7df2e56Smrg */
73f7df2e56Smrg
7405b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
7505b261ecSmrg#include <dix-config.h>
7605b261ecSmrg#endif
7705b261ecSmrg
7805b261ecSmrg#ifdef HAVE_XORG_CONFIG_H
7905b261ecSmrg#include <xorg-config.h>
80f7df2e56Smrg#include "xf86Extensions.h"
8105b261ecSmrg#endif
8205b261ecSmrg
8305b261ecSmrg#ifdef HAVE_DMX_CONFIG_H
8405b261ecSmrg#include <dmx-config.h>
854202a189Smrg#undef XV
864202a189Smrg#undef DBE
874202a189Smrg#undef SCREENSAVER
884202a189Smrg#undef RANDR
894202a189Smrg#undef DAMAGE
904202a189Smrg#undef COMPOSITE
914202a189Smrg#undef MITSHM
9205b261ecSmrg#endif
9305b261ecSmrg
9405b261ecSmrg#ifdef HAVE_XNEST_CONFIG_H
9505b261ecSmrg#include <xnest-config.h>
964642e01fSmrg#undef COMPOSITE
9705b261ecSmrg#undef DPMSExtension
9805b261ecSmrg#endif
9905b261ecSmrg
10005b261ecSmrg#ifdef HAVE_KDRIVE_CONFIG_H
10105b261ecSmrg#include <kdrive-config.h>
10205b261ecSmrg#endif
10305b261ecSmrg
10405b261ecSmrg#ifdef HAVE_XGL_CONFIG_H
10505b261ecSmrg#include <xgl-config.h>
10605b261ecSmrg#endif
10705b261ecSmrg
10805b261ecSmrg#include "misc.h"
10905b261ecSmrg#include "extension.h"
110f7df2e56Smrg#include "extinit.h"
1114642e01fSmrg#ifdef INXQUARTZ
112f7df2e56Smrg#include "nonsdk_extinit.h"
11305b261ecSmrg#endif
114f7df2e56Smrg#include "micmap.h"
115f7df2e56Smrg#include "globals.h"
11605b261ecSmrg
11705b261ecSmrg/* The following is only a small first step towards run-time
11805b261ecSmrg * configurable extensions.
11905b261ecSmrg */
12005b261ecSmrgtypedef struct {
121f7df2e56Smrg    const char *name;
12205b261ecSmrg    Bool *disablePtr;
12305b261ecSmrg} ExtensionToggle;
12405b261ecSmrg
125f7df2e56Smrgstatic ExtensionToggle ExtensionToggleList[] = {
12605b261ecSmrg    /* sort order is extension name string as shown in xdpyinfo */
127f7df2e56Smrg    {"Generic Events", &noGEExtension},
12805b261ecSmrg#ifdef COMPOSITE
129f7df2e56Smrg    {"Composite", &noCompositeExtension},
13005b261ecSmrg#endif
13105b261ecSmrg#ifdef DAMAGE
132f7df2e56Smrg    {"DAMAGE", &noDamageExtension},
13305b261ecSmrg#endif
13405b261ecSmrg#ifdef DBE
135f7df2e56Smrg    {"DOUBLE-BUFFER", &noDbeExtension},
13605b261ecSmrg#endif
13705b261ecSmrg#ifdef DPMSExtension
138f7df2e56Smrg    {"DPMS", &noDPMSExtension},
13905b261ecSmrg#endif
14005b261ecSmrg#ifdef GLXEXT
141f7df2e56Smrg    {"GLX", &noGlxExtension},
14205b261ecSmrg#endif
14305b261ecSmrg#ifdef SCREENSAVER
144f7df2e56Smrg    {"MIT-SCREEN-SAVER", &noScreenSaverExtension},
14505b261ecSmrg#endif
14605b261ecSmrg#ifdef MITSHM
147f7df2e56Smrg    {SHMNAME, &noMITShmExtension},
14805b261ecSmrg#endif
14905b261ecSmrg#ifdef RANDR
150f7df2e56Smrg    {"RANDR", &noRRExtension},
15105b261ecSmrg#endif
152f7df2e56Smrg    {"RENDER", &noRenderExtension},
15305b261ecSmrg#ifdef XCSECURITY
154f7df2e56Smrg    {"SECURITY", &noSecurityExtension},
15505b261ecSmrg#endif
15605b261ecSmrg#ifdef RES
157f7df2e56Smrg    {"X-Resource", &noResExtension},
15805b261ecSmrg#endif
15905b261ecSmrg#ifdef XF86BIGFONT
160f7df2e56Smrg    {"XFree86-Bigfont", &noXFree86BigfontExtension},
16105b261ecSmrg#endif
162f7df2e56Smrg#ifdef XORGSERVER
16305b261ecSmrg#ifdef XFreeXDGA
164f7df2e56Smrg    {"XFree86-DGA", &noXFree86DGAExtension},
16505b261ecSmrg#endif
16605b261ecSmrg#ifdef XF86DRI
167f7df2e56Smrg    {"XFree86-DRI", &noXFree86DRIExtension},
16805b261ecSmrg#endif
16905b261ecSmrg#ifdef XF86VIDMODE
170f7df2e56Smrg    {"XFree86-VidModeExtension", &noXFree86VidModeExtension},
17105b261ecSmrg#endif
17205b261ecSmrg#endif
173f7df2e56Smrg    {"XFIXES", &noXFixesExtension},
17405b261ecSmrg#ifdef PANORAMIX
175f7df2e56Smrg    {"XINERAMA", &noPanoramiXExtension},
17605b261ecSmrg#endif
177f7df2e56Smrg    {"XInputExtension", NULL},
178f7df2e56Smrg    {"XKEYBOARD", NULL},
1794642e01fSmrg#ifdef XSELINUX
180f7df2e56Smrg    {"SELinux", &noSELinuxExtension},
18105b261ecSmrg#endif
182f7df2e56Smrg    {"XTEST", &noTestExtensions},
18305b261ecSmrg#ifdef XV
184f7df2e56Smrg    {"XVideo", &noXvExtension},
18505b261ecSmrg#endif
18605b261ecSmrg};
18705b261ecSmrg
188f7df2e56SmrgBool
189f7df2e56SmrgEnableDisableExtension(const char *name, Bool enable)
19005b261ecSmrg{
191f7df2e56Smrg    ExtensionToggle *ext;
192f7df2e56Smrg    int i;
193f7df2e56Smrg
194f7df2e56Smrg    for (i = 0; i < ARRAY_SIZE(ExtensionToggleList); i++) {
195f7df2e56Smrg        ext = &ExtensionToggleList[i];
196f7df2e56Smrg        if (strcmp(name, ext->name) == 0) {
197f7df2e56Smrg            if (ext->disablePtr != NULL) {
198f7df2e56Smrg                *ext->disablePtr = !enable;
199f7df2e56Smrg                return TRUE;
200f7df2e56Smrg            }
201f7df2e56Smrg            else {
202f7df2e56Smrg                /* Extension is always on, impossible to disable */
203f7df2e56Smrg                return enable;  /* okay if they wanted to enable,
204f7df2e56Smrg                                   fail if they tried to disable */
205f7df2e56Smrg            }
206f7df2e56Smrg        }
20705b261ecSmrg    }
20805b261ecSmrg
20905b261ecSmrg    return FALSE;
21005b261ecSmrg}
21105b261ecSmrg
212f7df2e56Smrgvoid
213f7df2e56SmrgEnableDisableExtensionError(const char *name, Bool enable)
21405b261ecSmrg{
215f7df2e56Smrg    ExtensionToggle *ext;
216f7df2e56Smrg    int i;
2174202a189Smrg    Bool found = FALSE;
21805b261ecSmrg
219f7df2e56Smrg    for (i = 0; i < ARRAY_SIZE(ExtensionToggleList); i++) {
220f7df2e56Smrg        ext = &ExtensionToggleList[i];
221f7df2e56Smrg        if ((strcmp(name, ext->name) == 0) && (ext->disablePtr == NULL)) {
222f7df2e56Smrg            ErrorF("[mi] Extension \"%s\" can not be disabled\n", name);
223f7df2e56Smrg            found = TRUE;
224f7df2e56Smrg            break;
225f7df2e56Smrg        }
2264202a189Smrg    }
2274202a189Smrg    if (found == FALSE)
228f7df2e56Smrg        ErrorF("[mi] Extension \"%s\" is not recognized\n", name);
2294642e01fSmrg    ErrorF("[mi] Only the following extensions can be run-time %s:\n",
230f7df2e56Smrg           enable ? "enabled" : "disabled");
231f7df2e56Smrg    for (i = 0; i < ARRAY_SIZE(ExtensionToggleList); i++) {
232f7df2e56Smrg        ext = &ExtensionToggleList[i];
233f7df2e56Smrg        if (ext->disablePtr != NULL) {
234f7df2e56Smrg            ErrorF("[mi]    %s\n", ext->name);
235f7df2e56Smrg        }
2364202a189Smrg    }
23705b261ecSmrg}
23805b261ecSmrg
239f7df2e56Smrg/* List of built-in (statically linked) extensions */
240f7df2e56Smrgstatic const ExtensionModule staticExtensions[] = {
241f7df2e56Smrg    {GEExtensionInit, "Generic Event Extension", &noGEExtension},
242f7df2e56Smrg    {ShapeExtensionInit, "SHAPE", NULL},
24305b261ecSmrg#ifdef MITSHM
244f7df2e56Smrg    {ShmExtensionInit, SHMNAME, &noMITShmExtension},
24505b261ecSmrg#endif
246f7df2e56Smrg    {XInputExtensionInit, "XInputExtension", NULL},
24705b261ecSmrg#ifdef XTEST
248f7df2e56Smrg    {XTestExtensionInit, XTestExtensionName, &noTestExtensions},
24905b261ecSmrg#endif
250f7df2e56Smrg    {BigReqExtensionInit, "BIG-REQUESTS", NULL},
251f7df2e56Smrg    {SyncExtensionInit, "SYNC", NULL},
252f7df2e56Smrg    {XkbExtensionInit, XkbName, NULL},
253f7df2e56Smrg    {XCMiscExtensionInit, "XC-MISC", NULL},
25405b261ecSmrg#ifdef XCSECURITY
255f7df2e56Smrg    {SecurityExtensionInit, SECURITY_EXTENSION_NAME, &noSecurityExtension},
25605b261ecSmrg#endif
257f7df2e56Smrg#ifdef PANORAMIX
258f7df2e56Smrg    {PanoramiXExtensionInit, PANORAMIX_PROTOCOL_NAME, &noPanoramiXExtension},
25905b261ecSmrg#endif
260f7df2e56Smrg#ifdef INXQUARTZ
261f7df2e56Smrg    /* PseudoramiXExtensionInit must be done before RRExtensionInit, or
262f7df2e56Smrg     * XQuartz will render windows offscreen.
263f7df2e56Smrg     */
264f7df2e56Smrg    {PseudoramiXExtensionInit, "PseudoramiX", &noPseudoramiXExtension},
26505b261ecSmrg#endif
26605b261ecSmrg    /* must be before Render to layer DisplayCursor correctly */
267f7df2e56Smrg    {XFixesExtensionInit, "XFIXES", &noXFixesExtension},
268f7df2e56Smrg#ifdef XF86BIGFONT
269f7df2e56Smrg    {XFree86BigfontExtensionInit, XF86BIGFONTNAME, &noXFree86BigfontExtension},
27005b261ecSmrg#endif
271f7df2e56Smrg    {RenderExtensionInit, "RENDER", &noRenderExtension},
27205b261ecSmrg#ifdef RANDR
273f7df2e56Smrg    {RRExtensionInit, "RANDR", &noRRExtension},
27405b261ecSmrg#endif
27505b261ecSmrg#ifdef COMPOSITE
276f7df2e56Smrg    {CompositeExtensionInit, "COMPOSITE", &noCompositeExtension},
27705b261ecSmrg#endif
27805b261ecSmrg#ifdef DAMAGE
279f7df2e56Smrg    {DamageExtensionInit, "DAMAGE", &noDamageExtension},
28005b261ecSmrg#endif
281f7df2e56Smrg#ifdef SCREENSAVER
282f7df2e56Smrg    {ScreenSaverExtensionInit, ScreenSaverName, &noScreenSaverExtension},
28305b261ecSmrg#endif
284f7df2e56Smrg#ifdef DBE
285f7df2e56Smrg    {DbeExtensionInit, "DOUBLE-BUFFER", &noDbeExtension},
28605b261ecSmrg#endif
287f7df2e56Smrg#ifdef XRECORD
288f7df2e56Smrg    {RecordExtensionInit, "RECORD", &noTestExtensions},
28905b261ecSmrg#endif
290f7df2e56Smrg#ifdef DPMSExtension
291f7df2e56Smrg    {DPMSExtensionInit, DPMSExtensionName, &noDPMSExtension},
29205b261ecSmrg#endif
293f7df2e56Smrg#ifdef PRESENT
294f7df2e56Smrg    {present_extension_init, PRESENT_NAME, NULL},
29505b261ecSmrg#endif
296f7df2e56Smrg#ifdef DRI3
297f7df2e56Smrg    {dri3_extension_init, DRI3_NAME, NULL},
29805b261ecSmrg#endif
299f7df2e56Smrg#ifdef RES
300f7df2e56Smrg    {ResExtensionInit, XRES_NAME, &noResExtension},
30105b261ecSmrg#endif
302f7df2e56Smrg#ifdef XV
303f7df2e56Smrg    {XvExtensionInit, XvName, &noXvExtension},
304f7df2e56Smrg    {XvMCExtensionInit, XvMCName, &noXvExtension},
30505b261ecSmrg#endif
306f7df2e56Smrg#ifdef XSELINUX
307f7df2e56Smrg    {SELinuxExtensionInit, SELINUX_EXTENSION_NAME, &noSELinuxExtension},
30805b261ecSmrg#endif
30905b261ecSmrg};
310f7df2e56Smrg
311f7df2e56Smrgstatic ExtensionModule *ExtensionModuleList = NULL;
312f7df2e56Smrgstatic int numExtensionModules = 0;
313f7df2e56Smrg
314f7df2e56Smrgstatic void
315f7df2e56SmrgAddStaticExtensions(void)
316f7df2e56Smrg{
317f7df2e56Smrg    static Bool listInitialised = FALSE;
318f7df2e56Smrg
319f7df2e56Smrg    if (listInitialised)
320f7df2e56Smrg        return;
321f7df2e56Smrg    listInitialised = TRUE;
322f7df2e56Smrg
323f7df2e56Smrg    /* Add built-in extensions to the list. */
324f7df2e56Smrg    LoadExtensionList(staticExtensions, ARRAY_SIZE(staticExtensions), TRUE);
325f7df2e56Smrg}
326f7df2e56Smrg
32705b261ecSmrgvoid
3284642e01fSmrgInitExtensions(int argc, char *argv[])
32905b261ecSmrg{
33005b261ecSmrg    int i;
33105b261ecSmrg    ExtensionModule *ext;
33205b261ecSmrg
333f7df2e56Smrg    AddStaticExtensions();
33405b261ecSmrg
335f7df2e56Smrg    for (i = 0; i < numExtensionModules; i++) {
336f7df2e56Smrg        ext = &ExtensionModuleList[i];
337f7df2e56Smrg        if (ext->initFunc != NULL &&
338f7df2e56Smrg            (ext->disablePtr == NULL || !*ext->disablePtr)) {
339f7df2e56Smrg            (ext->initFunc) ();
340f7df2e56Smrg        }
34105b261ecSmrg    }
342f7df2e56Smrg}
34305b261ecSmrg
344f7df2e56Smrgstatic ExtensionModule *
345f7df2e56SmrgNewExtensionModuleList(int size)
346f7df2e56Smrg{
347f7df2e56Smrg    ExtensionModule *save = ExtensionModuleList;
348f7df2e56Smrg    int n;
349f7df2e56Smrg
350f7df2e56Smrg    /* Sanity check */
351f7df2e56Smrg    if (!ExtensionModuleList)
352f7df2e56Smrg        numExtensionModules = 0;
353f7df2e56Smrg
354f7df2e56Smrg    n = numExtensionModules + size;
355f7df2e56Smrg    ExtensionModuleList = reallocarray(ExtensionModuleList, n,
356f7df2e56Smrg                                       sizeof(ExtensionModule));
357f7df2e56Smrg    if (ExtensionModuleList == NULL) {
358f7df2e56Smrg        ExtensionModuleList = save;
359f7df2e56Smrg        return NULL;
360f7df2e56Smrg    }
361f7df2e56Smrg    else {
362f7df2e56Smrg        numExtensionModules += size;
363f7df2e56Smrg        return ExtensionModuleList + (numExtensionModules - size);
36405b261ecSmrg    }
36505b261ecSmrg}
36605b261ecSmrg
367f7df2e56Smrgvoid
368f7df2e56SmrgLoadExtensionList(const ExtensionModule ext[], int size, Bool builtin)
369f7df2e56Smrg{
370f7df2e56Smrg    ExtensionModule *newext;
371f7df2e56Smrg    int i;
372f7df2e56Smrg
373f7df2e56Smrg    /* Make sure built-in extensions get added to the list before those
374f7df2e56Smrg     * in modules. */
375f7df2e56Smrg    AddStaticExtensions();
376f7df2e56Smrg
377f7df2e56Smrg    if (!(newext = NewExtensionModuleList(size)))
378f7df2e56Smrg        return;
379f7df2e56Smrg
380f7df2e56Smrg    for (i = 0; i < size; i++, newext++) {
381f7df2e56Smrg        newext->name = ext[i].name;
382f7df2e56Smrg        newext->initFunc = ext[i].initFunc;
383f7df2e56Smrg        newext->disablePtr = ext[i].disablePtr;
384f7df2e56Smrg    }
385f7df2e56Smrg}
386