miinitext.c revision 7e31ba66
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#include "misc.h" 10105b261ecSmrg#include "extension.h" 102f7df2e56Smrg#include "extinit.h" 1034642e01fSmrg#ifdef INXQUARTZ 104f7df2e56Smrg#include "nonsdk_extinit.h" 10505b261ecSmrg#endif 106f7df2e56Smrg#include "micmap.h" 1077e31ba66Smrg#include "os.h" 108f7df2e56Smrg#include "globals.h" 10905b261ecSmrg 1107e31ba66Smrg/* List of built-in (statically linked) extensions */ 1117e31ba66Smrgstatic const ExtensionModule staticExtensions[] = { 1127e31ba66Smrg {GEExtensionInit, "Generic Event Extension", &noGEExtension}, 1137e31ba66Smrg {ShapeExtensionInit, "SHAPE", NULL}, 1147e31ba66Smrg#ifdef MITSHM 1157e31ba66Smrg {ShmExtensionInit, "MIT-SHM", &noMITShmExtension}, 11605b261ecSmrg#endif 1177e31ba66Smrg {XInputExtensionInit, "XInputExtension", NULL}, 1187e31ba66Smrg#ifdef XTEST 1197e31ba66Smrg {XTestExtensionInit, "XTEST", &noTestExtensions}, 12005b261ecSmrg#endif 1217e31ba66Smrg {BigReqExtensionInit, "BIG-REQUESTS", NULL}, 1227e31ba66Smrg {SyncExtensionInit, "SYNC", NULL}, 1237e31ba66Smrg {XkbExtensionInit, "XKEYBOARD", NULL}, 1247e31ba66Smrg {XCMiscExtensionInit, "XC-MISC", NULL}, 1257e31ba66Smrg#ifdef XCSECURITY 1267e31ba66Smrg {SecurityExtensionInit, "SECURITY", &noSecurityExtension}, 12705b261ecSmrg#endif 1287e31ba66Smrg#ifdef PANORAMIX 1297e31ba66Smrg {PanoramiXExtensionInit, "XINERAMA", &noPanoramiXExtension}, 13005b261ecSmrg#endif 1317e31ba66Smrg#ifdef INXQUARTZ 1327e31ba66Smrg /* PseudoramiXExtensionInit must be done before RRExtensionInit, or 1337e31ba66Smrg * XQuartz will render windows offscreen. 1347e31ba66Smrg */ 1357e31ba66Smrg {PseudoramiXExtensionInit, "PseudoramiX", &noPseudoramiXExtension}, 13605b261ecSmrg#endif 1377e31ba66Smrg /* must be before Render to layer DisplayCursor correctly */ 1387e31ba66Smrg {XFixesExtensionInit, "XFIXES", &noXFixesExtension}, 1397e31ba66Smrg#ifdef XF86BIGFONT 1407e31ba66Smrg {XFree86BigfontExtensionInit, "XFree86-Bigfont", &noXFree86BigfontExtension}, 14105b261ecSmrg#endif 1427e31ba66Smrg {RenderExtensionInit, "RENDER", &noRenderExtension}, 14305b261ecSmrg#ifdef RANDR 1447e31ba66Smrg {RRExtensionInit, "RANDR", &noRRExtension}, 14505b261ecSmrg#endif 1467e31ba66Smrg#ifdef COMPOSITE 1477e31ba66Smrg {CompositeExtensionInit, "COMPOSITE", &noCompositeExtension}, 14805b261ecSmrg#endif 1497e31ba66Smrg#ifdef DAMAGE 1507e31ba66Smrg {DamageExtensionInit, "DAMAGE", &noDamageExtension}, 15105b261ecSmrg#endif 1527e31ba66Smrg#ifdef SCREENSAVER 1537e31ba66Smrg {ScreenSaverExtensionInit, "MIT-SCREEN-SAVER", &noScreenSaverExtension}, 15405b261ecSmrg#endif 1557e31ba66Smrg#ifdef DBE 1567e31ba66Smrg {DbeExtensionInit, "DOUBLE-BUFFER", &noDbeExtension}, 15705b261ecSmrg#endif 1587e31ba66Smrg#ifdef XRECORD 1597e31ba66Smrg {RecordExtensionInit, "RECORD", &noTestExtensions}, 16005b261ecSmrg#endif 1617e31ba66Smrg#ifdef DPMSExtension 1627e31ba66Smrg {DPMSExtensionInit, "DPMS", &noDPMSExtension}, 16305b261ecSmrg#endif 1647e31ba66Smrg#ifdef PRESENT 1657e31ba66Smrg {present_extension_init, "Present", NULL}, 16605b261ecSmrg#endif 1677e31ba66Smrg#ifdef DRI3 1687e31ba66Smrg {dri3_extension_init, "DRI3", NULL}, 16905b261ecSmrg#endif 1707e31ba66Smrg#ifdef RES 1717e31ba66Smrg {ResExtensionInit, "X-Resource", &noResExtension}, 17205b261ecSmrg#endif 17305b261ecSmrg#ifdef XV 1747e31ba66Smrg {XvExtensionInit, "XVideo", &noXvExtension}, 1757e31ba66Smrg {XvMCExtensionInit, "XVideo-MotionCompensation", &noXvExtension}, 1767e31ba66Smrg#endif 1777e31ba66Smrg#ifdef XSELINUX 1787e31ba66Smrg {SELinuxExtensionInit, "SELinux", &noSELinuxExtension}, 1797e31ba66Smrg#endif 1807e31ba66Smrg#ifdef GLXEXT 1817e31ba66Smrg {GlxExtensionInit, "GLX", &noGlxExtension}, 18205b261ecSmrg#endif 18305b261ecSmrg}; 18405b261ecSmrg 185f7df2e56SmrgBool 186f7df2e56SmrgEnableDisableExtension(const char *name, Bool enable) 18705b261ecSmrg{ 1887e31ba66Smrg const ExtensionModule *ext; 189f7df2e56Smrg int i; 190f7df2e56Smrg 1917e31ba66Smrg for (i = 0; i < ARRAY_SIZE(staticExtensions); i++) { 1927e31ba66Smrg ext = &staticExtensions[i]; 193f7df2e56Smrg if (strcmp(name, ext->name) == 0) { 194f7df2e56Smrg if (ext->disablePtr != NULL) { 195f7df2e56Smrg *ext->disablePtr = !enable; 196f7df2e56Smrg return TRUE; 197f7df2e56Smrg } 198f7df2e56Smrg else { 199f7df2e56Smrg /* Extension is always on, impossible to disable */ 200f7df2e56Smrg return enable; /* okay if they wanted to enable, 201f7df2e56Smrg fail if they tried to disable */ 202f7df2e56Smrg } 203f7df2e56Smrg } 20405b261ecSmrg } 20505b261ecSmrg 20605b261ecSmrg return FALSE; 20705b261ecSmrg} 20805b261ecSmrg 209f7df2e56Smrgvoid 210f7df2e56SmrgEnableDisableExtensionError(const char *name, Bool enable) 21105b261ecSmrg{ 2127e31ba66Smrg const ExtensionModule *ext; 213f7df2e56Smrg int i; 2144202a189Smrg Bool found = FALSE; 21505b261ecSmrg 2167e31ba66Smrg for (i = 0; i < ARRAY_SIZE(staticExtensions); i++) { 2177e31ba66Smrg ext = &staticExtensions[i]; 218f7df2e56Smrg if ((strcmp(name, ext->name) == 0) && (ext->disablePtr == NULL)) { 219f7df2e56Smrg ErrorF("[mi] Extension \"%s\" can not be disabled\n", name); 220f7df2e56Smrg found = TRUE; 221f7df2e56Smrg break; 222f7df2e56Smrg } 2234202a189Smrg } 2244202a189Smrg if (found == FALSE) 225f7df2e56Smrg ErrorF("[mi] Extension \"%s\" is not recognized\n", name); 2264642e01fSmrg ErrorF("[mi] Only the following extensions can be run-time %s:\n", 227f7df2e56Smrg enable ? "enabled" : "disabled"); 2287e31ba66Smrg for (i = 0; i < ARRAY_SIZE(staticExtensions); i++) { 2297e31ba66Smrg ext = &staticExtensions[i]; 230f7df2e56Smrg if (ext->disablePtr != NULL) { 231f7df2e56Smrg ErrorF("[mi] %s\n", ext->name); 232f7df2e56Smrg } 2334202a189Smrg } 23405b261ecSmrg} 23505b261ecSmrg 236f7df2e56Smrgstatic ExtensionModule *ExtensionModuleList = NULL; 237f7df2e56Smrgstatic int numExtensionModules = 0; 238f7df2e56Smrg 239f7df2e56Smrgstatic void 240f7df2e56SmrgAddStaticExtensions(void) 241f7df2e56Smrg{ 242f7df2e56Smrg static Bool listInitialised = FALSE; 243f7df2e56Smrg 244f7df2e56Smrg if (listInitialised) 245f7df2e56Smrg return; 246f7df2e56Smrg listInitialised = TRUE; 247f7df2e56Smrg 248f7df2e56Smrg /* Add built-in extensions to the list. */ 249f7df2e56Smrg LoadExtensionList(staticExtensions, ARRAY_SIZE(staticExtensions), TRUE); 250f7df2e56Smrg} 251f7df2e56Smrg 25205b261ecSmrgvoid 2534642e01fSmrgInitExtensions(int argc, char *argv[]) 25405b261ecSmrg{ 25505b261ecSmrg int i; 25605b261ecSmrg ExtensionModule *ext; 25705b261ecSmrg 258f7df2e56Smrg AddStaticExtensions(); 25905b261ecSmrg 260f7df2e56Smrg for (i = 0; i < numExtensionModules; i++) { 261f7df2e56Smrg ext = &ExtensionModuleList[i]; 262f7df2e56Smrg if (ext->initFunc != NULL && 263f7df2e56Smrg (ext->disablePtr == NULL || !*ext->disablePtr)) { 2647e31ba66Smrg LogMessageVerb(X_INFO, 3, "Initializing extension %s\n", 2657e31ba66Smrg ext->name); 2667e31ba66Smrg 267f7df2e56Smrg (ext->initFunc) (); 268f7df2e56Smrg } 26905b261ecSmrg } 270f7df2e56Smrg} 27105b261ecSmrg 272f7df2e56Smrgstatic ExtensionModule * 273f7df2e56SmrgNewExtensionModuleList(int size) 274f7df2e56Smrg{ 275f7df2e56Smrg ExtensionModule *save = ExtensionModuleList; 276f7df2e56Smrg int n; 277f7df2e56Smrg 278f7df2e56Smrg /* Sanity check */ 279f7df2e56Smrg if (!ExtensionModuleList) 280f7df2e56Smrg numExtensionModules = 0; 281f7df2e56Smrg 282f7df2e56Smrg n = numExtensionModules + size; 283f7df2e56Smrg ExtensionModuleList = reallocarray(ExtensionModuleList, n, 284f7df2e56Smrg sizeof(ExtensionModule)); 285f7df2e56Smrg if (ExtensionModuleList == NULL) { 286f7df2e56Smrg ExtensionModuleList = save; 287f7df2e56Smrg return NULL; 288f7df2e56Smrg } 289f7df2e56Smrg else { 290f7df2e56Smrg numExtensionModules += size; 291f7df2e56Smrg return ExtensionModuleList + (numExtensionModules - size); 29205b261ecSmrg } 29305b261ecSmrg} 29405b261ecSmrg 295f7df2e56Smrgvoid 296f7df2e56SmrgLoadExtensionList(const ExtensionModule ext[], int size, Bool builtin) 297f7df2e56Smrg{ 298f7df2e56Smrg ExtensionModule *newext; 299f7df2e56Smrg int i; 300f7df2e56Smrg 301f7df2e56Smrg /* Make sure built-in extensions get added to the list before those 302f7df2e56Smrg * in modules. */ 303f7df2e56Smrg AddStaticExtensions(); 304f7df2e56Smrg 305f7df2e56Smrg if (!(newext = NewExtensionModuleList(size))) 306f7df2e56Smrg return; 307f7df2e56Smrg 308f7df2e56Smrg for (i = 0; i < size; i++, newext++) { 309f7df2e56Smrg newext->name = ext[i].name; 310f7df2e56Smrg newext->initFunc = ext[i].initFunc; 311f7df2e56Smrg newext->disablePtr = ext[i].disablePtr; 312f7df2e56Smrg } 313f7df2e56Smrg} 314