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