Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug
This commit is contained in:
		
						commit
						87fe85f38b
					
				|  | @ -1723,7 +1723,6 @@ hw/xfree86/dri/Makefile | |||
| hw/xfree86/dummylib/Makefile | ||||
| hw/xfree86/exa/Makefile | ||||
| hw/xfree86/fbdevhw/Makefile | ||||
| hw/xfree86/getconfig/Makefile | ||||
| hw/xfree86/i2c/Makefile | ||||
| hw/xfree86/int10/Makefile | ||||
| hw/xfree86/loader/Makefile | ||||
|  |  | |||
|  | @ -7,12 +7,12 @@ DOC_SUBDIR = doc | |||
| SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support parser rac \
 | ||||
|           ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp xf8_16bpp \
 | ||||
| 	  xf8_32bpp loader scanpci dixmods exa \
 | ||||
| 	  $(DRI_SUBDIR) utils $(DOC_SUBDIR) getconfig | ||||
| 	  $(DRI_SUBDIR) utils $(DOC_SUBDIR) | ||||
| 
 | ||||
| DIST_SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support \
 | ||||
|                parser rac ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp \
 | ||||
|                xf8_16bpp xf8_32bpp loader scanpci dixmods dri exa \
 | ||||
| 	       utils doc getconfig | ||||
| 	       utils doc | ||||
| 
 | ||||
| bin_PROGRAMS = Xorg | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ BUILT_SOURCES = xf86DefModeSet.c | |||
| 
 | ||||
| AM_LDFLAGS = -r | ||||
| libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \
 | ||||
|                       xf86Cursor.c xf86DGA.c xf86DPMS.c \
 | ||||
|                       xf86Cursor.c xf86cvt.c xf86DGA.c xf86DPMS.c \
 | ||||
|                       xf86DoProbe.c xf86DoScanPci.c xf86Events.c \
 | ||||
|                       xf86Globals.c xf86AutoConfig.c \
 | ||||
|                       xf86MiscExt.c xf86Option.c \
 | ||||
|  |  | |||
|  | @ -1514,88 +1514,7 @@ inl(unsigned short port) | |||
| 
 | ||||
| #   endif /* ix86 */ | ||||
| 
 | ||||
| #  elif defined(__powerpc__) /* && !__GNUC__ */ | ||||
| /*
 | ||||
|  * NON-GCC PowerPC - Presumed to be PowerMAX OS for now | ||||
|  */ | ||||
| #   ifndef PowerMAX_OS | ||||
| #    error - Non-gcc PowerPC and !PowerMAXOS ??? | ||||
| #   endif | ||||
| 
 | ||||
| #   define PPCIO_DEBUG  0 | ||||
| #   define PPCIO_INLINE 1 | ||||
| #   define USE_ABS_MACRO 1 | ||||
| /*
 | ||||
|  * Use compiler intrinsics to access certain PPC machine instructions | ||||
|  */ | ||||
| #   define eieio() 	      __inst_eieio() | ||||
| #   define stw_brx(val,base,ndx) __inst_sthbrx(val,base,ndx) | ||||
| #   define stl_brx(val,base,ndx) __inst_stwbrx(val,base,ndx) | ||||
| #   define ldw_brx(base,ndx)     __inst_lhbrx(base,ndx) | ||||
| #   define ldl_brx(base,ndx)     __inst_lwbrx(base,ndx) | ||||
| 
 | ||||
| #   define ldq_u(p)	(*((unsigned long long  *)(p))) | ||||
| #   define ldl_u(p)	(*((unsigned long   *)(p))) | ||||
| #   define ldw_u(p)	(*((unsigned short *)(p))) | ||||
| #   define stq_u(v,p)	(*(unsigned long long *)(p)) = (v) | ||||
| #   define stl_u(v,p)	(*(unsigned long  *)(p)) = (v) | ||||
| #   define stw_u(v,p)	(*(unsigned short *)(p)) = (v) | ||||
| #   define mem_barrier()         eieio() | ||||
| #   define write_mem_barrier()   eieio() | ||||
| 
 | ||||
| extern volatile unsigned char *ioBase; | ||||
| 
 | ||||
| #   if !defined(abs) && defined(USE_ABS_MACRO) | ||||
| #    define abs(x) ((x) >= 0 ? (x) : -(x)) | ||||
| #   endif | ||||
| 
 | ||||
| #   undef inb | ||||
| #   undef inw | ||||
| #   undef inl | ||||
| #   undef outb | ||||
| #   undef outw | ||||
| #   undef outl | ||||
| 
 | ||||
| #   if PPCIO_DEBUG | ||||
| 
 | ||||
| extern void debug_outb(unsigned int a, unsigned char b, int line, char *file);  | ||||
| extern void debug_outw(unsigned int a, unsigned short w, int line, char *file);  | ||||
| extern void debug_outl(unsigned int a, unsigned int l, int line, char *file);  | ||||
| extern unsigned char debug_inb(unsigned int a, int line, char *file);  | ||||
| extern unsigned short debug_inw(unsigned int a, int line, char *file);  | ||||
| extern unsigned int debug_inl(unsigned int a, int line, char *file);  | ||||
| 
 | ||||
| #    define outb(a,b) debug_outb(a,b, __LINE__, __FILE__) | ||||
| #    define outw(a,w) debug_outw(a,w, __LINE__, __FILE__) | ||||
| #    define outl(a,l) debug_outl(a,l, __LINE__, __FILE__) | ||||
| #    define inb(a)    debug_inb(a, __LINE__, __FILE__) | ||||
| #    define inw(a)    debug_inw(a, __LINE__, __FILE__) | ||||
| #    define inl(a)    debug_inl(a, __LINE__, __FILE__) | ||||
| 
 | ||||
| #   else /* !PPCIO_DEBUG */ | ||||
| 
 | ||||
| extern unsigned char  inb(unsigned int a); | ||||
| extern unsigned short inw(unsigned int a); | ||||
| extern unsigned int   inl(unsigned int a); | ||||
| 
 | ||||
| #    if PPCIO_INLINE | ||||
| 
 | ||||
| #     define outb(a,b) \ | ||||
|             (*((volatile unsigned char *)(ioBase + (a))) = (b), eieio()) | ||||
| #     define outw(a,w) (stw_brx((w),ioBase,(a)), eieio()) | ||||
| #     define outl(a,l) (stl_brx((l),ioBase,(a)), eieio()) | ||||
| 
 | ||||
| #    else /* !PPCIO_INLINE */ | ||||
| 
 | ||||
| extern void outb(unsigned int a, unsigned char b); | ||||
| extern void outw(unsigned int a, unsigned short w); | ||||
| extern void outl(unsigned int a, unsigned int l); | ||||
| 
 | ||||
| #    endif /* PPCIO_INLINE */ | ||||
| 
 | ||||
| #   endif /* !PPCIO_DEBUG */ | ||||
| 
 | ||||
| #  else /* !GNUC && !PPC */ | ||||
| #  else /* !GNUC */ | ||||
| #   if !defined(QNX4) | ||||
| #    if defined(__STDC__) && (__STDC__ == 1) | ||||
| #     ifndef asm | ||||
|  |  | |||
|  | @ -194,6 +194,10 @@ void *xf86GetPointerScreenFuncs(void); | |||
| void xf86InitOrigins(void); | ||||
| void xf86ReconfigureLayout(void); | ||||
| 
 | ||||
| /* xf86cvt.c */ | ||||
| DisplayModePtr xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, | ||||
|                            Bool Reduced, Bool Interlaced); | ||||
| 
 | ||||
| /* xf86DPMS.c */ | ||||
| 
 | ||||
| Bool xf86DPMSInit(ScreenPtr pScreen, DPMSSetProcPtr set, int flags); | ||||
|  |  | |||
|  | @ -1,6 +1,3 @@ | |||
| /* $DHD: xc/programs/Xserver/hw/xfree86/common/xf86AutoConfig.c,v 1.15 2003/09/24 19:39:36 dawes Exp $ */ | ||||
| /* $XdotOrg: $ */ | ||||
| 
 | ||||
| /*
 | ||||
|  * Copyright 2003 by David H. Dawes. | ||||
|  * Copyright 2003 by X-Oz Technologies. | ||||
|  | @ -32,7 +29,6 @@ | |||
|  * Author: David Dawes <dawes@XFree86.Org>. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #ifdef HAVE_XORG_CONFIG_H | ||||
| #include <xorg-config.h> | ||||
| #endif | ||||
|  | @ -44,9 +40,7 @@ | |||
| #include "xf86Priv.h" | ||||
| #include "xf86_OSlib.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Sections for the default built-in configuration. | ||||
|  */ | ||||
| /* Sections for the default built-in configuration. */ | ||||
| 
 | ||||
| #define BUILTIN_MODULE_SECTION \ | ||||
| 	"Section \"Module\"\n" \ | ||||
|  | @ -100,17 +94,6 @@ | |||
| #define BUILTIN_LAYOUT_SECTION_POST \ | ||||
| 	"EndSection\n\n" | ||||
| 
 | ||||
| 
 | ||||
| #ifndef GET_CONFIG_CMD | ||||
| #define GET_CONFIG_CMD			"getconfig" | ||||
| #endif | ||||
| 
 | ||||
| #ifndef GETCONFIG_DIR | ||||
| #define GETCONFIG_DIR			PROJECTROOT "/lib/X11/getconfig" | ||||
| #endif | ||||
| 
 | ||||
| #define GETCONFIG_WHITESPACE		" \t\n" | ||||
| 
 | ||||
| static const char **builtinConfig = NULL; | ||||
| static int builtinLines = 0; | ||||
| static const char *deviceList[] = { | ||||
|  | @ -170,6 +153,61 @@ AppendToConfig(const char *s) | |||
|     AppendToList(s, &builtinConfig, &builtinLines); | ||||
| } | ||||
| 
 | ||||
