Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into pci-rework
Conflicts: hw/xfree86/Makefile.am hw/xfree86/common/xf86AutoConfig.c
This commit is contained in:
commit
69533fc04f
|
@ -66,7 +66,7 @@ BUILTIN_SRCS += $(XINERAMA_SRCS)
|
|||
endif
|
||||
|
||||
# Security extension: multi-level security to protect clients from each other
|
||||
XCSECURITY_SRCS = security.c
|
||||
XCSECURITY_SRCS = security.c securitysrv.h
|
||||
if XCSECURITY
|
||||
BUILTIN_SRCS += $(XCSECURITY_SRCS)
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ dnl Process this file with autoconf to create configure.
|
|||
AC_PREREQ(2.57)
|
||||
dnl This is the not the Xorg version number, it's the server version number.
|
||||
dnl Yes, that's weird.
|
||||
AC_INIT([xorg-server], 1.1.99.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
|
||||
AC_INIT([xorg-server], 1.1.99.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
|
||||
AC_CONFIG_SRCDIR([Makefile.am])
|
||||
AM_INIT_AUTOMAKE([dist-bzip2 foreign])
|
||||
AM_MAINTAINER_MODE
|
||||
|
@ -1662,7 +1662,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
|
||||
|
|
|
@ -54,7 +54,6 @@ EXTRA_DIST = \
|
|||
darwinKeyboard.c \
|
||||
darwinKeyboard.h \
|
||||
darwinXinput.c \
|
||||
iokit/.cvsignore \
|
||||
iokit/xfIOKit.c \
|
||||
iokit/xfIOKitCursor.c \
|
||||
iokit/xfIOKit.h \
|
||||
|
@ -66,11 +65,8 @@ EXTRA_DIST = \
|
|||
quartz/cr/crFrame.m \
|
||||
quartz/cr/cr.h \
|
||||
quartz/cr/crScreen.m \
|
||||
quartz/cr/.cvsignore \
|
||||
quartz/cr/XView.h \
|
||||
quartz/cr/XView.m \
|
||||
quartz/.cvsignore \
|
||||
quartz/fullscreen/.cvsignore \
|
||||
quartz/fullscreen/fullscreen.c \
|
||||
quartz/fullscreen/quartzCursor.c \
|
||||
quartz/fullscreen/quartzCursor.h \
|
||||
|
@ -98,7 +94,6 @@ EXTRA_DIST = \
|
|||
quartz/XDarwinStartup.c \
|
||||
quartz/XDarwinStartup.man \
|
||||
quartz/xpr/appledri.c \
|
||||
quartz/xpr/.cvsignore \
|
||||
quartz/xpr/dri.c \
|
||||
quartz/xpr/dri.h \
|
||||
quartz/xpr/dristruct.h \
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/*
|
||||
** The contents of this file are subject to the GLX Public License Version 1.0
|
||||
** (the "License"). You may not use this file except in compliance with the
|
||||
** License. You may obtain a copy of the License at Silicon Graphics, Inc.,
|
||||
|
|
|
@ -47,8 +47,6 @@
|
|||
|
||||
#include "glxserver.h"
|
||||
|
||||
#include <xf86_ansic.h>
|
||||
|
||||
#include <windowstr.h>
|
||||
|
||||
#include "glxfbconfig.h"
|
||||
|
|
|
@ -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 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 dixmods dri exa \
|
||||
utils doc getconfig
|
||||
utils doc
|
||||
|
||||
bin_PROGRAMS = Xorg
|
||||
|
||||
|
|
|
@ -32,7 +32,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 xf86Io.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
|
||||
|
|
|
@ -187,6 +187,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)
|
||||
{
|
||||
|
@ -178,7 +216,6 @@ xf86AutoConfig(void)
|
|||
struct pci_device ** pciptr;
|
||||
struct pci_device * info = NULL;
|
||||
char *driver = NULL;
|
||||
FILE *gp = NULL;
|
||||
ConfigStatus ret;
|
||||
|
||||
/* Find the primary device, and get some information about it. */
|
||||
|
@ -195,108 +232,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 %u@%u:%u:%u\n",
|
||||
info->domain, info->bus, info->dev, 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_id, info->device_id, info->revision,
|
||||
info->subvendor_id, info->subdevice_id,
|
||||
info->device_class >> 8);
|
||||
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);
|
||||
|
@ -307,19 +244,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);
|
||||
|
@ -338,13 +268,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);
|
||||
|
@ -357,11 +280,9 @@ xf86AutoConfig(void)
|
|||
xf86setBuiltinConfig(builtinConfig);
|
||||
ret = xf86HandleConfigFile(TRUE);
|
||||
FreeConfig();
|
||||
switch(ret) {
|
||||
case CONFIG_OK:
|
||||
return TRUE;
|
||||
default:
|
||||
|
||||
if (ret != CONFIG_OK)
|
||||
xf86Msg(X_ERROR, "Error parsing the built-in default configuration.\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return (ret == CONFIG_OK);
|
||||
}
|
||||
|
|
292
hw/xfree86/common/xf86cvt.c
Normal file
292
hw/xfree86/common/xf86cvt.c
Normal file
|
@ -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;
|
||||
}
|
|
@ -25,4 +25,4 @@ exa.$(DRIVER_MAN_SUFFIX): exa.man
|
|||
-rm -f exa.$(DRIVER_MAN_SUFFIX)
|
||||
$(LN_S) exa.man exa.$(DRIVER_MAN_SUFFIX)
|
||||
|
||||
EXTRA_DIST = exa.man.pre README
|
||||
EXTRA_DIST = exa.man.pre
|
||||
|
|
4
hw/xfree86/getconfig/.gitignore
vendored
4
hw/xfree86/getconfig/.gitignore
vendored
|
@ -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
|
||||
#
|
||||
|
|
@ -30,4 +30,5 @@ libloader_a_SOURCES = \
|
|||
fontsym.c \
|
||||
misym.c \
|
||||
xf86sym.c \
|
||||
sym.h \
|
||||
$(SPARC_SOURCES)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -357,6 +357,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.
|
||||
*/
|
||||
|
|
|
@ -17,7 +17,6 @@ dist_xpc_DATA = \
|
|||
LubalinGraph-Book.pmf \
|
||||
LubalinGraph-DemiOblique.pmf \
|
||||
LubalinGraph-Demi.pmf \
|
||||
NewCenturySchlbk-BoldItalic.pmf \
|
||||
NewCenturySchlbk-Bold.pmf \
|
||||
NewCenturySchlbk-Italic.pmf \
|
||||
NewCenturySchlbk-Roman.pmf \
|
||||
|
|
|
@ -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 \
|
||||
|
|
431
xkb/xkbfmisc.c
431
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))
|
||||
return False;
|
||||
char * name,*tmp;
|
||||
unsigned complete;
|
||||
XkbNamesPtr old_names;
|
||||
int multi_section;
|
||||
unsigned wantNames,wantConfig,wantDflts;
|
||||
XkbFileInfo finfo;
|
||||
|
||||
fprintf(file, "xkb_keymap \"%s\" {\n", names->keymap ? names->keymap :
|
||||
"default");
|
||||
bzero(&finfo,sizeof(XkbFileInfo));
|
||||
|
||||
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);
|
||||
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;
|
||||
|
||||
fprintf(file,"};\n");
|
||||
if (want==0)
|
||||
return False;
|
||||
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
1051
xkb/xkbout.c
Normal file
1051
xkb/xkbout.c
Normal file
File diff suppressed because it is too large
Load Diff
1325
xkb/xkbtext.c
Normal file
1325
xkb/xkbtext.c
Normal file
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
Block a user