| static const char * | ||||
| videoPtrToDriverName(pciVideoPtr info) | ||||
| { | ||||
|     /*
 | ||||
|      * things not handled yet: | ||||
|      * amd/cyrix/nsc | ||||
|      * xgi | ||||
|      */ | ||||
| 
 | ||||
|     switch (info->vendor) | ||||
|     { | ||||
| 	case 0x1142:		    return "apm"; | ||||
| 	case 0xedd8:		    return "ark"; | ||||
| 	case 0x1a03:		    return "ast"; | ||||
| 	case 0x1002:		    return "ati"; | ||||
| 	case 0x102c:		    return "chips"; | ||||
| 	case 0x1013:		    return "cirrus"; | ||||
| 	case 0x8086: | ||||
| 	    if ((info->chipType == 0x00d1) || (info->chipType == 0x7800)) | ||||
| 		return "i740"; | ||||
| 	    else return "i810"; | ||||
| 	case 0x102b:		    return "mga"; | ||||
| 	case 0x10c8:		    return "neomagic"; | ||||
| 	case 0x105d:		    return "i128"; | ||||
| 	case 0x10de: case 0x12d2:   return "nv"; | ||||
| 	case 0x1163:		    return "rendition"; | ||||
| 	case 0x5333: | ||||
| 	    switch (info->chipType) | ||||
| 	    { | ||||
| 		case 0x88d0: case 0x88d1: case 0x88f0: case 0x8811: | ||||
| 		case 0x8812: case 0x8814: case 0x8901: | ||||
| 		    return "s3"; | ||||
| 		case 0x5631: case 0x883d: case 0x8a01: case 0x8a10: | ||||
| 		case 0x8c01: case 0x8c03: case 0x8904: case 0x8a13: | ||||
| 		    return "s3virge"; | ||||
| 		default: | ||||
| 		    return "savage"; | ||||
| 	    } | ||||
| 	case 0x1039:		    return "sis"; | ||||
| 	case 0x126f:		    return "siliconmotion"; | ||||
| 	case 0x121a: | ||||
| 	    if (info->chipType < 0x0003) | ||||
| 	        return "voodoo"; | ||||
| 	    else | ||||
| 	        return "tdfx"; | ||||
| 	case 0x3d3d:		    return "glint"; | ||||
| 	case 0x1023:		    return "trident"; | ||||
| 	case 0x100c:		    return "tseng"; | ||||
| 	case 0x1106:		    return "via"; | ||||
| 	case 0x15ad:		    return "vmware"; | ||||
| 	default: break; | ||||
|     } | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| Bool | ||||
| xf86AutoConfig(void) | ||||
| { | ||||
|  | @ -177,7 +215,6 @@ xf86AutoConfig(void) | |||
|     char buf[1024]; | ||||
|     pciVideoPtr *pciptr, info = NULL; | ||||
|     char *driver = NULL; | ||||
|     FILE *gp = NULL; | ||||
|     ConfigStatus ret; | ||||
| 
 | ||||
|     /* Find the primary device, and get some information about it. */ | ||||
|  | @ -194,108 +231,8 @@ xf86AutoConfig(void) | |||
| 	ErrorF("xf86PciVideoInfo is not set\n"); | ||||
|     } | ||||
| 
 | ||||
|     if (info) { | ||||
| 	char *tmp; | ||||
| 	char *path = NULL, *a, *b; | ||||
| 	char *searchPath = NULL; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Look for the getconfig program first in the xf86ModulePath | ||||
| 	 * directories, then in GETCONFIG_DIR, then in BINDIR.  If it | ||||
| 	 * isn't found in any of those locations, just use the normal | ||||
| 	 * search path. | ||||
| 	 */ | ||||
| 
 | ||||
| 	if (xf86ModulePath) { | ||||
| 	    a = xnfstrdup(xf86ModulePath); | ||||
| 	    b = strtok(a, ","); | ||||
| 	    while (b) { | ||||
| 		path = xnfrealloc(path, | ||||
| 				  strlen(b) + 1 + strlen(GET_CONFIG_CMD) + 1); | ||||
| 		sprintf(path, "%s/%s", b, GET_CONFIG_CMD); | ||||
| 		if (access(path, X_OK) == 0) | ||||
| 		    break; | ||||
| 		b = strtok(NULL, ","); | ||||
| 	    } | ||||
| 	    if (!b) { | ||||
| 		xfree(path); | ||||
| 		path = NULL; | ||||
| 	    } | ||||
| 	    xfree(a); | ||||
| 	} | ||||
| 
 | ||||
| 	if (!path) { | ||||
| 	    path = xnfstrdup(GETCONFIG_DIR "/" GET_CONFIG_CMD); | ||||
| 	    if (access(path, X_OK) != 0) { | ||||
| 		xfree(path); | ||||
| 		path = NULL; | ||||
| 	    } | ||||
| 	} | ||||
| 
 | ||||
| #ifdef BINDIR | ||||
| 	if (!path) { | ||||
| 	    path = xnfstrdup(BINDIR "/" GET_CONFIG_CMD); | ||||
| 	    if (access(path, X_OK) != 0) { | ||||
| 		xfree(path); | ||||
| 		path = NULL; | ||||
| 	    } | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	if (!path) | ||||
| 	    path = xnfstrdup(GET_CONFIG_CMD); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Build up the config file directory search path: | ||||
| 	 * | ||||
| 	 * /etc/X11 | ||||
| 	 * PROJECTROOT/etc/X11 | ||||
| 	 * xf86ModulePath | ||||
| 	 * PROJECTROOT/lib/X11/getconfig  (GETCONFIG_DIR) | ||||
| 	 */ | ||||
| 
 | ||||
| 	searchPath = xnfalloc(strlen("/etc/X11") + 1 + | ||||
| 			      strlen(PROJECTROOT "/etc/X11") + 1 + | ||||
| 			      (xf86ModulePath ? strlen(xf86ModulePath) : 0) | ||||
| 				+ 1 + | ||||
| 			      strlen(GETCONFIG_DIR) + 1); | ||||
| 	strcpy(searchPath, "/etc/X11," PROJECTROOT "/etc/X11,"); | ||||
| 	if (xf86ModulePath && *xf86ModulePath) { | ||||
| 	    strcat(searchPath, xf86ModulePath); | ||||
| 	    strcat(searchPath, ","); | ||||
| 	} | ||||
| 	strcat(searchPath, GETCONFIG_DIR); | ||||
| 
 | ||||
| 	ErrorF("xf86AutoConfig: Primary PCI is %d:%d:%d\n", | ||||
| 	       info->bus, info->device, info->func); | ||||
| 
 | ||||
| 	snprintf(buf, sizeof(buf), "%s" | ||||
| #ifdef DEBUG | ||||
| 		 " -D" | ||||
| #endif | ||||
| 		 " -X %d" | ||||
| 		 " -I %s" | ||||
| 		 " -v 0x%04x -d 0x%04x -r 0x%02x -s 0x%04x" | ||||
| 		 " -b 0x%04x -c 0x%04x", | ||||
| 		 path, | ||||
| 		 (unsigned int)xorgGetVersion(), | ||||
| 		 searchPath, | ||||
| 		 info->vendor, info->chipType, info->chipRev, | ||||
| 		 info->subsysVendor, info->subsysCard, | ||||
| 		 info->class << 8 | info->subclass); | ||||
| 	ErrorF("Running \"%s\"\n", buf); | ||||
| 	gp = Popen(buf, "r"); | ||||
| 	if (gp) { | ||||
| 	    if (fgets(buf, sizeof(buf) - 1, gp)) { | ||||
| 		buf[strlen(buf) - 1] = '\0'; | ||||
| 		tmp = strtok(buf, GETCONFIG_WHITESPACE); | ||||
| 		if (tmp) | ||||
| 		    driver = xnfstrdup(tmp); | ||||
| 	    } | ||||
| 	} | ||||
| 	xfree(path); | ||||
| 	xfree(searchPath); | ||||
|     } | ||||
|     if (info) | ||||
| 	driver = videoPtrToDriverName(info); | ||||
| 
 | ||||
|     AppendToConfig(BUILTIN_MODULE_SECTION); | ||||
|     AppendToConfig(BUILTIN_MONITOR_SECTION); | ||||
|  | @ -306,19 +243,12 @@ xf86AutoConfig(void) | |||
| 	AppendToConfig(buf); | ||||
| 	ErrorF("New driver is \"%s\"\n", driver); | ||||
| 	buf[0] = '\t'; | ||||
| 	while (fgets(buf + 1, sizeof(buf) - 2, gp)) { | ||||
| 	    AppendToConfig(buf); | ||||
| 	    ErrorF("Extra line: %s", buf); | ||||
| 	} | ||||
| 	AppendToConfig(BUILTIN_DEVICE_SECTION_POST); | ||||
| 	snprintf(buf, sizeof(buf), BUILTIN_SCREEN_SECTION, | ||||
| 		 driver, 0, driver, 0); | ||||
| 	AppendToConfig(buf); | ||||
|     } | ||||
| 
 | ||||
|     if (gp) | ||||
| 	Pclose(gp); | ||||
| 
 | ||||
|     for (p = deviceList; *p; p++) { | ||||
| 	snprintf(buf, sizeof(buf), BUILTIN_DEVICE_SECTION, *p, 0, *p); | ||||
| 	AppendToConfig(buf); | ||||
|  | @ -337,13 +267,6 @@ xf86AutoConfig(void) | |||
|     } | ||||
|     AppendToConfig(BUILTIN_LAYOUT_SECTION_POST); | ||||
| 
 | ||||
| #ifdef BUILTIN_EXTRA | ||||
|     AppendToConfig(BUILTIN_EXTRA); | ||||
| #endif | ||||
| 
 | ||||
|     if (driver) | ||||
| 	xfree(driver); | ||||
| 
 | ||||
|     xf86MsgVerb(X_DEFAULT, 0, | ||||
| 		"Using default built-in configuration (%d lines)\n", | ||||
| 		builtinLines); | ||||
|  | @ -356,12 +279,9 @@ xf86AutoConfig(void) | |||
|     xf86setBuiltinConfig(builtinConfig); | ||||
|     ret = xf86HandleConfigFile(TRUE); | ||||
|     FreeConfig(); | ||||
|     switch(ret) { | ||||
|     case CONFIG_OK: | ||||
| 	return TRUE; | ||||
|     default: | ||||
| 	xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n"); | ||||
| 	return FALSE; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|     if (ret != CONFIG_OK) | ||||
| 	xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n"); | ||||
| 
 | ||||
|     return (ret == CONFIG_OK); | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,292 @@ | |||
| /*
 | ||||
|  * Copyright 2005-2006 Luc Verhaegen. | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a | ||||
|  * copy of this software and associated documentation files (the "Software"), | ||||
|  * to deal in the Software without restriction, including without limitation | ||||
|  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
|  * and/or sell copies of the Software, and to permit persons to whom the | ||||
|  * Software is furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | ||||
|  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||
|  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||
|  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
|  * OTHER DEALINGS IN THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * The reason for having this function in a file of its own is | ||||
|  * so that ../utils/cvt/cvt can link to it, and that xf86CVTMode | ||||
|  * code is shared directly. | ||||
|  */ | ||||
| 
 | ||||
| #include "xf86.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Generate a CVT standard mode from HDisplay, VDisplay and VRefresh. | ||||
|  * | ||||
|  * These calculations are stolen from the CVT calculation spreadsheet written | ||||
|  * by Graham Loveridge. He seems to be claiming no copyright and there seems to | ||||
|  * be no license attached to this. He apparently just wants to see his name | ||||
|  * mentioned. | ||||
|  * | ||||
|  * This file can be found at http://www.vesa.org/Public/CVT/CVTd6r1.xls
 | ||||
|  * | ||||
|  * Comments and structure corresponds to the comments and structure of the xls. | ||||
|  * This should ease importing of future changes to the standard (not very | ||||
|  * likely though). | ||||
|  * | ||||
|  * About margins; i'm sure that they are to be the bit between HDisplay and | ||||
|  * HBlankStart, HBlankEnd and HTotal, VDisplay and VBlankStart, VBlankEnd and  | ||||
|  * VTotal, where the overscan colour is shown. FB seems to call _all_ blanking | ||||
|  * outside sync "margin" for some reason. Since we prefer seeing proper | ||||
|  * blanking instead of the overscan colour, and since the Crtc* values will | ||||
|  * probably get altered after us, we will disable margins altogether. With | ||||
|  * these calculations, Margins will plainly expand H/VDisplay, and we don't | ||||
|  * want that. -- libv | ||||
|  * | ||||
|  */ | ||||
| _X_EXPORT DisplayModePtr | ||||
| xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, Bool Reduced, | ||||
|             Bool Interlaced) | ||||
| { | ||||
|     DisplayModeRec  *Mode = xnfalloc(sizeof(DisplayModeRec)); | ||||
| 
 | ||||
|     /* 1) top/bottom margin size (% of height) - default: 1.8 */ | ||||
| #define CVT_MARGIN_PERCENTAGE 1.8     | ||||
| 
 | ||||
|     /* 2) character cell horizontal granularity (pixels) - default 8 */ | ||||
| #define CVT_H_GRANULARITY 8 | ||||
| 
 | ||||
|     /* 4) Minimum vertical porch (lines) - default 3 */ | ||||
| #define CVT_MIN_V_PORCH 3 | ||||
| 
 | ||||
|     /* 4) Minimum number of vertical back porch lines - default 6 */ | ||||
| #define CVT_MIN_V_BPORCH 6 | ||||
| 
 | ||||
|     /* Pixel Clock step (kHz) */ | ||||
| #define CVT_CLOCK_STEP 250 | ||||
| 
 | ||||
|     Bool Margins = FALSE; | ||||
|     float  VFieldRate, HPeriod; | ||||
|     int  HDisplayRnd, HMargin; | ||||
|     int  VDisplayRnd, VMargin, VSync; | ||||
|     float  Interlace; /* Please rename this */ | ||||
| 
 | ||||
|     memset(Mode, 0, sizeof(DisplayModeRec)); | ||||
| 
 | ||||
|     /* CVT default is 60.0Hz */ | ||||
|     if (!VRefresh) | ||||
|         VRefresh = 60.0; | ||||
| 
 | ||||
|     /* 1. Required field rate */ | ||||
|     if (Interlaced) | ||||
|         VFieldRate = VRefresh * 2; | ||||
|     else | ||||
|         VFieldRate = VRefresh; | ||||
| 
 | ||||
|     /* 2. Horizontal pixels */ | ||||
|     HDisplayRnd = HDisplay - (HDisplay % CVT_H_GRANULARITY); | ||||
| 
 | ||||
|     /* 3. Determine left and right borders */ | ||||
|     if (Margins) { | ||||
|         /* right margin is actually exactly the same as left */ | ||||
|         HMargin = (((float) HDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); | ||||
|         HMargin -= HMargin % CVT_H_GRANULARITY; | ||||
|     } else | ||||
|         HMargin = 0; | ||||
| 
 | ||||
|     /* 4. Find total active pixels */ | ||||
|     Mode->HDisplay = HDisplayRnd + 2*HMargin; | ||||
| 
 | ||||
|     /* 5. Find number of lines per field */ | ||||
|     if (Interlaced) | ||||
|         VDisplayRnd = VDisplay / 2; | ||||
|     else | ||||
|         VDisplayRnd = VDisplay; | ||||
| 
 | ||||
|     /* 6. Find top and bottom margins */ | ||||
|     /* nope. */ | ||||
|     if (Margins) | ||||
|         /* top and bottom margins are equal again. */ | ||||
|         VMargin = (((float) VDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); | ||||
|     else | ||||
|         VMargin = 0; | ||||
| 
 | ||||
|     Mode->VDisplay = VDisplay + 2*VMargin; | ||||
| 
 | ||||
|     /* 7. Interlace */ | ||||
|     if (Interlaced) | ||||
|         Interlace = 0.5; | ||||
|     else | ||||
|         Interlace = 0.0; | ||||
| 
 | ||||
|     /* Determine VSync Width from aspect ratio */ | ||||
|     if (!(VDisplay % 3) && ((VDisplay * 4 / 3) == HDisplay)) | ||||
|         VSync = 4; | ||||
|     else if (!(VDisplay % 9) && ((VDisplay * 16 / 9) == HDisplay)) | ||||
|         VSync = 5; | ||||
|     else if (!(VDisplay % 10) && ((VDisplay * 16 / 10) == HDisplay)) | ||||
|         VSync = 6; | ||||
|     else if (!(VDisplay % 4) && ((VDisplay * 5 / 4) == HDisplay)) | ||||
|         VSync = 7; | ||||
|     else if (!(VDisplay % 9) && ((VDisplay * 15 / 9) == HDisplay)) | ||||
|         VSync = 7; | ||||
|     else /* Custom */ | ||||
|         VSync = 10; | ||||
| 
 | ||||
|     if (!Reduced) { /* simplified GTF calculation */ | ||||
| 
 | ||||
|         /* 4) Minimum time of vertical sync + back porch interval (µs) 
 | ||||
|          * default 550.0 */ | ||||
| #define CVT_MIN_VSYNC_BP 550.0 | ||||
| 
 | ||||
|         /* 3) Nominal HSync width (% of line period) - default 8 */ | ||||
| #define CVT_HSYNC_PERCENTAGE 8 | ||||
| 
 | ||||
|         float  HBlankPercentage; | ||||
|         int  VSyncAndBackPorch, VBackPorch; | ||||
|         int  HBlank; | ||||
| 
 | ||||
|         /* 8. Estimated Horizontal period */ | ||||
|         HPeriod = ((float) (1000000.0 / VFieldRate - CVT_MIN_VSYNC_BP)) /  | ||||
|             (VDisplayRnd + 2 * VMargin + CVT_MIN_V_PORCH + Interlace); | ||||
| 
 | ||||
|         /* 9. Find number of lines in sync + backporch */ | ||||
|         if (((int)(CVT_MIN_VSYNC_BP / HPeriod) + 1) < (VSync + CVT_MIN_V_PORCH)) | ||||
|             VSyncAndBackPorch = VSync + CVT_MIN_V_PORCH; | ||||
|         else | ||||
|             VSyncAndBackPorch = (int)(CVT_MIN_VSYNC_BP / HPeriod) + 1; | ||||
| 
 | ||||
|         /* 10. Find number of lines in back porch */ | ||||
|         VBackPorch = VSyncAndBackPorch - VSync; | ||||
| 
 | ||||
|         /* 11. Find total number of lines in vertical field */ | ||||
|         Mode->VTotal = VDisplayRnd + 2 * VMargin + VSyncAndBackPorch + Interlace | ||||
|             + CVT_MIN_V_PORCH; | ||||
| 
 | ||||
|         /* 5) Definition of Horizontal blanking time limitation */ | ||||
|         /* Gradient (%/kHz) - default 600 */ | ||||
| #define CVT_M_FACTOR 600 | ||||
| 
 | ||||
|         /* Offset (%) - default 40 */ | ||||
| #define CVT_C_FACTOR 40 | ||||
| 
 | ||||
|         /* Blanking time scaling factor - default 128 */ | ||||
| #define CVT_K_FACTOR 128 | ||||
| 
 | ||||
|         /* Scaling factor weighting - default 20 */ | ||||
| #define CVT_J_FACTOR 20 | ||||
| 
 | ||||
| #define CVT_M_PRIME CVT_M_FACTOR * CVT_K_FACTOR / 256 | ||||
| #define CVT_C_PRIME (CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ | ||||
|         CVT_J_FACTOR | ||||
| 
 | ||||
|         /* 12. Find ideal blanking duty cycle from formula */ | ||||
|         HBlankPercentage = CVT_C_PRIME - CVT_M_PRIME * HPeriod/1000.0; | ||||
| 
 | ||||
|         /* 13. Blanking time */ | ||||
|         if (HBlankPercentage < 20) | ||||
|             HBlankPercentage = 20; | ||||
| 
 | ||||
|         HBlank = Mode->HDisplay * HBlankPercentage/(100.0 - HBlankPercentage); | ||||
|         HBlank -= HBlank % (2*CVT_H_GRANULARITY); | ||||
|          | ||||
|         /* 14. Find total number of pixels in a line. */ | ||||
|         Mode->HTotal = Mode->HDisplay + HBlank; | ||||
| 
 | ||||
|         /* Fill in HSync values */ | ||||
|         Mode->HSyncEnd = Mode->HDisplay + HBlank / 2; | ||||
| 
 | ||||
|         Mode->HSyncStart = Mode->HSyncEnd -  | ||||
|             (Mode->HTotal * CVT_HSYNC_PERCENTAGE) / 100; | ||||
|         Mode->HSyncStart += CVT_H_GRANULARITY -  | ||||
|             Mode->HSyncStart % CVT_H_GRANULARITY; | ||||
| 
 | ||||
|         /* Fill in VSync values */ | ||||
|         Mode->VSyncStart = Mode->VDisplay + CVT_MIN_V_PORCH; | ||||
|         Mode->VSyncEnd = Mode->VSyncStart + VSync; | ||||
| 
 | ||||
|     } else { /* Reduced blanking */ | ||||
|         /* Minimum vertical blanking interval time (µs) - default 460 */ | ||||
| #define CVT_RB_MIN_VBLANK 460.0 | ||||
| 
 | ||||
|         /* Fixed number of clocks for horizontal sync */ | ||||
| #define CVT_RB_H_SYNC 32.0 | ||||
| 
 | ||||
|         /* Fixed number of clocks for horizontal blanking */ | ||||
| #define CVT_RB_H_BLANK 160.0 | ||||
| 
 | ||||
|         /* Fixed number of lines for vertical front porch - default 3 */ | ||||
| #define CVT_RB_VFPORCH 3 | ||||
| 
 | ||||
|         int  VBILines; | ||||
| 
 | ||||
|         /* 8. Estimate Horizontal period. */ | ||||
|         HPeriod = ((float) (1000000.0 / VFieldRate - CVT_RB_MIN_VBLANK)) /  | ||||
|             (VDisplayRnd + 2*VMargin); | ||||
| 
 | ||||
|         /* 9. Find number of lines in vertical blanking */ | ||||
|         VBILines = ((float) CVT_RB_MIN_VBLANK) / HPeriod + 1; | ||||
| 
 | ||||
|         /* 10. Check if vertical blanking is sufficient */ | ||||
|         if (VBILines < (CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH)) | ||||
|             VBILines = CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH; | ||||
|          | ||||
|         /* 11. Find total number of lines in vertical field */ | ||||
|         Mode->VTotal = VDisplayRnd + 2 * VMargin + Interlace + VBILines; | ||||
| 
 | ||||
|         /* 12. Find total number of pixels in a line */ | ||||
|         Mode->HTotal = Mode->HDisplay + CVT_RB_H_BLANK; | ||||
| 
 | ||||
|         /* Fill in HSync values */ | ||||
|         Mode->HSyncEnd = Mode->HDisplay + CVT_RB_H_BLANK / 2; | ||||
|         Mode->HSyncStart = Mode->HSyncEnd - CVT_RB_H_SYNC; | ||||
| 
 | ||||
|         /* Fill in VSync values */ | ||||
|         Mode->VSyncStart = Mode->VDisplay + CVT_RB_VFPORCH; | ||||
|         Mode->VSyncEnd = Mode->VSyncStart + VSync; | ||||
|     } | ||||
| 
 | ||||
|     /* 15/13. Find pixel clock frequency (kHz for xf86) */ | ||||
|     Mode->Clock = Mode->HTotal * 1000.0 / HPeriod; | ||||
|     Mode->Clock -= Mode->Clock % CVT_CLOCK_STEP; | ||||
| 
 | ||||
|     /* 16/14. Find actual Horizontal Frequency (kHz) */ | ||||
|     Mode->HSync = ((float) Mode->Clock) / ((float) Mode->HTotal); | ||||
| 
 | ||||
|     /* 17/15. Find actual Field rate */ | ||||
|     Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /  | ||||
|         ((float) (Mode->HTotal * Mode->VTotal)); | ||||
| 
 | ||||
|     /* 18/16. Find actual vertical frame frequency */ | ||||
|     /* ignore - just set the mode flag for interlaced */ | ||||
|     if (Interlaced) | ||||
|         Mode->VTotal *= 2; | ||||
| 
 | ||||
|     { | ||||
|         char  Name[256]; | ||||
|         Name[0] = 0; | ||||
| 
 | ||||
|         snprintf(Name, 256, "%dx%d", HDisplay, VDisplay); | ||||
| 
 | ||||
|         Mode->name = xnfalloc(strlen(Name) + 1); | ||||
|         memcpy(Mode->name, Name, strlen(Name) + 1); | ||||
|     } | ||||
| 
 | ||||
|     if (Reduced) | ||||
|         Mode->Flags |= V_PHSYNC | V_NVSYNC; | ||||
|     else | ||||
|         Mode->Flags |= V_NHSYNC | V_PVSYNC; | ||||
| 
 | ||||
|     if (Interlaced) | ||||
|         Mode->Flags |= V_INTERLACE; | ||||
| 
 | ||||
|     return Mode; | ||||
| } | ||||
|  | @ -1,4 +0,0 @@ | |||
| getconfig.1 | ||||
| getconfig.1x | ||||
| getconfig.5 | ||||
| getconfig.5x | ||||
|  | @ -1,56 +0,0 @@ | |||
| # Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 | ||||
| # 
 | ||||
| # Permission is hereby granted, free of charge, to any person obtaining a
 | ||||
| # copy of this software and associated documentation files (the
 | ||||
| # "Software"), to deal in the Software without restriction, including
 | ||||
| # without limitation the rights to use, copy, modify, merge, publish,
 | ||||
| # distribute, and/or sell copies of the Software, and to permit persons
 | ||||
| # to whom the Software is furnished to do so, provided that the above
 | ||||
| # copyright notice(s) and this permission notice appear in all copies of
 | ||||
| # the Software and that both the above copyright notice(s) and this
 | ||||
| # permission notice appear in supporting documentation.
 | ||||
| # 
 | ||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | ||||
| # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | ||||
| # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
 | ||||
| # OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 | ||||
| # HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
 | ||||
| # INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
 | ||||
| # FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 | ||||
| # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 | ||||
| # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | ||||
| # 
 | ||||
| # Except as contained in this notice, the name of a copyright holder
 | ||||
| # shall not be used in advertising or otherwise to promote the sale, use
 | ||||
| # or other dealings in this Software without prior written authorization
 | ||||
| # of the copyright holder.
 | ||||
| # 
 | ||||
| 
 | ||||
| dist_bin_SCRIPTS = getconfig getconfig.pl | ||||
| 
 | ||||
| getconfigdir = $(libdir)/X11/getconfig | ||||
| dist_getconfig_DATA = xorg.cfg cfg.sample | ||||
| 
 | ||||
| include $(top_srcdir)/cpprules.in | ||||
| 
 | ||||
| appmandir = $(APP_MAN_DIR) | ||||
| appman_PRE = getconfig.man | ||||
| appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@) | ||||
| 
 | ||||
| filemandir = $(FILE_MAN_DIR) | ||||
| fileman_DATA = getconfig.$(FILE_MAN_SUFFIX) | ||||
| 
 | ||||
| getconfig.$(FILE_MAN_SUFFIX): cfg.man | ||||
| 	-rm -f getconfig.$(FILE_MAN_SUFFIX) | ||||
| 	$(LN_S) cfg.man getconfig.$(FILE_MAN_SUFFIX) | ||||
| 
 | ||||
| SUFFIXES += .$(APP_MAN_SUFFIX) .man | ||||
| 
 | ||||
| .man.$(APP_MAN_SUFFIX): | ||||
| 	-rm -f $@ | ||||
| 	$(LN_S) $< $@ | ||||
| 
 | ||||
| BUILT_SOURCES = $(appman_PRE) | ||||
| CLEANFILES = $(appman_PRE) $(appman_DATA) $(fileman_DATA) cfg.man | ||||
| 
 | ||||
| EXTRA_DIST = cfg.man.pre getconfig.man.pre | ||||
|  | @ -1,137 +0,0 @@ | |||
| .TH getconfig __filemansuffix__  __vendorversion__ | ||||
| .SH NAME | ||||
| getconfig - meta configuration files for getconfig(1) | ||||
| .SH SYNOPSIS | ||||
| .B \(**.cfg | ||||
| .SH DESCRIPTION | ||||
| .B getconfig | ||||
| is a programmatic interface that is used by the | ||||
| .B __xservername__ | ||||
| server to get configuration information about video hardware when | ||||
| operating without an | ||||
| .B __xconfigfile__ | ||||
| file. | ||||
| .PP | ||||
| This implementation of | ||||
| .B getconfig | ||||
| is written in perl.  It processes rules from meta-configuration files. | ||||
| All meta-configuration files have a | ||||
| .I .cfg | ||||
| suffix. | ||||
| .PP | ||||
| Lines starting with a pound-sign (#) are comments, and are ignored. | ||||
| Blank lines that consist only of white space are also treated as comments | ||||
| and ignored. | ||||
| .PP | ||||
| The first non-comment line must be a signature string followed by | ||||
| the file format version number.  The signature string is | ||||
| .PP | ||||
| .RS 4 | ||||
| .nf | ||||
| "Xorg getconfig rules file.\ \ Version: " | ||||
| .fi | ||||
| .RE | ||||
| .PP | ||||
| The currently defined version is "1.0".  Files that do not have the | ||||
| correct signature string are ignored. | ||||
| .PP | ||||
| The remaining non-comment lines define rules.  The start of a new rule | ||||
| is indicated by a line with no leading white space.  Subsequent lines | ||||
| making up a rule must be indented with white space.  Logical lines within | ||||
| a rule may be split over multiple physical lines by using the usual | ||||
| continuation convention ('\e' at the end of the line).  The first logical | ||||
| line of each rule is a perl expression.  It may be any valid perl | ||||
| expression whose evaluated (with 'eval') result may be used as the | ||||
| argument to a perl 'if' statement.  The second logical line should be | ||||
| the name of the __xservername__ video driver to use when the rule is true, and | ||||
| subsequent logical lines of each rule, if present, are additional | ||||
| configuration output for the video device's | ||||
| .B __xconfigfile__ | ||||
| .B Device | ||||
| section.  The driver name and additional lines of configuration information | ||||
| are written to standard output when the rule is chosen as the successful | ||||
| rule. | ||||
| .PP | ||||
| Pseudo rules consisting of perl expressions may be present in the file | ||||
| for the purpose of defining custom perl variables or setting the weight | ||||
| to use for the following rules.  Pseudo rules are rules that consist of | ||||
| a single logical line only, and the are never candidates themselves for the | ||||
| successful rule. | ||||
| .PP | ||||
| Several perl variables are pre-defined, and may be used within rules. | ||||
| They include: | ||||
| .PP | ||||
| .RS 4 | ||||
| .nf | ||||
| .BR "$vendor                 " "PCI vendor ID" | ||||
| .BR "$device                 " "PCI device ID" | ||||
| .BR "$revision               " "PCI revision ID" | ||||
| .BR "$subsys                 " "PCI subsystem ID" | ||||
| .BR "$subsysVendor           " "PCI subsystem vendor ID" | ||||
| .BR "$class                  " "PCI class" | ||||
| .BR "$XorgVersion         " "Xorg version, as a 'v' string" | ||||
| .BR "$XorgVersionNumeric  " "Xorg numeric version" | ||||
| .BR "$XorgVersionMajor    " "Xorg major version" | ||||
| .BR "$XorgVersionMinor    " "Xorg minor version" | ||||
| .BR "$XorgVersionPatch    " "Xorg patch version" | ||||
| .BR "$XorgVersionSnap     " "Xorg snap version" | ||||
| .BR "$weight                 " "current rule weight" | ||||
| .fi | ||||
| .RE | ||||
| .PP | ||||
| The | ||||
| .B $weight | ||||
| variable determines the weight of the rules as they are processed.  The | ||||
| weight for subsequent rules may be set with a pseudo rule that sets or | ||||
| changes the value of | ||||
| .BR $weight . | ||||
| The default weight, and the weight used for built-in rules is 500.  The | ||||
| meta-configuration files are processed in an unpredictable order.  The | ||||
| weighting of the rules is used to determine their relative priority | ||||
| .PP | ||||
| After processing all of the rules, both built-in and those read from | ||||
| the meta-configuration files, the | ||||
| .B getconfig | ||||
| program chooses as the successful rule the last and highest weighted | ||||
| rule that evaluates to true. | ||||
| .SH FILES | ||||
| .I .cfg | ||||
| files located in the search path.  The search path typically specified | ||||
| by the | ||||
| .B __xservername__ | ||||
| server is: | ||||
| .PP | ||||
| .RS 4 | ||||
| .nf | ||||
| .I /etc/X11 | ||||
| .I __projectroot__/etc/X11 | ||||
| .I <modulepath> | ||||
| .I __projectroot__/lib/X11/getconfig | ||||
| .fi | ||||
| .RE | ||||
| .PP | ||||
| where | ||||
| .I <modulepath> | ||||
| is the | ||||
| .B __xservername__ | ||||
| server's module search path. | ||||
| .PP | ||||
| .TP 30 | ||||
| .I __projectroot__/lib/X11/getconfig/xorg.cfg | ||||
| Default rules file that gets installed.  This file doesn't contain any | ||||
| rules by default. | ||||
| .TP 30 | ||||
| .I __projectroot__/lib/X11/getconfig/cfg.sample | ||||
| A sample rules file that gives some examples of what types of rules can | ||||
| appear in rules files. | ||||
| 
 | ||||
| .SH "SEE ALSO" | ||||
| getconfig(1), | ||||
| __xservername__(__appmansuffix__), | ||||
| __xconfigfile__(__filemansuffix__). | ||||
| 
 | ||||
| .SH AUTHORS | ||||
| The __xservername__ automatic configuration support and the | ||||
| .B getconfig | ||||
| interface was written by David H. Dawes, with the support of X-Oz | ||||
| Technologies for XFree86. | ||||
|  | @ -1,110 +0,0 @@ | |||
| # $DHD: xc/programs/Xserver/hw/xfree86/getconfig/cfg.sample,v 1.2 2003/09/23 05:12:07 dawes Exp $ | ||||
| 
 | ||||
| # Some sample Xorg getconfig rules file. | ||||
| 
 | ||||
| # | ||||
| # The line below is the getconfig rules file signature, and must be the | ||||
| # first non-blank, non-comment line. | ||||
| # | ||||
| 
 | ||||
| Xorg Project getconfig rules file.  Version: 1.0 | ||||
| 
 | ||||
| # | ||||
| # Set the weight for the following rules.  This should be set, otherwise | ||||
| # the previously set weight will get used, and you have no idea of knowing | ||||
| # what that might be. | ||||
| # | ||||
| 
 | ||||
| $weight = 1000 | ||||
| 
 | ||||
| # | ||||
| # Rules.  Rules consist of a condition (in perl code) followed by | ||||
| # a driver name and optionally some additional strings.  The start of a | ||||
| # rule is indicated by a line with no leading white space.  Subsequent | ||||
| # lines making up a rule must be indented.  Logical lines may be split | ||||
| # over multiple physical lines by using the usual continuation '\'. | ||||
| # | ||||
| # Rules that are not followed by a driver name may be used to do other | ||||
| # things, like setting the weight as above. | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Pre-defined variables include: | ||||
| # | ||||
| #   $vendor		PCI vendor ID | ||||
| #   $device		PCI device ID | ||||
| #   $revision		PCI revision ID | ||||
| #   $subsys		PCI subsystem ID | ||||
| #   $subsysVendor	PCI subsystem vendor ID | ||||
| #   $class		PCI class | ||||
| #   $XorgVersion	Xorg version, as a 'v' string. | ||||
| # | ||||
| # The Xorg version information is also available as the following: | ||||
| # | ||||
| #   $XorgVersionNumeric | ||||
| #   $XorgVersionMajor | ||||
| #   $XorgVersionMinor | ||||
| #   $XorgVersionPatch | ||||
| #   $XorgVersionSnap | ||||
| #    | ||||
| 
 | ||||
| # Define a fake vendor ID for some sample rules. | ||||
| 
 | ||||
| $novendor = 0x10000 | ||||
| $nodevice = 0x10000 | ||||
| 
 | ||||
| $vendor == $novendor | ||||
| 	nodriver | ||||
| 	Option "xx" | ||||
| 	Videoram 1000 | ||||
| 
 | ||||
| # A rule with continued lines. | ||||
| 
 | ||||
| $vendor == $novendor && \ | ||||
| $device == $nodevice  | ||||
| 	nodriver2 | ||||
| 	Option \ | ||||
| 	"yy" | ||||
| 
 | ||||
| # Increase the weight of the following rules if the Xorg version is 4.3 or | ||||
| # higher. | ||||
| 
 | ||||
| $weight++ if ($XorgVersion ge v4.3) | ||||
| 
 | ||||
| $vendor == $novendor | ||||
| 	nodriver | ||||
| 	Option "yy" | ||||
| 
 | ||||
| # | ||||
| # The weight can be changed at any times, and applies to rules that follow | ||||
| # until changed again. | ||||
| # | ||||
| 
 | ||||
| $weight = 100 | ||||
| 
 | ||||
| $vendor == $novendor && $XorgVersion eq v4.3.2.1 | ||||
| 	nodriver3 | ||||
| 
 | ||||
| $weight = 600 | ||||
| 
 | ||||
| # | ||||
| # The following two examples use some real values. | ||||
| # | ||||
| 
 | ||||
| # Example: make the default depth 24 for Radeon R200 and RV200 cards. | ||||
| 
 | ||||
| $vendor == 0x1002 && \ | ||||
|     ($device >= 0x5148 && $device <= 0x514F || \ | ||||
|      $device >= 0x5168 && $device <= 0x516C || \ | ||||
|      $device == 0x4242 || \ | ||||
|      $device >= 0x5157 && device <= 0x5158) | ||||
| 	ati | ||||
| 	Option "DefaultDepth" "24" | ||||
| 
 | ||||
| 
 | ||||
| # Example: enable DRI for MGA G400 | ||||
| 
 | ||||
| $vendor == 0x102b && $device == 0x0525 | ||||
| 	mga | ||||
| 	Option "dri" | ||||
| 
 | ||||
|  | @ -1,43 +0,0 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| # $XdotOrg$ | ||||
| 
 | ||||
| # | ||||
| # Copyright 2003 by David H. Dawes. | ||||
| # Copyright 2003 by X-Oz Technologies. | ||||
| # All rights reserved. | ||||
| # | ||||
| # Permission is hereby granted, free of charge, to any person obtaining a | ||||
| # copy of this software and associated documentation files (the "Software"), | ||||
| # to deal in the Software without restriction, including without limitation | ||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
| # and/or sell copies of the Software, and to permit persons to whom the | ||||
| # Software is furnished to do so, subject to the following conditions: | ||||
| #  | ||||
| # The above copyright notice and this permission notice shall be included in | ||||
| # all copies or substantial portions of the Software. | ||||
| #  | ||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | ||||
| # THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||
| # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||
| # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
| # OTHER DEALINGS IN THE SOFTWARE. | ||||
| #  | ||||
| # Except as contained in this notice, the name of the copyright holder(s) | ||||
| # and author(s) shall not be used in advertising or otherwise to promote | ||||
| # the sale, use or other dealings in this Software without prior written | ||||
| # authorization from the copyright holder(s) and author(s). | ||||
| #  | ||||
| # Author: David Dawes <dawes@XFree86.Org>. | ||||
| # | ||||
| 
 | ||||
| # A simple wrapper to execute the real getconfig program.  So long as perl | ||||
| # is in $PATH, we don't need to know where it is this way. | ||||
| 
 | ||||
| if echo $0 | grep / >/dev/null 2>&1; then | ||||
| 	DIR=`dirname $0`/ | ||||
| fi | ||||
| 
 | ||||
| exec perl ${DIR}getconfig.pl "$@" | ||||
|  | @ -1,98 +0,0 @@ | |||
| .TH getconfig 1 __vendorversion__ | ||||
| .SH NAME | ||||
| getconfig - get configuration information for the __xservername__ server | ||||
| .SH SYNOPSIS | ||||
| .B getconfig | ||||
| .RI [ option | ||||
| .IR ... ] | ||||
| .SH DESCRIPTION | ||||
| .B getconfig | ||||
| is a programmatic interface that is used by the | ||||
| .B __xservername__ | ||||
| server to get configuration information about video hardware when | ||||
| operating without an | ||||
| .B __xconfigfile__ | ||||
| file. | ||||
| .PP | ||||
| This implementation of | ||||
| .B getconfig | ||||
| is written in perl.  It processes a prioritized and ordered list of | ||||
| rules supplied internally and from meta-configuration files.  The rules | ||||
| are in the form of perl expressions. | ||||
| .B getconfig | ||||
| writes to standard output the __xconfigfile__-style configuration data | ||||
| specified by the last highest priority rule that evaluates to true. | ||||
| Information about the format of the meta-configuration files can be | ||||
| found in the getconfig(__filemansuffix__) manual page. | ||||
| .SH OPTIONS | ||||
| .TP 8 | ||||
| .BI \-I " search-path" | ||||
| Specify the search path to use for meta-config files. | ||||
| .I search-path | ||||
| is a comma-separated list of directories to search.  Each directory in | ||||
| the search path is searched for files with a | ||||
| .I .cfg | ||||
| suffix.  Each such file is opened and checked for a valid signature | ||||
| string.  Rules are read from files with a valid signature string and | ||||
| appended to the list of rules to evaluate.  If no search path is specified, | ||||
| only the internally supplied configuration rules will be used. | ||||
| .TP 8 | ||||
| .B \-D | ||||
| Enable debugging output. | ||||
| .TP 8 | ||||
| .B \-V | ||||
| Print out the version information and exit. | ||||
| .TP 8 | ||||
| .BI \-X  | ||||
| .BI __xservername__-version | ||||
| Specify the __xservername__ version in numeric (integer) form. | ||||
| .TP 8 | ||||
| .BI \-b " subsys-id" | ||||
| Specify the PCI subsystem ID of the video device. | ||||
| .TP 8 | ||||
| .BI \-c " class" | ||||
| Specify the PCI class of the video device. | ||||
| .TP 8 | ||||
| .BI \-d " device-id" | ||||
| Specify the PCI devide ID of the video device. | ||||
| .TP 8 | ||||
| .BI \-r " revision" | ||||
| Specify the PCI revision of the video device. | ||||
| .TP 8 | ||||
| .BI \-s " subsysvendor-id" | ||||
| Specify the PCI subsystem vendor ID of the video device. | ||||
| .TP 8 | ||||
| .BI \-v " vendor-id" | ||||
| Specify the PCI vendor ID of the video device. | ||||
| .SH FILES | ||||
| .I .cfg | ||||
| files located in the search path.  The search path typically specified | ||||
| by the | ||||
| .B __xservername__ | ||||
| server is: | ||||
| .PP | ||||
| .RS 4 | ||||
| .nf | ||||
| .I /etc/X11 | ||||
| .I __projectroot__/etc/X11 | ||||
| .I <modulepath> | ||||
| .I __projectroot__/lib/X11/getconfig | ||||
| .fi | ||||
| .RE | ||||
| .PP | ||||
| where | ||||
| .I <modulepath> | ||||
| is the | ||||
| .B __xservername__ | ||||
| server's module search path. | ||||
| 
 | ||||
| .SH "SEE ALSO" | ||||
| getconfig(__filemansuffix__), | ||||
| __xservername__(__appmansuffix__), | ||||
| __xconfigfile__(__filemansuffix__). | ||||
| 
 | ||||
| .SH AUTHORS | ||||
| The __xservername__ automatic configuration support and the | ||||
| .B getconfig | ||||
| interface was written by David H. Dawes, with the support of X-Oz | ||||
| Technologies for XFree86. | ||||
|  | @ -1,433 +0,0 @@ | |||
| #!/usr/bin/perl | ||||
| 
 | ||||
| # $DHD: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.pl,v 1.13 2003/09/23 05:12:07 dawes Exp $ | ||||
| # $XdotOrg: $ | ||||
| 
 | ||||
| # | ||||
| # Copyright 2003 by David H. Dawes. | ||||
| # Copyright 2003 by X-Oz Technologies. | ||||
| # All rights reserved. | ||||
| # | ||||
| # Permission is hereby granted, free of charge, to any person obtaining a | ||||
| # copy of this software and associated documentation files (the "Software"), | ||||
| # to deal in the Software without restriction, including without limitation | ||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
| # and/or sell copies of the Software, and to permit persons to whom the | ||||
| # Software is furnished to do so, subject to the following conditions: | ||||
| #  | ||||
| # The above copyright notice and this permission notice shall be included in | ||||
| # all copies or substantial portions of the Software. | ||||
| #  | ||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | ||||
| # THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||||
| # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||||
| # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||||
| # OTHER DEALINGS IN THE SOFTWARE. | ||||
| #  | ||||
| # Except as contained in this notice, the name of the copyright holder(s) | ||||
| # and author(s) shall not be used in advertising or otherwise to promote | ||||
| # the sale, use or other dealings in this Software without prior written | ||||
| # authorization from the copyright holder(s) and author(s). | ||||
| #  | ||||
| # Author: David Dawes <dawes@XFree86.Org>. | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| # | ||||
| # This script takes PCI id information, compares it against an ordered list | ||||
| # of rules, and prints out the configuration information specified by the | ||||
| # last matching rule. | ||||
| # | ||||
| # This script is called by xf86AutoConfig(). | ||||
| # | ||||
| 
 | ||||
| # Command line processing. | ||||
| 
 | ||||
| $GetconfigVersion = v1.0; | ||||
| 
 | ||||
| $debug = 0; | ||||
| 
 | ||||
| $myname = $0; | ||||
| $myname =~ s/.*\///; | ||||
| 
 | ||||
| $signature = "Xorg Foundation getconfig rules file.  Version: "; | ||||
| 
 | ||||
| while (@ARGV[0] =~ /^-[A-Za-z]$/) { | ||||
|     $f = shift; | ||||
|     SWITCH: { | ||||
| 	if ($f eq "-D") { | ||||
| 	    $debug = 1; | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-I") { | ||||
| 	    push(@searchPaths, split(/,/, shift)); | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-V") { | ||||
| 	    printf STDERR "$myname: Version %vd.\n", $GetconfigVersion; | ||||
| 	    exit 0; | ||||
| 	} | ||||
| 	if ($f eq "-X") { | ||||
| 	    $XorgVersionNumeric = shift; | ||||
| 	    if (!defined($XorgVersionNumeric)) { | ||||
| 		print STDERR "$myname: -X requires the Xorg version.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	} | ||||
| 	if ($f eq "-b") { | ||||
| 	    $subsys = oct(shift); | ||||
| 	    if (!defined($subsys)) { | ||||
| 		print STDERR "$myname: -b requires the subsys id.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-c") { | ||||
| 	    $class = oct(shift); | ||||
| 	    if (!defined($class)) { | ||||
| 		print STDERR "$myname: -c requires the class value.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-d") { | ||||
| 	    $device = oct(shift); | ||||
| 	    if (!defined($device)) { | ||||
| 		print STDERR "$myname: -d requires the device id.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-r") { | ||||
| 	    $revision = oct(shift); | ||||
| 	    if (!defined($revision)) { | ||||
| 		print STDERR "$myname: -r requires the device revision.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-s") { | ||||
| 	    $subsysVendor = oct(shift); | ||||
| 	    if (!defined($subsysVendor)) { | ||||
| 		print STDERR "$myname: -s requires the subsysVendor id.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
| 	if ($f eq "-v") { | ||||
| 	    $vendor = oct(shift); | ||||
| 	    if (!defined($vendor)) { | ||||
| 		print STDERR "$myname: -v requires the vendor id.\n"; | ||||
| 		exit 1; | ||||
| 	    } | ||||
| 	    last SWITCH; | ||||
| 	} | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| printf STDERR "$myname: Version %vd.\n", $GetconfigVersion; | ||||
| 
 | ||||
| if (defined($XorgVersionNumeric)) { | ||||
|     $XorgVersionMajor = $XorgVersionNumeric / 10000000; | ||||
|     $XorgVersionMinor = ($XorgVersionNumeric % 10000000) / 100000; | ||||
|     $XorgVersionPatch = ($XorgVersionNumeric % 100000) / 1000; | ||||
|     $XorgVersionSnapshot = $XorgVersionNumeric % 1000; | ||||
|     $XorgVersion = chr($XorgVersionMajor) . chr($XorgVersionMinor) . | ||||
| 		chr($XorgVersionPatch) . chr($XorgVersionSnapshot); | ||||
| } | ||||
| 
 | ||||
| if ($debug) { | ||||
|     printf STDERR "$myname: Xorg Version: %d, %d.%d.%d.%d, %vd.\n", | ||||
| 	$XorgVersionNumeric, $XorgVersionMajor, $XorgVersionMinor, | ||||
| 	$XorgVersionPatch, $XorgVersionSnapshot, $XorgVersion; | ||||
| } else { | ||||
|     printf STDERR "$myname: Xorg Version: %vd.\n", $XorgVersion; | ||||
| } | ||||
|    | ||||
| 
 | ||||
| # The rules here are just basic vendor ID to driver mappings. | ||||
| # Ideally this is all that would be required.  More complicated configuration | ||||
| # rules will be provided in external files. | ||||
| 
 | ||||
| # XXX This set of basic rules isn't complete yet. | ||||
| 
 | ||||
| @rules = ( | ||||
| 
 | ||||
| # Set the weight for the built-in rules. | ||||
| ['$weight = 500'], | ||||
| 
 | ||||
| # APM | ||||
| ['$vendor == 0x1142', | ||||
| 	'apm'], | ||||
| 
 | ||||
| # ARK | ||||
| ['$vendor == 0xedd8', | ||||
| 	'apm'], | ||||
| 
 | ||||
| # AST | ||||
| ['$vendor == 0x1a03', | ||||
| 	'ast'], | ||||
| 
 | ||||
| # ATI | ||||
| ['$vendor == 0x1002', | ||||
| 	'ati'], | ||||
| 
 | ||||
| # Chips & Technologies | ||||
| ['$vendor == 0x102c', | ||||
| 	'chips'], | ||||
| 
 | ||||
| # Cirrus | ||||
| ['$vendor == 0x1013', | ||||
| 	'cirrus'], | ||||
| 
 | ||||
| # Intel | ||||
| ['$vendor == 0x8086', | ||||
| 	'i810'], | ||||
| ['$vendor == 0x8086 && ($chipType == 0x00d1 || $chipType == 0x7800)', | ||||
| 	'i740'], | ||||
| 
 | ||||
| # Matrox | ||||
| ['$vendor == 0x102b', | ||||
| 	'mga'], | ||||
| 
 | ||||
| # Neomagic | ||||
| ['$vendor == 0x10c8', | ||||
| 	'neomagic'], | ||||
| 
 | ||||
| # Number Nine | ||||
| ['$vendor == 0x105d', | ||||
| 	'i128'], | ||||
| 
 | ||||
| # NVIDIA | ||||
| ['$vendor == 0x10de || $vendor == 0x12d2', | ||||
| 	'nv'], | ||||
| 
 | ||||
| # S3 | ||||
| ['$vendor == 0x5333 && ($device == 0x88d0 ||' . | ||||
| 			'$device == 0x88d1 ||' . | ||||
| 			'$device == 0x88f0 ||' . | ||||
| 			'$device == 0x8811 ||' . | ||||
| 			'$device == 0x8812 ||' . | ||||
| 			'$device == 0x8814 ||' . | ||||
| 			'$device == 0x8901)', | ||||
| 	's3'], | ||||
| 
 | ||||
| # S3 virge | ||||
| ['$vendor == 0x5333 && ($device == 0x5631 ||' . | ||||
| 			'$device == 0x883d ||' . | ||||
| 			'$device == 0x8a01 ||' . | ||||
| 			'$device == 0x8a10 ||' . | ||||
| 			'$device == 0x8c01 ||' . | ||||
| 			'$device == 0x8c03 ||' . | ||||
| 			'$device == 0x8904 ||' . | ||||
| 			'$device == 0x8a13)', | ||||
| 	's3virge'], | ||||
| 
 | ||||
| # S3 Savage | ||||
| ['$vendor == 0x5333 && ($device >= 0x8a20 && $device <= 0x8a22 ||' . | ||||
| 			'$device == 0x9102 ||' . | ||||
| 			'$device >= 0x8c10 && $device <= 0x8c13 ||' . | ||||
| 			'$device == 0x8a25 ||' . | ||||
| 			'$device == 0x8a26 ||' . | ||||
| 			'$device >= 0x8d01 && $device <= 0x8d04 ||' . | ||||
| 			'$device >= 0x8c2a && $device <= 0x8c2f ||' . | ||||
| 			'$device == 0x8c22 ||' . | ||||
| 			'$device == 0x8c24 ||' . | ||||
| 			'$device == 0x8c26)', | ||||
| 	'savage'], | ||||
| 
 | ||||
| # SIS | ||||
| ['$vendor == 0x1039', | ||||
| 	'sis'], | ||||
| 
 | ||||
| # SMI | ||||
| ['$vendor == 0x126f', | ||||
| 	'siliconmotion'], | ||||
| 
 | ||||
| # 3Dfx | ||||
| ['$vendor == 0x121a', | ||||
| 	'tdfx'], | ||||
| 
 | ||||
| # 3Dlabs | ||||
| ['$vendor == 0x3d3d', | ||||
| 	'glint'], | ||||
| 
 | ||||
| # Trident | ||||
| ['$vendor == 0x1023', | ||||
| 	'trident'], | ||||
| 
 | ||||
| # Tseng Labs | ||||
| ['$vendor == 0x100c', | ||||
| 	'tseng'], | ||||
| 
 | ||||
| # VIA | ||||
| ['$vendor == 0x1106', | ||||
| 	'via'], | ||||
| 
 | ||||
| # VMware | ||||
| ['$vendor == 0x15ad', | ||||
| 	'vmware'], | ||||
| 
 | ||||
| ); | ||||
| 
 | ||||
| # Reverse the search path list, since the later rules have higher priority | ||||
| # than earlier ones (weighting being equal). | ||||
| 
 | ||||
| @searchPaths = reverse(@searchPaths); | ||||
| 
 | ||||
| if ($debug) { | ||||
|     $i = 0; | ||||
|     for $path (@searchPaths) { | ||||
| 	print STDERR "$myname: Search path $i is: \"$path\".\n"; | ||||
| 	$i++; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| print STDERR "$myname: ", $#rules + 1, " built-in rule", plural($#rules + 1), | ||||
| 			".\n"; | ||||
| 
 | ||||
| for $path (@searchPaths) { | ||||
|     while (<$path/*.cfg>) { | ||||
| 	@tmp = readRulesFile($_); | ||||
| 	if (defined(@tmp[0])) { | ||||
| 	    push @rules, @tmp; | ||||
| 	} | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| if ($debug) { | ||||
|     $i = 0; | ||||
|     for $r (@rules) { | ||||
| 	print STDERR "$myname: rule $i is: \'@$r\'.\n"; | ||||
| 	$i++ | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| $i = 0; | ||||
| $e = 0; | ||||
| $weight = 0; | ||||
| $w = 0; | ||||
| for $r (@rules) { | ||||
|     ($cond, $d, @o) = @$r; | ||||
|     $result = eval $cond; | ||||
|     if ($@) { | ||||
| 	print STDERR "$myname: Error evaluating rule $i \'$cond\': $@"; | ||||
| 	$e++; | ||||
|     } | ||||
|     if ($debug) { | ||||
| 	print STDERR "$myname: rule $i \'$cond\' evaluates to \'$result\'.\n"; | ||||
|     } | ||||
|     if ($result && defined($d) && $weight >= $w) { | ||||
| 	$driver = $d; | ||||
| 	@opts = @o; | ||||
| 	$w = $weight; | ||||
|     } | ||||
|     $i++; | ||||
| } | ||||
| 
 | ||||
| print STDERR "$myname: Evaluated $i rule", plural($i), | ||||
| 		" with $e error", plural($e), ".\n"; | ||||
| 
 | ||||
| print STDERR "$myname: Weight of result is $w.\n"; | ||||
| 
 | ||||
| if ($debug) { | ||||
|     if (defined($driver)) { | ||||
| 	print STDERR "$myname: Driver is \'$driver\'.\n"; | ||||
|     } else { | ||||
| 	print STDERR "$myname: No driver.\n"; | ||||
|     } | ||||
|     if (defined(@opts)) { | ||||
| 	print STDERR "$myname: options are:\n"; | ||||
| 	for $opt (@opts) { | ||||
| 	    print STDERR "\t$opt\n"; | ||||
| 	} | ||||
|     } else { | ||||
| 	print STDERR "$myname: No options.\n"; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| print "$driver\n"; | ||||
| for $opt (@opts) { | ||||
|     print "$opt\n"; | ||||
| } | ||||
| 
 | ||||
| exit 0; | ||||
| 
 | ||||
| # Subroutines. | ||||
| 
 | ||||
| sub readRulesFile { | ||||
|     my ($file) = @_; | ||||
|     my $signatureOK = 0; | ||||
|     my @r, @tmp; | ||||
|     my $line, $cont, $prevcont, $fileversion; | ||||
| 
 | ||||
|     undef @tmp; | ||||
|     undef @r; | ||||
| 
 | ||||
|     if (open(RF, "<$file")) { | ||||
| 	$prevcont = 0; | ||||
| 	while (<RF>) { | ||||
| 	    chop; | ||||
| 	    $line = $_; | ||||
| 	    next if ($line =~ /^#/); | ||||
| 	    next if ($line =~ /^\s*$/); | ||||
| 	    if (!$signatureOK) { | ||||
| 		if ($line  =~ /^$signature(.*)$/) { | ||||
| 		    $fileversion = $1; | ||||
| 		    $signatureOK = 1; | ||||
| 		    print STDERR | ||||
| 			"$myname: rules file \'$file\' has version $fileversion.\n"; | ||||
| 		    next; | ||||
| 		} | ||||
| 	    } | ||||
| 	    if (!$signatureOK) { | ||||
| 		print STDERR "$myname: file \'$file\' has bad signature.\n"; | ||||
| 		close(RF); | ||||
| 		last; | ||||
| 	    } | ||||
| 	    $cont = 0; | ||||
| 	    if ($line =~ s/\\\s*$//) { | ||||
| 		$cont = 1; | ||||
| 	    } | ||||
| 	    if (!$prevcont && $line =~ /^\S+/) { | ||||
| 		if (defined(@tmp[0])) { | ||||
| 		    push(@r,[@tmp]); | ||||
| 		} | ||||
| 		undef @tmp; | ||||
| 	    } | ||||
| 	    if ($prevcont) { | ||||
| 		push(@tmp, pop(@tmp) . $line); | ||||
| 	    } else { | ||||
| 		push(@tmp, $line); | ||||
| 	    } | ||||
| 	    $prevcont = $cont; | ||||
| 	} | ||||
| 	if (defined(@tmp[0])) { | ||||
| 	    push(@r,[@tmp]); | ||||
| 	} | ||||
| 	if (!defined(@r[0])) { | ||||
| 	    print STDERR "$myname: no rules in file \'$file\'.\n"; | ||||
| 	} else { | ||||
| 	    print STDERR "$myname: ", $#r + 1, | ||||
| 			" rule", plural($#r + 1), | ||||
| 			" added from file \'$file\'.\n"; | ||||
| 	} | ||||
|     } else { | ||||
| 	print STDERR "$myname: cannot open file \'$file\'.\n"; | ||||
|     } | ||||
| 
 | ||||
|     return @r; | ||||
| } | ||||
| 
 | ||||
| sub plural { | ||||
|     my ($count) = @_; | ||||
| 
 | ||||
|     if ($count != 1) { | ||||
| 	return "s"; | ||||
|     } else { | ||||
| 	return ""; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -1,50 +0,0 @@ | |||
| # $XdotOrg: xc/programs/Xserver/hw/xfree86/getconfig/xorg.cfg,v 1.2 2004/04/23 19:54:01 eich Exp $ | ||||
| 
 | ||||
| # Base Xorg getconfig rules file. | ||||
| 
 | ||||
| # | ||||
| # The line below is the getconfig rules file signature, and must be the | ||||
| # first non-blank, non-comment line. | ||||
| # | ||||
| 
 | ||||
| Xorg Foundation getconfig rules file.  Version: 1.0 | ||||
| 
 | ||||
| # | ||||
| # Set the weight for the following rules.  This should be set, otherwise | ||||
| # the previously set weight will get used, and you have no idea of knowing | ||||
| # what that might be. | ||||
| # | ||||
| 
 | ||||
| $weight = 1000 | ||||
| 
 | ||||
| # | ||||
| # Rules.  Rules consist of a condition (in perl code) followed by | ||||
| # a driver name and optionally some additional strings.  The start of a | ||||
| # rule is indicated by a line with no leading white space.  subsequent | ||||
| # lines making up a rule must be indented.  Logical lines may be split | ||||
| # over multiple physical lines by using the usual continuation '\'. | ||||
| # | ||||
| # Rules that are not followed by a driver name may be used to do other | ||||
| # things, like setting the weight as above. | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Pre-defined variables include: | ||||
| # | ||||
| #   $vendor		PCI vendor ID | ||||
| #   $device		PCI device ID | ||||
| #   $revision		PCI revision ID | ||||
| #   $subsys		PCI subsystem ID | ||||
| #   $subsysVendor	PCI subsystem vendor ID | ||||
| #   $class		PCI class | ||||
| #   $XorgVersion	Xorg version, as a 'v' string. | ||||
| # | ||||
| # The Xorg version information is also available as the following: | ||||
| # | ||||
| #   $XorgVersionNumeric | ||||
| #   $XorgVersionMajor | ||||
| #   $XorgVersionMinor | ||||
| #   $XorgVersionPatch | ||||
| #   $XorgVersionSnap | ||||
| #    | ||||
| 
 | ||||
|  | @ -92,7 +92,6 @@ extern unsigned long LoaderOptions; | |||
| 
 | ||||
| /* Internal Functions */ | ||||
| void LoaderDuplicateSymbol(const char *, const int); | ||||
| int _LoaderHandleUnresolved(char *, char *); | ||||
| char *_LoaderModuleToName(int); | ||||
| int LoaderOpen(const char *, const char *, int, int *, int *, int *, int); | ||||
| int LoaderHandleOpen(int); | ||||
|  |  | |||
|  | @ -103,8 +103,6 @@ ModuleDescPtr AddSibling(ModuleDescPtr head, ModuleDescPtr new); | |||
| void LoaderSetPath(const char *path); | ||||
| void LoaderSortExtensions(void); | ||||
| 
 | ||||
| void LoaderShowStack(void); | ||||
| void *LoaderSymbolHandle(const char *, int); | ||||
| int LoaderUnload(int); | ||||
| unsigned long LoaderGetModuleVersion(ModuleDescPtr mod); | ||||
| 
 | ||||
|  |  | |||
|  | @ -367,6 +367,9 @@ _X_HIDDEN void *xfree86LookupTab[] = { | |||
|     SYMFUNC(xf86AllocateEntityPrivateIndex) | ||||
|     SYMFUNC(xf86GetEntityPrivate) | ||||
| 
 | ||||
|     /* xf86cvt.c */ | ||||
|     SYMFUNC(xf86CVTMode) | ||||
| 
 | ||||
|     /* xf86Configure.c */ | ||||
|     SYMFUNC(xf86AddDeviceToConfigure) | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,9 +31,10 @@ bin_PROGRAMS = cvt | |||
| INCLUDES = $(XORG_INCS) | ||||
| DUMMYLIB_SRCDIR = $(XFREE86_SRCDIR)/dummylib | ||||
| 
 | ||||
| cvt_SOURCES = cvt.c | ||||
| # gah
 | ||||
| cvt_SOURCES = cvt.c $(top_srcdir)/hw/xfree86/common/xf86cvt.c | ||||
| cvt_CFLAGS = $(XORG_CFLAGS) | ||||
| cvt_LDADD = ../../dummylib/libdummy-nonserver.a | ||||
| cvt_LDADD = $(top_builddir)/hw/xfree86/dummylib/libdummy-nonserver.a | ||||
| 
 | ||||
| man1_MANS = cvt.man | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,269 +25,6 @@ | |||
| 
 | ||||
| #include "xf86.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Generate a CVT standard mode from HDisplay, VDisplay and VRefresh. | ||||
|  * | ||||
|  * These calculations are stolen from the CVT calculation spreadsheet written | ||||
|  * by Graham Loveridge. He seems to be claiming no copyright and there seems to | ||||
|  * be no license attached to this. He apparently just wants to see his name | ||||
|  * mentioned. | ||||
|  * | ||||
|  * This file can be found at http://www.vesa.org/Public/CVT/CVTd6r1.xls
 | ||||
|  * | ||||
|  * Comments and structure corresponds to the comments and structure of the xls. | ||||
|  * This should ease importing of future changes to the standard (not very | ||||
|  * likely though). | ||||
|  * | ||||
|  * About margins; i'm sure that they are to be the bit between HDisplay and | ||||
|  * HBlankStart, HBlankEnd and HTotal, VDisplay and VBlankStart, VBlankEnd and  | ||||
|  * VTotal, where the overscan colour is shown. FB seems to call _all_ blanking | ||||
|  * outside sync "margin" for some reason. Since we prefer seeing proper | ||||
|  * blanking instead of the overscan colour, and since the Crtc* values will | ||||
|  * probably get altered after us, we will disable margins altogether. With | ||||
|  * these calculations, Margins will plainly expand H/VDisplay, and we don't | ||||
|  * want that. -- libv | ||||
|  * | ||||
|  */ | ||||
| static DisplayModePtr | ||||
| xf86CVTMode(int HDisplay, int VDisplay, float VRefresh, Bool Reduced, | ||||
|             Bool Interlaced) | ||||
| { | ||||
|     DisplayModeRec  *Mode = xnfalloc(sizeof(DisplayModeRec)); | ||||
| 
 | ||||
|     /* 1) top/bottom margin size (% of height) - default: 1.8 */ | ||||
| #define CVT_MARGIN_PERCENTAGE 1.8     | ||||
| 
 | ||||
|     /* 2) character cell horizontal granularity (pixels) - default 8 */ | ||||
| #define CVT_H_GRANULARITY 8 | ||||
| 
 | ||||
|     /* 4) Minimum vertical porch (lines) - default 3 */ | ||||
| #define CVT_MIN_V_PORCH 3 | ||||
| 
 | ||||
|     /* 4) Minimum number of vertical back porch lines - default 6 */ | ||||
| #define CVT_MIN_V_BPORCH 6 | ||||
| 
 | ||||
|     /* Pixel Clock step (kHz) */ | ||||
| #define CVT_CLOCK_STEP 250 | ||||
| 
 | ||||
|     Bool Margins = FALSE; | ||||
|     float  VFieldRate, HPeriod; | ||||
|     int  HDisplayRnd, HMargin; | ||||
|     int  VDisplayRnd, VMargin, VSync; | ||||
|     float  Interlace; /* Please rename this */ | ||||
| 
 | ||||
|     memset(Mode, 0, sizeof(DisplayModeRec)); | ||||
| 
 | ||||
|     /* CVT default is 60.0Hz */ | ||||
|     if (!VRefresh) | ||||
|         VRefresh = 60.0; | ||||
| 
 | ||||
|     /* 1. Required field rate */ | ||||
|     if (Interlaced) | ||||
|         VFieldRate = VRefresh * 2; | ||||
|     else | ||||
|         VFieldRate = VRefresh; | ||||
| 
 | ||||
|     /* 2. Horizontal pixels */ | ||||
|     HDisplayRnd = HDisplay - (HDisplay % CVT_H_GRANULARITY); | ||||
| 
 | ||||
|     /* 3. Determine left and right borders */ | ||||
|     if (Margins) { | ||||
|         /* right margin is actually exactly the same as left */ | ||||
|         HMargin = (((float) HDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); | ||||
|         HMargin -= HMargin % CVT_H_GRANULARITY; | ||||
|     } else | ||||
|         HMargin = 0; | ||||
| 
 | ||||
|     /* 4. Find total active pixels */ | ||||
|     Mode->HDisplay = HDisplayRnd + 2*HMargin; | ||||
| 
 | ||||
|     /* 5. Find number of lines per field */ | ||||
|     if (Interlaced) | ||||
|         VDisplayRnd = VDisplay / 2; | ||||
|     else | ||||
|         VDisplayRnd = VDisplay; | ||||
| 
 | ||||
|     /* 6. Find top and bottom margins */ | ||||
|     /* nope. */ | ||||
|     if (Margins) | ||||
|         /* top and bottom margins are equal again. */ | ||||
|         VMargin = (((float) VDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); | ||||
|     else | ||||
|         VMargin = 0; | ||||
| 
 | ||||
|     Mode->VDisplay = VDisplay + 2*VMargin; | ||||
| 
 | ||||
|     /* 7. Interlace */ | ||||
|     if (Interlaced) | ||||
|         Interlace = 0.5; | ||||
|     else | ||||
|         Interlace = 0.0; | ||||
| 
 | ||||
|     /* Determine VSync Width from aspect ratio */ | ||||
|     if (!(VDisplay % 3) && ((VDisplay * 4 / 3) == HDisplay)) | ||||
|         VSync = 4; | ||||
|     else if (!(VDisplay % 9) && ((VDisplay * 16 / 9) == HDisplay)) | ||||
|         VSync = 5; | ||||
|     else if (!(VDisplay % 10) && ((VDisplay * 16 / 10) == HDisplay)) | ||||
|         VSync = 6; | ||||
|     else if (!(VDisplay % 4) && ((VDisplay * 5 / 4) == HDisplay)) | ||||
|         VSync = 7; | ||||
|     else if (!(VDisplay % 9) && ((VDisplay * 15 / 9) == HDisplay)) | ||||
|         VSync = 7; | ||||
|     else /* Custom */ | ||||
|         VSync = 10; | ||||
| 
 | ||||
|     if (!Reduced) { /* simplified GTF calculation */ | ||||
| 
 | ||||
|         /* 4) Minimum time of vertical sync + back porch interval (µs) 
 | ||||
|          * default 550.0 */ | ||||
| #define CVT_MIN_VSYNC_BP 550.0 | ||||
| 
 | ||||
|         /* 3) Nominal HSync width (% of line period) - default 8 */ | ||||
| #define CVT_HSYNC_PERCENTAGE 8 | ||||
| 
 | ||||
|         float  HBlankPercentage; | ||||
|         int  VSyncAndBackPorch, VBackPorch; | ||||
|         int  HBlank; | ||||
| 
 | ||||
|         /* 8. Estimated Horizontal period */ | ||||
|         HPeriod = ((float) (1000000.0 / VFieldRate - CVT_MIN_VSYNC_BP)) /  | ||||
|             (VDisplayRnd + 2 * VMargin + CVT_MIN_V_PORCH + Interlace); | ||||
| 
 | ||||
|         /* 9. Find number of lines in sync + backporch */ | ||||
|         if (((int)(CVT_MIN_VSYNC_BP / HPeriod) + 1) < (VSync + CVT_MIN_V_PORCH)) | ||||
|             VSyncAndBackPorch = VSync + CVT_MIN_V_PORCH; | ||||
|         else | ||||
|             VSyncAndBackPorch = (int)(CVT_MIN_VSYNC_BP / HPeriod) + 1; | ||||
| 
 | ||||
|         /* 10. Find number of lines in back porch */ | ||||
|         VBackPorch = VSyncAndBackPorch - VSync; | ||||
| 
 | ||||
|         /* 11. Find total number of lines in vertical field */ | ||||
|         Mode->VTotal = VDisplayRnd + 2 * VMargin + VSyncAndBackPorch + Interlace | ||||
|             + CVT_MIN_V_PORCH; | ||||
| 
 | ||||
|         /* 5) Definition of Horizontal blanking time limitation */ | ||||
|         /* Gradient (%/kHz) - default 600 */ | ||||
| #define CVT_M_FACTOR 600 | ||||
| 
 | ||||
|         /* Offset (%) - default 40 */ | ||||
| #define CVT_C_FACTOR 40 | ||||
| 
 | ||||
|         /* Blanking time scaling factor - default 128 */ | ||||
| #define CVT_K_FACTOR 128 | ||||
| 
 | ||||
|         /* Scaling factor weighting - default 20 */ | ||||
| #define CVT_J_FACTOR 20 | ||||
| 
 | ||||
| #define CVT_M_PRIME CVT_M_FACTOR * CVT_K_FACTOR / 256 | ||||
| #define CVT_C_PRIME (CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ | ||||
|         CVT_J_FACTOR | ||||
| 
 | ||||
|         /* 12. Find ideal blanking duty cycle from formula */ | ||||
|         HBlankPercentage = CVT_C_PRIME - CVT_M_PRIME * HPeriod/1000.0; | ||||
| 
 | ||||
|         /* 13. Blanking time */ | ||||
|         if (HBlankPercentage < 20) | ||||
|             HBlankPercentage = 20; | ||||
| 
 | ||||
|         HBlank = Mode->HDisplay * HBlankPercentage/(100.0 - HBlankPercentage); | ||||
|         HBlank -= HBlank % (2*CVT_H_GRANULARITY); | ||||
|          | ||||
|         /* 14. Find total number of pixels in a line. */ | ||||
|         Mode->HTotal = Mode->HDisplay + HBlank; | ||||
| 
 | ||||
|         /* Fill in HSync values */ | ||||
|         Mode->HSyncEnd = Mode->HDisplay + HBlank / 2; | ||||
| 
 | ||||
|         Mode->HSyncStart = Mode->HSyncEnd -  | ||||
|             (Mode->HTotal * CVT_HSYNC_PERCENTAGE) / 100; | ||||
|         Mode->HSyncStart += CVT_H_GRANULARITY -  | ||||
|             Mode->HSyncStart % CVT_H_GRANULARITY; | ||||
| 
 | ||||
|         /* Fill in VSync values */ | ||||
|         Mode->VSyncStart = Mode->VDisplay + CVT_MIN_V_PORCH; | ||||
|         Mode->VSyncEnd = Mode->VSyncStart + VSync; | ||||
| 
 | ||||
|     } else { /* Reduced blanking */ | ||||
|         /* Minimum vertical blanking interval time (µs) - default 460 */ | ||||
| #define CVT_RB_MIN_VBLANK 460.0 | ||||
| 
 | ||||
|         /* Fixed number of clocks for horizontal sync */ | ||||
| #define CVT_RB_H_SYNC 32.0 | ||||
| 
 | ||||
|         /* Fixed number of clocks for horizontal blanking */ | ||||
| #define CVT_RB_H_BLANK 160.0 | ||||
| 
 | ||||
|         /* Fixed number of lines for vertical front porch - default 3 */ | ||||
| #define CVT_RB_VFPORCH 3 | ||||
| 
 | ||||
|         int  VBILines; | ||||
| 
 | ||||
|         /* 8. Estimate Horizontal period. */ | ||||
|         HPeriod = ((float) (1000000.0 / VFieldRate - CVT_RB_MIN_VBLANK)) /  | ||||
|             (VDisplayRnd + 2*VMargin); | ||||
| 
 | ||||
|         /* 9. Find number of lines in vertical blanking */ | ||||
|         VBILines = ((float) CVT_RB_MIN_VBLANK) / HPeriod + 1; | ||||
| 
 | ||||
|         /* 10. Check if vertical blanking is sufficient */ | ||||
|         if (VBILines < (CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH)) | ||||
|             VBILines = CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH; | ||||
|          | ||||
|         /* 11. Find total number of lines in vertical field */ | ||||
|         Mode->VTotal = VDisplayRnd + 2 * VMargin + Interlace + VBILines; | ||||
| 
 | ||||
|         /* 12. Find total number of pixels in a line */ | ||||
|         Mode->HTotal = Mode->HDisplay + CVT_RB_H_BLANK; | ||||
| 
 | ||||
|         /* Fill in HSync values */ | ||||
|         Mode->HSyncEnd = Mode->HDisplay + CVT_RB_H_BLANK / 2; | ||||
|         Mode->HSyncStart = Mode->HSyncEnd - CVT_RB_H_SYNC; | ||||
| 
 | ||||
|         /* Fill in VSync values */ | ||||
|         Mode->VSyncStart = Mode->VDisplay + CVT_RB_VFPORCH; | ||||
|         Mode->VSyncEnd = Mode->VSyncStart + VSync; | ||||
|     } | ||||
| 
 | ||||
|     /* 15/13. Find pixel clock frequency (kHz for xf86) */ | ||||
|     Mode->Clock = Mode->HTotal * 1000.0 / HPeriod; | ||||
|     Mode->Clock -= Mode->Clock % CVT_CLOCK_STEP; | ||||
| 
 | ||||
|     /* 16/14. Find actual Horizontal Frequency (kHz) */ | ||||
|     Mode->HSync = ((float) Mode->Clock) / ((float) Mode->HTotal); | ||||
| 
 | ||||
|     /* 17/15. Find actual Field rate */ | ||||
|     Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /  | ||||
|         ((float) (Mode->HTotal * Mode->VTotal)); | ||||
| 
 | ||||
|     /* 18/16. Find actual vertical frame frequency */ | ||||
|     /* ignore - just set the mode flag for interlaced */ | ||||
|     if (Interlaced) | ||||
|         Mode->VTotal *= 2; | ||||
| 
 | ||||
|     { | ||||
|         char  Name[256]; | ||||
|         Name[0] = 0; | ||||
| 
 | ||||
|         snprintf(Name, 256, "%dx%d", HDisplay, VDisplay); | ||||
| 
 | ||||
|         Mode->name = xnfalloc(strlen(Name) + 1); | ||||
|         memcpy(Mode->name, Name, strlen(Name) + 1); | ||||
|     } | ||||
| 
 | ||||
|     if (Reduced) | ||||
|         Mode->Flags |= V_PHSYNC | V_NVSYNC; | ||||
|     else | ||||
|         Mode->Flags |= V_NHSYNC | V_PVSYNC; | ||||
| 
 | ||||
|     if (Interlaced) | ||||
|         Mode->Flags |= V_INTERLACE; | ||||
| 
 | ||||
|     return Mode; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Quickly check wether this is a CVT standard mode. | ||||
|  */ | ||||
|  |  | |||
|  | @ -30,8 +30,10 @@ DIX_SRCS = \ | |||
| XKBFILE_SRCS = \
 | ||||
|         maprules.c \
 | ||||
|         xkmread.c \
 | ||||
|         xkbtext.c \
 | ||||
|         xkbfmisc.c \
 | ||||
|         xkberrs.c | ||||
|         xkberrs.c \
 | ||||
|         xkbout.c | ||||
| 
 | ||||
| X11_SRCS = \
 | ||||
|         XKBMisc.c \
 | ||||
|  |  | |||
							
								
								
									
										429
									
								
								xkb/xkbfmisc.c
								
								
								
								
							
							
						
						
									
										429
									
								
								xkb/xkbfmisc.c
								
								
								
								
							|  | @ -48,16 +48,185 @@ | |||
| #include <X11/extensions/XKBgeom.h> | ||||
| #include "xkb.h" | ||||
| 
 | ||||
| unsigned | ||||
| _XkbKSCheckCase(KeySym ks) | ||||
| { | ||||
| unsigned	set,rtrn; | ||||
| 
 | ||||
|     set= (ks & (~0xff)) >> 8; | ||||
|     rtrn= 0; | ||||
|     switch (set) { | ||||
| 	case 0:		/* latin 1 */ | ||||
| 	    if (((ks>=XK_A)&&(ks<=XK_Z))|| | ||||
| 		((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_a)&&(ks<=XK_z))|| | ||||
| 		((ks>=XK_agrave)&&(ks<=XK_ydiaeresis))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 1:		/* latin 2 */ | ||||
| 	    if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))|| | ||||
| 		((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_caron))|| | ||||
| 		((ks>=XK_racute)&&(ks<=XK_tcedilla))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 2:		/* latin 3 */ | ||||
| 	    if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))|| | ||||
| 		((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))|| | ||||
| 		((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 3:		/* latin 4 */ | ||||
| 	    if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))|| | ||||
| 	        (ks==XK_ENG)|| | ||||
| 		((ks>=XK_Amacron)&&(ks<=XK_Umacron))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_rcedilla)&&(ks<=XK_tslash))|| | ||||
| 	        (ks==XK_eng)|| | ||||
| 		((ks>=XK_amacron)&&(ks<=XK_umacron))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 18:		/* latin 8 */ | ||||
| 	    if ((ks==XK_Babovedot)|| | ||||
|                 ((ks>=XK_Dabovedot)&&(ks<=XK_Wacute))|| | ||||
| 		((ks>=XK_Ygrave)&&(ks<=XK_Fabovedot))|| | ||||
| 	        (ks==XK_Mabovedot)|| | ||||
| 	        (ks==XK_Pabovedot)|| | ||||
| 	        (ks==XK_Sabovedot)|| | ||||
| 	        (ks==XK_Wdiaeresis)|| | ||||
| 		((ks>=XK_Wcircumflex)&&(ks<=XK_Ycircumflex))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if ((ks==XK_babovedot)|| | ||||
| 	        (ks==XK_dabovedot)|| | ||||
| 	        (ks==XK_fabovedot)|| | ||||
| 	        (ks==XK_mabovedot)|| | ||||
|                 ((ks>=XK_wgrave)&&(ks<=XK_wacute))|| | ||||
| 	        (ks==XK_ygrave)|| | ||||
| 		((ks>=XK_wdiaeresis)&&(ks<=XK_ycircumflex))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 19:		/* latin 9 */ | ||||
| 	    if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (ks==XK_oe) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
|     } | ||||
|     return rtrn; | ||||
| } | ||||
| 
 | ||||
| /***===================================================================***/ | ||||
| 
 | ||||
| Bool | ||||
| XkbLookupGroupAndLevel(	XkbDescPtr 	xkb, | ||||
| 			int 		key, | ||||
| 			int *		mods_inout, | ||||
| 			int *		grp_inout, | ||||
| 			int *		lvl_rtrn) | ||||
| { | ||||
| int		nG,eG; | ||||
| 
 | ||||
|     if ((!xkb)||(!XkbKeycodeInRange(xkb,key))||(!grp_inout)) | ||||
| 	return False; | ||||
| 
 | ||||
|     nG= XkbKeyNumGroups(xkb,key); | ||||
|     eG= *grp_inout; | ||||
| 
 | ||||
|     if ( nG==0 ) { | ||||
| 	*grp_inout= 0; | ||||
| 	if (lvl_rtrn!=NULL) | ||||
| 	    *lvl_rtrn= 0; | ||||
| 	return False; | ||||
|     } | ||||
|     else if ( nG==1 ) { | ||||
| 	eG= 0; | ||||
|     } | ||||
|     else if ( eG>=nG ) { | ||||
| 	unsigned gI= XkbKeyGroupInfo(xkb,key); | ||||
| 	switch (XkbOutOfRangeGroupAction(gI)) { | ||||
| 	    default: | ||||
| 		eG %= nG; | ||||
| 		break; | ||||
| 	    case XkbClampIntoRange: | ||||
| 		eG = nG-1; | ||||
| 		break; | ||||
| 	    case XkbRedirectIntoRange: | ||||
| 		eG = XkbOutOfRangeGroupNumber(gI); | ||||
| 		if (eG>=nG) | ||||
| 		    eG= 0; | ||||
| 		break; | ||||
| 	} | ||||
|     } | ||||
|     *grp_inout= eG; | ||||
|     if (mods_inout!=NULL) { | ||||
| 	XkbKeyTypePtr	type; | ||||
| 	int		preserve; | ||||
| 
 | ||||
| 	type = XkbKeyKeyType(xkb,key,eG); | ||||
| 	if (lvl_rtrn!=NULL) | ||||
| 	    *lvl_rtrn= 0; | ||||
| 	preserve= 0; | ||||
| 	if (type->map) { /* find the shift level */ | ||||
| 	    register int i; | ||||
| 	    register XkbKTMapEntryPtr entry; | ||||
| 	    for (i=0,entry=type->map;i<type->map_count;i++,entry++) { | ||||
| 		if ((entry->active)&& | ||||
| 			(((*mods_inout)&type->mods.mask)==entry->mods.mask)){ | ||||
| 		    if (lvl_rtrn!=NULL) | ||||
| 			*lvl_rtrn= entry->level; | ||||
| 		    if (type->preserve) | ||||
| 			preserve= type->preserve[i].mask; | ||||
| 		    break; | ||||
| 		} | ||||
| 	    } | ||||
| 	} | ||||
| 	(*mods_inout)&= ~(type->mods.mask&(~preserve)); | ||||
|     } | ||||
|     return True; | ||||
| } | ||||
| 
 | ||||
| /***===================================================================***/ | ||||
| 
 | ||||
| static Bool | ||||
| XkbWriteSectionFromName(FILE *file,char *sectionName,char *name) | ||||
| { | ||||
|     fprintf(file,"    xkb_%-20s { include \"%s\" };\n",sectionName,name); | ||||
|     ErrorF("    xkb_%-20s { include \"%s\" };\n",sectionName,name); | ||||
|     return True; | ||||
| } | ||||
| 
 | ||||
| #define	NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%'))) | ||||
| #define	COMPLETE(n)  ((n)&&(!NEED_DESC(n))) | ||||
| 
 | ||||
| /* ARGSUSED */ | ||||
| static void | ||||
| _AddIncl(	FILE *		file, | ||||
| 		XkbFileInfo *	result, | ||||
| 		Bool 		topLevel, | ||||
| 		Bool 		showImplicit, | ||||
| 		int 		index, | ||||
| 		void *		priv) | ||||
| { | ||||
|     if ((priv)&&(strcmp((char *)priv,"%")!=0)) | ||||
| 	fprintf(file,"    include \"%s\"\n",(char *)priv); | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
| Bool | ||||
| XkbWriteXKBKeymapForNames(	FILE *			file, | ||||
| 				XkbComponentNamesPtr	names, | ||||
|  | @ -66,29 +235,229 @@ XkbWriteXKBKeymapForNames(	FILE *			file, | |||
| 				unsigned		want, | ||||
| 				unsigned		need) | ||||
| { | ||||
|     if (!names || (!names->keycodes && !names->types && !names->compat && | ||||
|                    !names->symbols && !names->geometry)) | ||||
| char *		name,*tmp; | ||||
| unsigned	complete; | ||||
| XkbNamesPtr	old_names; | ||||
| int		multi_section; | ||||
| unsigned	wantNames,wantConfig,wantDflts; | ||||
| XkbFileInfo	finfo; | ||||
| 
 | ||||
|     bzero(&finfo,sizeof(XkbFileInfo)); | ||||
| 
 | ||||
|     complete= 0; | ||||
|     if ((name=names->keymap)==NULL)	name= "default"; | ||||
|     if (COMPLETE(names->keycodes))	complete|= XkmKeyNamesMask; | ||||
|     if (COMPLETE(names->types))		complete|= XkmTypesMask; | ||||
|     if (COMPLETE(names->compat))	complete|= XkmCompatMapMask; | ||||
|     if (COMPLETE(names->symbols))	complete|= XkmSymbolsMask; | ||||
|     if (COMPLETE(names->geometry))	complete|= XkmGeometryMask; | ||||
|     want|= (complete|need); | ||||
|     if (want&XkmSymbolsMask) | ||||
| 	want|= XkmKeyNamesMask|XkmTypesMask; | ||||
| 
 | ||||
|     if (want==0) | ||||
| 	return False; | ||||
| 
 | ||||
|     fprintf(file, "xkb_keymap \"%s\" {\n", names->keymap ? names->keymap : | ||||
|                                                            "default"); | ||||
|     if (xkb!=NULL) { | ||||
| 	 old_names= xkb->names; | ||||
| 	 finfo.type= 0; | ||||
| 	 finfo.defined= 0; | ||||
| 	 finfo.xkb= xkb; | ||||
| 	 if (!XkbDetermineFileType(&finfo,XkbXKBFile,NULL)) | ||||
| 	    return False; | ||||
|     } | ||||
|     else old_names= NULL; | ||||
| 
 | ||||
|     if (names->keycodes) | ||||
| 	XkbWriteSectionFromName(file, "keycodes", names->keycodes); | ||||
|     if (names->types) | ||||
| 	XkbWriteSectionFromName(file, "types", names->types); | ||||
|     if (names->compat) | ||||
| 	XkbWriteSectionFromName(file, "compatibility", names->compat); | ||||
|     if (names->symbols) | ||||
| 	XkbWriteSectionFromName(file, "symbols", names->symbols); | ||||
|     if (names->geometry) | ||||
| 	XkbWriteSectionFromName(file, "geometry", names->geometry); | ||||
|     wantConfig= want&(~complete); | ||||
|     if (xkb!=NULL) { | ||||
| 	if (wantConfig&XkmTypesMask) { | ||||
| 	    if ((!xkb->map) || (xkb->map->num_types<XkbNumRequiredTypes)) | ||||
| 		wantConfig&= ~XkmTypesMask; | ||||
| 	} | ||||
| 	if (wantConfig&XkmCompatMapMask) { | ||||
| 	    if ((!xkb->compat) || (xkb->compat->num_si<1)) | ||||
| 		wantConfig&= ~XkmCompatMapMask; | ||||
| 	} | ||||
| 	if (wantConfig&XkmSymbolsMask) { | ||||
| 	    if ((!xkb->map) || (!xkb->map->key_sym_map)) | ||||
| 		wantConfig&= ~XkmSymbolsMask; | ||||
| 	} | ||||
| 	if (wantConfig&XkmIndicatorsMask) { | ||||
| 	    if (!xkb->indicators) | ||||
| 		wantConfig&= ~XkmIndicatorsMask; | ||||
| 	} | ||||
| 	if (wantConfig&XkmKeyNamesMask) { | ||||
| 	    if ((!xkb->names)||(!xkb->names->keys)) | ||||
| 		wantConfig&= ~XkmKeyNamesMask; | ||||
| 	} | ||||
| 	if ((wantConfig&XkmGeometryMask)&&(!xkb->geom)) | ||||
| 	    wantConfig&= ~XkmGeometryMask; | ||||
|     } | ||||
|     else { | ||||
| 	wantConfig= 0; | ||||
|     } | ||||
|     complete|= wantConfig; | ||||
| 
 | ||||
|     wantDflts= 0; | ||||
|     wantNames= want&(~complete); | ||||
|     if ((xkb!=NULL) && (old_names!=NULL)) { | ||||
| 	if (wantNames&XkmTypesMask) { | ||||
| 	    if (old_names->types!=None) { | ||||
| 		tmp= XkbAtomGetString(dpy,old_names->types); | ||||
| 		names->types= _XkbDupString(tmp); | ||||
| 	    } | ||||
| 	    else { | ||||
| 		wantDflts|= XkmTypesMask; | ||||
| 	    } | ||||
| 	    complete|= XkmTypesMask;  | ||||
| 	} | ||||
| 	if (wantNames&XkmCompatMapMask) { | ||||
| 	    if (old_names->compat!=None) { | ||||
| 		tmp= XkbAtomGetString(dpy,old_names->compat); | ||||
| 		names->compat= _XkbDupString(tmp); | ||||
| 	    } | ||||
| 	    else wantDflts|= XkmCompatMapMask; | ||||
| 	    complete|= XkmCompatMapMask;  | ||||
| 	} | ||||
| 	if (wantNames&XkmSymbolsMask) { | ||||
| 	    if (old_names->symbols==None) | ||||
| 		return False; | ||||
| 	    tmp= XkbAtomGetString(dpy,old_names->symbols); | ||||
| 	    names->symbols= _XkbDupString(tmp); | ||||
| 	    complete|= XkmSymbolsMask;  | ||||
| 	} | ||||
| 	if (wantNames&XkmKeyNamesMask) { | ||||
| 	   if (old_names->keycodes!=None) { | ||||
| 		tmp= XkbAtomGetString(dpy,old_names->keycodes); | ||||
| 		names->keycodes= _XkbDupString(tmp); | ||||
| 	    } | ||||
| 	    else wantDflts|= XkmKeyNamesMask; | ||||
| 	    complete|= XkmKeyNamesMask; | ||||
| 	} | ||||
| 	if (wantNames&XkmGeometryMask) { | ||||
| 	    if (old_names->geometry==None) | ||||
| 		return False; | ||||
| 	    tmp= XkbAtomGetString(dpy,old_names->geometry); | ||||
| 	    names->geometry= _XkbDupString(tmp); | ||||
| 	    complete|= XkmGeometryMask;  | ||||
| 	    wantNames&= ~XkmGeometryMask; | ||||
| 	} | ||||
|     } | ||||
|     if (complete&XkmCompatMapMask) | ||||
| 	complete|= XkmIndicatorsMask|XkmVirtualModsMask; | ||||
|     else if (complete&(XkmSymbolsMask|XkmTypesMask)) | ||||
| 	complete|= XkmVirtualModsMask; | ||||
|     if (need & (~complete)) | ||||
| 	return False; | ||||
|     if ((complete&XkmSymbolsMask)&&((XkmKeyNamesMask|XkmTypesMask)&(~complete))) | ||||
| 	return False; | ||||
| 
 | ||||
|     multi_section= 1; | ||||
|     if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&& | ||||
| 	((complete&(~XkmKeymapLegal))==0)) { | ||||
| 	fprintf(file,"xkb_keymap \"%s\" {\n",name); | ||||
|     } | ||||
|     else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&& | ||||
| 	((complete&(~XkmSemanticsLegal))==0)) { | ||||
| 	fprintf(file,"xkb_semantics \"%s\" {\n",name); | ||||
|     } | ||||
|     else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&& | ||||
| 	((complete&(~XkmLayoutLegal))==0)) { | ||||
| 	fprintf(file,"xkb_layout \"%s\" {\n",name); | ||||
|     } | ||||
|     else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) { | ||||
| 	multi_section= 0; | ||||
|     } | ||||
|     else { | ||||
| 	return False; | ||||
|     } | ||||
| 
 | ||||
|     wantNames= complete&(~(wantConfig|wantDflts)); | ||||
|     name= names->keycodes; | ||||
|     if (wantConfig&XkmKeyNamesMask) | ||||
| 	XkbWriteXKBKeycodes(file,&finfo,False,False,_AddIncl,name); | ||||
|     else if (wantDflts&XkmKeyNamesMask) | ||||
| 	fprintf(stderr,"Default symbols not implemented yet!\n"); | ||||
|     else if (wantNames&XkmKeyNamesMask) | ||||
| 	XkbWriteSectionFromName(file,"keycodes",name); | ||||
| 
 | ||||
|     name= names->types; | ||||
|     if (wantConfig&XkmTypesMask) | ||||
| 	XkbWriteXKBKeyTypes(file,&finfo,False,False,_AddIncl,name); | ||||
|     else if (wantDflts&XkmTypesMask) | ||||
| 	fprintf(stderr,"Default types not implemented yet!\n"); | ||||
|     else if (wantNames&XkmTypesMask) | ||||
| 	XkbWriteSectionFromName(file,"types",name); | ||||
| 
 | ||||
|     name= names->compat; | ||||
|     if (wantConfig&XkmCompatMapMask) | ||||
| 	XkbWriteXKBCompatMap(file,&finfo,False,False,_AddIncl,name); | ||||
|     else if (wantDflts&XkmCompatMapMask) | ||||
| 	fprintf(stderr,"Default interps not implemented yet!\n"); | ||||
|     else if (wantNames&XkmCompatMapMask) | ||||
| 	XkbWriteSectionFromName(file,"compatibility",name); | ||||
| 
 | ||||
|     name= names->symbols; | ||||
|     if (wantConfig&XkmSymbolsMask) | ||||
| 	XkbWriteXKBSymbols(file,&finfo,False,False,_AddIncl,name); | ||||
|     else if (wantNames&XkmSymbolsMask) | ||||
| 	XkbWriteSectionFromName(file,"symbols",name); | ||||
| 
 | ||||
|     name= names->geometry; | ||||
|     if (wantConfig&XkmGeometryMask) | ||||
| 	XkbWriteXKBGeometry(file,&finfo,False,False,_AddIncl,name); | ||||
|     else if (wantNames&XkmGeometryMask) | ||||
| 	XkbWriteSectionFromName(file,"geometry",name); | ||||
| 
 | ||||
|     if (multi_section) | ||||
| 	fprintf(file,"};\n"); | ||||
| 
 | ||||
|     return True; | ||||
| } | ||||
| 
 | ||||
| /***====================================================================***/ | ||||
| 
 | ||||
| /*ARGSUSED*/ | ||||
| Status | ||||
| XkbMergeFile(XkbDescPtr xkb,XkbFileInfo finfo) | ||||
| { | ||||
|     return BadImplementation; | ||||
| } | ||||
| 
 | ||||
| /***====================================================================***/ | ||||
| 
 | ||||
| int | ||||
| XkbFindKeycodeByName(XkbDescPtr xkb,char *name,Bool use_aliases) | ||||
| { | ||||
| register int	i; | ||||
| 
 | ||||
|     if ((!xkb)||(!xkb->names)||(!xkb->names->keys)) | ||||
| 	return 0; | ||||
|     for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) { | ||||
| 	if (strncmp(xkb->names->keys[i].name,name,XkbKeyNameLength)==0) | ||||
| 	    return i; | ||||
|     } | ||||
|     if (!use_aliases) | ||||
| 	return 0; | ||||
|     if (xkb->geom && xkb->geom->key_aliases) { | ||||
| 	XkbKeyAliasPtr	a; | ||||
| 	a= xkb->geom->key_aliases; | ||||
| 	for (i=0;i<xkb->geom->num_key_aliases;i++,a++) { | ||||
| 	    if (strncmp(name,a->alias,XkbKeyNameLength)==0) | ||||
| 		return XkbFindKeycodeByName(xkb,a->real,False); | ||||
| 	} | ||||
|     } | ||||
|     if (xkb->names && xkb->names->key_aliases) { | ||||
| 	XkbKeyAliasPtr	a; | ||||
| 	a= xkb->names->key_aliases; | ||||
| 	for (i=0;i<xkb->names->num_key_aliases;i++,a++) { | ||||
| 	    if (strncmp(name,a->alias,XkbKeyNameLength)==0) | ||||
| 		return XkbFindKeycodeByName(xkb,a->real,False); | ||||
| 	} | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| unsigned | ||||
| XkbConvertGetByNameComponents(Bool toXkm,unsigned orig) | ||||
| { | ||||
|  | @ -115,6 +484,34 @@ unsigned	rtrn; | |||
|     return rtrn; | ||||
| } | ||||
| 
 | ||||
| unsigned | ||||
| XkbConvertXkbComponents(Bool toXkm,unsigned orig) | ||||
| { | ||||
| unsigned	rtrn; | ||||
| 
 | ||||
|     rtrn= 0; | ||||
|     if (toXkm) { | ||||
| 	if (orig&XkbClientMapMask)	rtrn|= XkmTypesMask|XkmSymbolsMask; | ||||
| 	if (orig&XkbServerMapMask)	rtrn|= XkmTypesMask|XkmSymbolsMask; | ||||
| 	if (orig&XkbCompatMapMask)	rtrn|= XkmCompatMapMask; | ||||
| 	if (orig&XkbIndicatorMapMask)	rtrn|= XkmIndicatorsMask; | ||||
| 	if (orig&XkbNamesMask)		rtrn|= XkmKeyNamesMask; | ||||
| 	if (orig&XkbGeometryMask)	rtrn|= XkmGeometryMask; | ||||
|     } | ||||
|     else { | ||||
| 	if (orig!=0)			rtrn|= XkbNamesMask; | ||||
| 	if (orig&XkmTypesMask)		rtrn|= XkbClientMapMask; | ||||
| 	if (orig&XkmCompatMapMask) | ||||
| 		rtrn|= XkbCompatMapMask|XkbIndicatorMapMask; | ||||
| 	if (orig&XkmSymbolsMask)	rtrn|=XkbClientMapMask|XkbServerMapMask; | ||||
| 	if (orig&XkmIndicatorsMask)	rtrn|= XkbIndicatorMapMask; | ||||
| 	if (orig&XkmKeyNamesMask)	 | ||||
| 		rtrn|= XkbNamesMask|XkbIndicatorMapMask; | ||||
| 	if (orig&XkmGeometryMask)	rtrn|= XkbGeometryMask; | ||||
|     } | ||||
|     return rtrn; | ||||
| } | ||||
| 
 | ||||
| Bool | ||||
| XkbDetermineFileType(XkbFileInfoPtr finfo,int format,int *opts_missing) | ||||
| { | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -167,89 +167,6 @@ int	count,nRead=0; | |||
|     return nRead; | ||||
| } | ||||
| 
 | ||||
| unsigned | ||||
| _XkbKSCheckCase(KeySym ks) | ||||
| { | ||||
| unsigned	set,rtrn; | ||||
| 
 | ||||
|     set= (ks & (~0xff)) >> 8; | ||||
|     rtrn= 0; | ||||
|     switch (set) { | ||||
| 	case 0:		/* latin 1 */ | ||||
| 	    if (((ks>=XK_A)&&(ks<=XK_Z))|| | ||||
| 		((ks>=XK_Agrave)&&(ks<=XK_THORN)&&(ks!=XK_multiply))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_a)&&(ks<=XK_z))|| | ||||
| 		((ks>=XK_agrave)&&(ks<=XK_ydiaeresis))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 1:		/* latin 2 */ | ||||
| 	    if (((ks>=XK_Aogonek)&&(ks<=XK_Zabovedot)&&(ks!=XK_breve))|| | ||||
| 		((ks>=XK_Racute)&&(ks<=XK_Tcedilla))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_aogonek)&&(ks<=XK_zabovedot)&&(ks!=XK_caron))|| | ||||
| 		((ks>=XK_racute)&&(ks<=XK_tcedilla))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 2:		/* latin 3 */ | ||||
| 	    if (((ks>=XK_Hstroke)&&(ks<=XK_Jcircumflex))|| | ||||
| 		((ks>=XK_Cabovedot)&&(ks<=XK_Scircumflex))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_hstroke)&&(ks<=XK_jcircumflex))|| | ||||
| 		((ks>=XK_cabovedot)&&(ks<=XK_scircumflex))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 3:		/* latin 4 */ | ||||
| 	    if (((ks>=XK_Rcedilla)&&(ks<=XK_Tslash))|| | ||||
| 	        (ks==XK_ENG)|| | ||||
| 		((ks>=XK_Amacron)&&(ks<=XK_Umacron))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (((ks>=XK_rcedilla)&&(ks<=XK_tslash))|| | ||||
| 	        (ks==XK_eng)|| | ||||
| 		((ks>=XK_amacron)&&(ks<=XK_umacron))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 18:		/* latin 8 */ | ||||
| 	    if ((ks==XK_Babovedot)|| | ||||
|                 ((ks>=XK_Dabovedot)&&(ks<=XK_Wacute))|| | ||||
| 		((ks>=XK_Ygrave)&&(ks<=XK_Fabovedot))|| | ||||
| 	        (ks==XK_Mabovedot)|| | ||||
| 	        (ks==XK_Pabovedot)|| | ||||
| 	        (ks==XK_Sabovedot)|| | ||||
| 	        (ks==XK_Wdiaeresis)|| | ||||
| 		((ks>=XK_Wcircumflex)&&(ks<=XK_Ycircumflex))) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if ((ks==XK_babovedot)|| | ||||
| 	        (ks==XK_dabovedot)|| | ||||
| 	        (ks==XK_fabovedot)|| | ||||
| 	        (ks==XK_mabovedot)|| | ||||
|                 ((ks>=XK_wgrave)&&(ks<=XK_wacute))|| | ||||
| 	        (ks==XK_ygrave)|| | ||||
| 		((ks>=XK_wdiaeresis)&&(ks<=XK_ycircumflex))) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case 19:		/* latin 9 */ | ||||
| 	    if ((ks==XK_OE)||(ks==XK_Ydiaeresis)) { | ||||
| 		rtrn|= _XkbKSUpper; | ||||
| 	    } | ||||
| 	    if (ks==XK_oe) { | ||||
| 		rtrn|= _XkbKSLower; | ||||
| 	    } | ||||
| 	    break; | ||||
|     } | ||||
|     return rtrn; | ||||
| } | ||||
| 
 | ||||
| /***====================================================================***/ | ||||
| 
 | ||||
| static int | ||||
|  | @ -1251,10 +1168,14 @@ int			nRead; | |||
| 		*loaded_rtrn|= XkmGeometryMask; | ||||
| 	    break; | ||||
| 	default: | ||||
| 	    _XkbLibError(_XkbErrBadImplementation, | ||||
| 	    			XkbConfigText(tmpTOC.type,XkbMessage),0); | ||||
| 	    nRead= 0; | ||||
| 	    break; | ||||
|     } | ||||
|     if (nRead!=tmpTOC.size) { | ||||
| 	_XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage), | ||||
| 						nRead-tmpTOC.size); | ||||
| 	return 0; | ||||
|     } | ||||
|     return (nRead>=0); | ||||
|  | @ -1288,6 +1209,8 @@ char 		name[100]; | |||
| 		return _XkbDupString(name); | ||||
| 	    break; | ||||
| 	default: | ||||
| 	    _XkbLibError(_XkbErrBadImplementation, | ||||
| 				XkbConfigText(tmpTOC.type,XkbMessage),0); | ||||
| 	    break; | ||||
|     } | ||||
|     return NULL; | ||||
|  | @ -1353,6 +1276,8 @@ unsigned		which= need|want; | |||
| 		tmp= ReadXkmGeometry(file,result); | ||||
| 		break; | ||||
| 	    default: | ||||
| 		_XkbLibError(_XkbErrBadImplementation, | ||||
| 				XkbConfigText(tmpTOC.type,XkbMessage),0); | ||||
| 		tmp= 0; | ||||
| 		break; | ||||
| 	} | ||||
|  | @ -1362,7 +1287,8 @@ unsigned		which= need|want; | |||
| 	    result->defined|= (1<<toc[i].type); | ||||
| 	} | ||||
| 	if (nRead!=tmpTOC.size) { | ||||
|             return 0; | ||||
| 	    _XkbLibError(_XkbErrBadLength,XkbConfigText(tmpTOC.type,XkbMessage), | ||||
| 	    						nRead-tmpTOC.size); | ||||
| 	} | ||||
|     } | ||||
|     return which; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue