debian/changelog | 19 debian/patches/07-xfree86-fix-build-with-xv-disabled.diff | 50 debian/patches/08-config-xorg-conf-d.diff | 1287 +++++++++ debian/patches/09-inputclass-sans-abi9.diff | 1334 ++++++++++ debian/patches/10-config-libudev-backend.diff | 725 +++++ debian/patches/11-Move-config_init-after-CreateWellKnownSockets-and-In.diff | 34 debian/patches/11-xfree86-fix-video-fallback.diff | 123 debian/patches/12-Add-libudev-input-hotplug-backend.diff | 710 ----- debian/patches/12-xfree86-dont-complain-about-missing-coredevices.diff | 58 debian/patches/13-configure-config-udev-defaults-to-off-for-now.diff | 23 debian/patches/13-unbreak-input-abi.diff | 148 + debian/patches/14-config-add-example-udev-rules.diff | 27 debian/patches/14-tone-down-nidr-errors.diff | 20 debian/patches/15-config-udev-look-for-xkb-rules-model-layout-variant-.diff | 40 debian/patches/16-config-dont-filter-input-subsys.diff | 42 debian/patches/16-xfree86-fix-build-with-xv-disabled.diff | 53 debian/patches/series | 15 17 files changed, 3772 insertions(+), 936 deletions(-)
New commits: commit 8d44f6806196c6b77917b1483f975ee5e607a55b Author: Timo Aaltonen <tjaal...@cc.hut.fi> Date: Tue Mar 30 13:52:39 2010 +0300 Explain a bit more. diff --git a/debian/changelog b/debian/changelog index 62cad49..b781f32 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,7 +3,9 @@ xorg-server (2:1.7.6-2) UNRELEASED; urgency=low * Add 08-config-xorg-conf-d.diff, 09-inputclass-sans-abi9.diff, 10-config-libudev-backend.diff. Backport xorg.conf.d, inputclass and libudev support from xserver 1.8. Replaces the patches we had - before. + before. This allows us to migrate from a temporary udev based + input device configuration straight to the long term solution + introduced in 1.8. * Add 11-xfree86-fix-video-fallback.diff from SUSE. Allows the video fallback method to work when there's an xorg.conf around. * Add 12-xfree86-dont-complain-about-missing-coredevices.diff. commit cc96fc4f50cfbf1056b99e3af37d0624003349f9 Author: Timo Aaltonen <tjaal...@cc.hut.fi> Date: Tue Mar 30 13:41:00 2010 +0300 Update the changelog to explain the backport. diff --git a/debian/changelog b/debian/changelog index ef4b504..62cad49 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,17 @@ -xorg-server (2:1.7.6-1.1) UNRELEASED; urgency=low - - * Backport xorg.conf.d, inputclass and libudev support from - xserver 1.8. The udev support is slightly different from what we had. +xorg-server (2:1.7.6-2) UNRELEASED; urgency=low + + * Add 08-config-xorg-conf-d.diff, 09-inputclass-sans-abi9.diff, + 10-config-libudev-backend.diff. Backport xorg.conf.d, inputclass + and libudev support from xserver 1.8. Replaces the patches we had + before. + * Add 11-xfree86-fix-video-fallback.diff from SUSE. Allows the video + fallback method to work when there's an xorg.conf around. + * Add 12-xfree86-dont-complain-about-missing-coredevices.diff. + No reason to complain about these, unless AEI is off. + * Add 13-unbreak-input-abi.diff. Keep the old NewInputDeviceRequest(), + rename the new as NIDR18() and call it from NIDR(). This way we + don't break the input ABI. + * Add 14-tone-down-nidr-errors.diff. Use X_INFO instead of X_ERROR. -- Timo Aaltonen <tjaal...@ubuntu.com> Wed, 24 Mar 2010 16:08:25 +0200 commit 7ce6a0ee6ae7dbf380f639c9a235997889651635 Author: Timo Aaltonen <tjaal...@cc.hut.fi> Date: Tue Mar 30 13:23:16 2010 +0300 Refresh patch 07. diff --git a/debian/patches/07-xfree86-fix-build-with-xv-disabled.diff b/debian/patches/07-xfree86-fix-build-with-xv-disabled.diff index 184301f..8281634 100644 --- a/debian/patches/07-xfree86-fix-build-with-xv-disabled.diff +++ b/debian/patches/07-xfree86-fix-build-with-xv-disabled.diff @@ -8,11 +8,11 @@ Subject: [PATCH] xfree86: fix build with xv disabled hw/xfree86/modes/xf86Crtc.h | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 30b49af..62f8737 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -3009,6 +3009,7 @@ xf86_crtc_box_area(BoxPtr box) +Index: xorg-server/hw/xfree86/modes/xf86Crtc.c +=================================================================== +--- xorg-server.orig/hw/xfree86/modes/xf86Crtc.c 2010-03-30 13:22:36.000000000 +0300 ++++ xorg-server/hw/xfree86/modes/xf86Crtc.c 2010-03-30 13:22:39.000000000 +0300 +@@ -3011,6 +3011,7 @@ return (int) (box->x2 - box->x1) * (int) (box->y2 - box->y1); } @@ -20,7 +20,7 @@ index 30b49af..62f8737 100644 /* * Return the crtc covering 'box'. If two crtcs cover a portion of * 'box', then prefer 'desired'. If 'desired' is NULL, then prefer the crtc -@@ -3097,6 +3098,7 @@ xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn, +@@ -3099,6 +3100,7 @@ return ret; } @@ -28,11 +28,11 @@ index 30b49af..62f8737 100644 xf86_crtc_notify_proc_ptr xf86_wrap_crtc_notify (ScreenPtr screen, xf86_crtc_notify_proc_ptr new) -diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h -index 9baa956..2fb32c1 100644 ---- a/hw/xfree86/modes/xf86Crtc.h -+++ b/hw/xfree86/modes/xf86Crtc.h -@@ -908,6 +908,7 @@ xf86_hide_cursors (ScrnInfoPtr scrn); +Index: xorg-server/hw/xfree86/modes/xf86Crtc.h +=================================================================== +--- xorg-server.orig/hw/xfree86/modes/xf86Crtc.h 2010-03-30 13:22:36.000000000 +0300 ++++ xorg-server/hw/xfree86/modes/xf86Crtc.h 2010-03-30 13:22:39.000000000 +0300 +@@ -934,6 +934,7 @@ extern _X_EXPORT void xf86_cursors_fini (ScreenPtr screen); @@ -40,7 +40,7 @@ index 9baa956..2fb32c1 100644 /* * For overlay video, compute the relevant CRTC and * clip video to that. -@@ -926,6 +927,7 @@ xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn, +@@ -952,6 +953,7 @@ RegionPtr reg, INT32 width, INT32 height); @@ -48,6 +48,3 @@ index 9baa956..2fb32c1 100644 extern _X_EXPORT xf86_crtc_notify_proc_ptr xf86_wrap_crtc_notify (ScreenPtr pScreen, xf86_crtc_notify_proc_ptr new); --- -1.6.6.1 - commit f1cdff35391eb165ecd1b03cb7983f3a7e14dbfd Author: Timo Aaltonen <tjaal...@cc.hut.fi> Date: Tue Mar 30 13:21:29 2010 +0300 Rename the new patches to have a double-digit prefix. diff --git a/debian/patches/08-config-xorg-conf-d.diff b/debian/patches/08-config-xorg-conf-d.diff new file mode 100644 index 0000000..cf70c92 --- /dev/null +++ b/debian/patches/08-config-xorg-conf-d.diff @@ -0,0 +1,1287 @@ +From 871bbe1d87fa3c7ebd075e1d1eec33e45b08493d Mon Sep 17 00:00:00 2001 +From: Keith Packard <kei...@keithp.com> +Date: Wed, 30 Dec 2009 17:16:45 +0000 +Subject: Merge remote branch 'dbn/xorg.conf.d' + +--- +Index: xorg-server/configure.ac +=================================================================== +--- xorg-server.orig/configure.ac 2010-03-24 13:05:51.000000000 +0200 ++++ xorg-server/configure.ac 2010-03-24 13:05:51.000000000 +0200 +@@ -1696,6 +1696,7 @@ + + dnl these only go in xorg-config.h + XF86CONFIGFILE="xorg.conf" ++ XF86CONFIGDIR="xorg.conf.d" + CONFIGFILE="$sysconfdir/$XF86CONFIGFILE" + LOGPREFIX="$logdir/Xorg." + AC_DEFINE(XORG_SERVER, 1, [Building Xorg server]) +@@ -1708,6 +1709,7 @@ + AC_DEFINE(__XSERVERNAME__, "Xorg", [Name of X server]) + AC_DEFINE_DIR(__XCONFIGFILE__, XF86CONFIGFILE, [Name of configuration file]) + AC_DEFINE_DIR(XF86CONFIGFILE, XF86CONFIGFILE, [Name of configuration file]) ++ AC_DEFINE_DIR(__XCONFIGDIR__, XF86CONFIGDIR, [Name of configuration directory]) + AC_DEFINE_DIR(DEFAULT_MODULE_PATH, moduledir, [Default module search path]) + AC_DEFINE_DIR(DEFAULT_LIBRARY_PATH, libdir, [Default library install path]) + AC_DEFINE_DIR(DEFAULT_LOGPREFIX, LOGPREFIX, [Default log location]) +Index: xorg-server/cpprules.in +=================================================================== +--- xorg-server.orig/cpprules.in 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/cpprules.in 2010-03-24 13:05:51.000000000 +0200 +@@ -36,7 +36,8 @@ + -D__adminmansuffix__=$(ADMIN_MAN_SUFFIX) \ + -D__mandir__=$(mandir) \ + -D__projectroot__=$(prefix) \ +- -D__xconfigfile__=$(__XCONFIGFILE__) -D__xconfigdir__=$(XCONFIGDIR) \ ++ -D__xconfigfile__=$(__XCONFIGFILE__) \ ++ -D__xconfigdir__=$(__XCONFIGDIR__) \ + -D__xkbdir__=$(XKB_BASE_DIRECTORY) \ + -D__modulepath__="$(DEFAULT_MODULE_PATH)" \ + -D__xlogfile__=$(XLOGFILE) -D__xservername__=$(XSERVERNAME) +Index: xorg-server/hw/xfree86/common/xf86AutoConfig.c +=================================================================== +--- xorg-server.orig/hw/xfree86/common/xf86AutoConfig.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/common/xf86AutoConfig.c 2010-03-24 13:05:51.000000000 +0200 +@@ -272,7 +272,8 @@ + for (cp = builtinConfig; *cp; cp++) + xf86ErrorFVerb(3, "\t%s", *cp); + xf86MsgVerb(X_DEFAULT, 3, "--- End of built-in configuration ---\n"); +- ++ ++ xf86initConfigFiles(); + xf86setBuiltinConfig(builtinConfig); + ret = xf86HandleConfigFile(TRUE); + FreeConfig(); +Index: xorg-server/hw/xfree86/common/xf86Config.c +=================================================================== +--- xorg-server.orig/hw/xfree86/common/xf86Config.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/common/xf86Config.c 2010-03-24 13:05:51.000000000 +0200 +@@ -95,6 +95,23 @@ + "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ + "%P/lib/X11/%X" + #endif ++#ifndef ROOT_CONFIGDIRPATH ++#define ROOT_CONFIGDIRPATH "%A," "%R," \ ++ "/etc/X11/%R," "%P/etc/X11/%R," \ ++ "/etc/X11/%X-%M," "/etc/X11/%X," "/etc/%X," \ ++ "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ ++ "%P/etc/X11/%X," \ ++ "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ ++ "%P/lib/X11/%X" ++#endif ++#ifndef USER_CONFIGDIRPATH ++#define USER_CONFIGDIRPATH "/etc/X11/%S," "%P/etc/X11/%S," \ ++ "/etc/X11/%X-%M," "/etc/X11/%X," "/etc/%X," \ ++ "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ ++ "%P/etc/X11/%X," \ ++ "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ ++ "%P/lib/X11/%X" ++#endif + #ifndef PROJECTROOT + #define PROJECTROOT "/usr/X11R6" + #endif +@@ -1471,6 +1488,45 @@ + {0}, FALSE }, + }; + ++static Bool ++configInputDevices(XF86ConfLayoutPtr layout, serverLayoutPtr servlayoutp) ++{ ++ XF86ConfInputrefPtr irp; ++ IDevPtr *indp; ++ int count = 0; ++ ++ /* ++ * Count the number of input devices. ++ */ ++ irp = layout->lay_input_lst; ++ while (irp) { ++ count++; ++ irp = (XF86ConfInputrefPtr)irp->list.next; ++ } ++ DebugF("Found %d input devices in the layout section %s\n", ++ count, layout.lay_identifier); ++ indp = xnfcalloc((count + 1), sizeof(IDevPtr)); ++ indp[count] = NULL; ++ irp = layout->lay_input_lst; ++ count = 0; ++ while (irp) { ++ indp[count] = xnfalloc(sizeof(IDevRec)); ++ if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) { ++ while(count--) ++ xfree(indp[count]); ++ xfree(indp); ++ return FALSE; ++ } ++ indp[count]->extraOptions = irp->iref_option_lst; ++ count++; ++ irp = (XF86ConfInputrefPtr)irp->list.next; ++ } ++ servlayoutp->inputs = indp; ++ ++ return TRUE; ++} ++ ++ + /* + * figure out which layout is active, which screens are used in that layout, + * which drivers and monitors are used in these screens +@@ -1481,14 +1537,12 @@ + { + XF86ConfAdjacencyPtr adjp; + XF86ConfInactivePtr idp; +- XF86ConfInputrefPtr irp; + int count = 0; + int scrnum; + XF86ConfLayoutPtr l; + MessageType from; + screenLayoutPtr slp; + GDevPtr gdp; +- IDevPtr* indp; + int i = 0, j; + + if (!servlayoutp) +@@ -1701,37 +1755,13 @@ + count++; + idp = (XF86ConfInactivePtr)idp->list.next; + } +- /* +- * Count the number of input devices. +- */ +- count = 0; +- irp = conf_layout->lay_input_lst; +- while (irp) { +- count++; +- irp = (XF86ConfInputrefPtr)irp->list.next; +- } +- DebugF("Found %d input devices in the layout section %s\n", +- count, conf_layout->lay_identifier); +- indp = xnfcalloc((count + 1), sizeof(IDevPtr)); +- indp[count] = NULL; +- irp = conf_layout->lay_input_lst; +- count = 0; +- while (irp) { +- indp[count] = xnfalloc(sizeof(IDevRec)); +- if (!configInput(indp[count], irp->iref_inputdev, X_CONFIG)) { +- while(count--) +- xfree(indp[count]); +- xfree(indp); +- return FALSE; +- } +- indp[count]->extraOptions = irp->iref_option_lst; +- count++; +- irp = (XF86ConfInputrefPtr)irp->list.next; +- } ++ ++ if (!configInputDevices(conf_layout, servlayoutp)) ++ return FALSE; ++ + servlayoutp->id = conf_layout->lay_identifier; + servlayoutp->screens = slp; + servlayoutp->inactives = gdp; +- servlayoutp->inputs = indp; + servlayoutp->options = conf_layout->lay_option_lst; + from = X_DEFAULT; + +@@ -1743,12 +1773,14 @@ + * the only active screen. + */ + static Bool +-configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen) ++configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen, ++ XF86ConfigPtr xf86configptr) + { + MessageType from; + XF86ConfScreenPtr s; + screenLayoutPtr slp; + IDevPtr *indp; ++ XF86ConfLayoutRec layout; + + if (!servlayoutp) + return FALSE; +@@ -1784,10 +1816,19 @@ + servlayoutp->screens = slp; + servlayoutp->inactives = xnfcalloc(1, sizeof(GDevRec)); + servlayoutp->options = NULL; +- /* Set up an empty input device list, then look for some core devices. */ +- indp = xnfalloc(sizeof(IDevPtr)); +- *indp = NULL; +- servlayoutp->inputs = indp; ++ ++ memset(&layout, 0, sizeof(layout)); ++ layout.lay_identifier = servlayoutp->id; ++ if (xf86layoutAddInputDevices(xf86configptr, &layout) > 0) { ++ if (!configInputDevices(&layout, servlayoutp)) ++ return FALSE; ++ from = X_DEFAULT; ++ } else { ++ /* Set up an empty input device list, then look for some core devices. */ ++ indp = xnfalloc(sizeof(IDevPtr)); ++ *indp = NULL; ++ servlayoutp->inputs = indp; ++ } + + return TRUE; + } +@@ -2428,34 +2469,53 @@ + ConfigStatus + xf86HandleConfigFile(Bool autoconfig) + { +- const char *filename; +- char *searchpath; +- MessageType from = X_DEFAULT; ++ const char *filename, *dirname; ++ char *filesearch, *dirsearch; ++ MessageType filefrom = X_DEFAULT; ++ MessageType dirfrom = X_DEFAULT; + char *scanptr; + Bool singlecard = 0; + Bool implicit_layout = FALSE; + + if (!autoconfig) { +- if (getuid() == 0) +- searchpath = ROOT_CONFIGPATH; +- else +- searchpath = USER_CONFIGPATH; ++ if (getuid() == 0) { ++ filesearch = ROOT_CONFIGPATH; ++ dirsearch = ROOT_CONFIGDIRPATH; ++ } else { ++ filesearch = USER_CONFIGPATH; ++ dirsearch = USER_CONFIGDIRPATH; ++ } + + if (xf86ConfigFile) +- from = X_CMDLINE; +- +- filename = xf86openConfigFile(searchpath, xf86ConfigFile, PROJECTROOT); ++ filefrom = X_CMDLINE; ++ if (xf86ConfigDir) ++ dirfrom = X_CMDLINE; ++ ++ xf86initConfigFiles(); ++ filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT); ++ dirname = xf86openConfigDirFiles(dirsearch, xf86ConfigDir, PROJECTROOT); + if (filename) { +- xf86MsgVerb(from, 0, "Using config file: \"%s\"\n", filename); ++ xf86MsgVerb(filefrom, 0, "Using config file: \"%s\"\n", filename); + xf86ConfigFile = xnfstrdup(filename); + } else { + if (xf86ConfigFile) + xf86Msg(X_ERROR, "Unable to locate/open config file: \"%s\"\n", + xf86ConfigFile); +- return CONFIG_NOFILE; + } ++ if (dirname) { ++ xf86MsgVerb(dirfrom, 0, "Using config directory: \"%s\"\n", ++ dirname); ++ xf86ConfigDir = xnfstrdup(dirname); ++ } else { ++ if (xf86ConfigDir) ++ xf86Msg(X_ERROR, ++ "Unable to locate/open config directory: \"%s\"\n", ++ xf86ConfigDir); ++ } ++ if (!filename && !dirname) ++ return CONFIG_NOFILE; + } +- ++ + if ((xf86configptr = xf86readConfigFile ()) == NULL) { + xf86Msg(X_ERROR, "Problem parsing the config file\n"); + return CONFIG_PARSE_ERROR; +@@ -2481,7 +2541,8 @@ + "No Layout section. Using the first Screen section.\n"); + } + if (!configImpliedLayout(&xf86ConfigLayout, +- xf86configptr->conf_screen_lst)) { ++ xf86configptr->conf_screen_lst, ++ xf86configptr)) { + xf86Msg(X_ERROR, "Unable to determine the screen layout\n"); + return CONFIG_PARSE_ERROR; + } +Index: xorg-server/hw/xfree86/common/xf86Globals.c +=================================================================== +--- xorg-server.orig/hw/xfree86/common/xf86Globals.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/common/xf86Globals.c 2010-03-24 13:05:51.000000000 +0200 +@@ -143,6 +143,7 @@ + #endif + }; + const char *xf86ConfigFile = NULL; ++const char *xf86ConfigDir = NULL; + const char *xf86ModulePath = DEFAULT_MODULE_PATH; + MessageType xf86ModPathFrom = X_DEFAULT; + const char *xf86LogFile = DEFAULT_LOGPREFIX; +Index: xorg-server/hw/xfree86/common/xf86Init.c +=================================================================== +--- xorg-server.orig/hw/xfree86/common/xf86Init.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/common/xf86Init.c 2010-03-24 13:05:51.000000000 +0200 +@@ -1373,6 +1373,19 @@ + xf86ConfigFile = argv[i + 1]; + return 2; + } ++ if (!strcmp(argv[i], "-configdir")) ++ { ++ CHECK_FOR_REQUIRED_ARGUMENT(); ++ if (getuid() != 0 && !xf86PathIsSafe(argv[i + 1])) { ++ FatalError("\nInvalid argument for %s\n" ++ "\tFor non-root users, the file specified with %s must be\n" ++ "\ta relative path and must not contain any \"..\" elements.\n" ++ "\tUsing default "__XCONFIGDIR__" search path.\n\n", ++ argv[i], argv[i]); ++ } ++ xf86ConfigDir = argv[i + 1]; ++ return 2; ++ } + if (!strcmp(argv[i],"-flipPixels")) + { + xf86FlipPixels = TRUE; +@@ -1656,6 +1669,8 @@ + } + ErrorF("-config file specify a configuration file, relative to the\n"); + ErrorF(" "__XCONFIGFILE__" search path, only root can use absolute\n"); ++ ErrorF("-configdir dir specify a configuration directory, relative to the\n"); ++ ErrorF(" "__XCONFIGDIR__" search path, only root can use absolute\n"); + ErrorF("-verbose [n] verbose startup messages\n"); + ErrorF("-logverbose [n] verbose log messages\n"); + ErrorF("-quiet minimal startup messages\n"); +Index: xorg-server/hw/xfree86/common/xf86Priv.h +=================================================================== +--- xorg-server.orig/hw/xfree86/common/xf86Priv.h 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/common/xf86Priv.h 2010-03-24 13:05:51.000000000 +0200 +@@ -46,6 +46,7 @@ + * The global state of these things is held in xf86InfoRec (when appropriate). + */ + extern _X_EXPORT const char *xf86ConfigFile; ++extern _X_EXPORT const char *xf86ConfigDir; + extern _X_EXPORT Bool xf86AllowMouseOpenFail; + #ifdef XF86VIDMODE + extern _X_EXPORT Bool xf86VidModeDisabled; +Index: xorg-server/hw/xfree86/doc/man/Xorg.man.pre +=================================================================== +--- xorg-server.orig/hw/xfree86/doc/man/Xorg.man.pre 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/doc/man/Xorg.man.pre 2010-03-24 13:05:51.000000000 +0200 +@@ -109,7 +109,7 @@ + .B __xservername__ + supports several mechanisms for supplying/obtaining configuration and + run-time parameters: command line options, environment variables, the +-__xconfigfile__(__filemansuffix__) configuration file, auto-detection, and ++__xconfigfile__(__filemansuffix__) configuration files, auto-detection, and + fallback defaults. When the same information is supplied in more than + one way, the highest precedence mechanism is used. The list of mechanisms + is ordered from highest precedence to lowest. Note that not all parameters +@@ -176,6 +176,13 @@ + with real-uid 0), or for files relative to a directory in the config + search path for all other users. + .TP 8 ++.BI \-configdir " directory" ++Read the server configuration files from ++.IR directory . ++This option will work for any directory when the server is run as root ++(i.e, with real-uid 0), or for directories relative to a directory in the ++config directory search path for all other users. ++.TP 8 + .B \-configure + When this option is specified, the + .B __xservername__ +@@ -456,6 +463,10 @@ + .B __xservername__ + typically uses a configuration file called + .B __xconfigfile__ ++and configuration files with the suffix ++.I .conf ++in a directory called ++.B __xconfigdir__ + for its initial setup. + Refer to the __xconfigfile__(__filemansuffix__) manual page for information + about the format of this file. +@@ -464,7 +475,9 @@ + has a mechanism for automatically generating a built-in configuration + at run-time when no + .B __xconfigfile__ +-file is present. The current version of this automatic configuration ++file or ++.B __xconfigdir__ ++files are present. The current version of this automatic configuration + mechanism works in two ways. + .PP + The first is via enhancements that have made many components of the +@@ -486,7 +499,7 @@ + .SH FILES + The + .B __xservername__ +-server config file can be found in a range of locations. These are ++server config files can be found in a range of locations. These are + documented fully in the __xconfigfile__(__filemansuffix__) manual page. The + most commonly used locations are shown here. + .TP 30 +@@ -505,6 +518,21 @@ + .B __projectroot__/lib/X11/__xconfigfile__ + Server configuration file. + .TP 30 ++.B /etc/X11/__xconfigdir__ ++Server configuration directory. ++.TP 30 ++.B /etc/X11/__xconfigdir__-4 ++Server configuration directory. ++.TP 30 ++.B /etc/__xconfigdir__ ++Server configuration directory. ++.TP 30 ++.B __projectroot__/etc/__xconfigdir__ ++Server configuration directory. ++.TP 30 ++.B __projectroot__/lib/X11/__xconfigdir__ ++Server configuration directory. ++.TP 30 + .BI __logdir__/__xservername__. n .log + Server log file for display + .IR n . +Index: xorg-server/hw/xfree86/doc/man/xorg.conf.man.pre +=================================================================== +--- xorg-server.orig/hw/xfree86/doc/man/xorg.conf.man.pre 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/doc/man/xorg.conf.man.pre 2010-03-24 13:05:51.000000000 +0200 +@@ -2,27 +2,35 @@ + .ds q \N'34' + .TH __xconfigfile__ __filemansuffix__ __vendorversion__ + .SH NAME +-__xconfigfile__ \- configuration File for __xservername__ X server ++__xconfigfile__ and __xconfigdir__ \- configuration files for ++__xservername__ X server + .SH INTRODUCTION + .B __xservername__ + supports several mechanisms for supplying/obtaining configuration and + run-time parameters: command line options, environment variables, the +-__xconfigfile__ configuration file, auto-detection, and fallback defaults. +-When the same information is supplied in more than one way, the highest +-precedence mechanism is used. The list of mechanisms is ordered from +-highest precedence to lowest. Note that not all parameters can be +-supplied via all methods. The available command line options and +-environment variables (and some defaults) are described in the Xserver(__appmansuffix__) +-and __xservername__(__appmansuffix__) manual pages. Most configuration file parameters, with +-their defaults, are described below. Driver and module specific +-configuration parameters are described in the relevant driver or module +-manual page. ++__xconfigfile__ and __xconfigdir__ configuration files, auto-detection, ++and fallback defaults. When the same information is supplied in more ++than one way, the highest precedence mechanism is used. The list of ++mechanisms is ordered from highest precedence to lowest. Note that not ++all parameters can be supplied via all methods. The available command ++line options and environment variables (and some defaults) are ++described in the Xserver(__appmansuffix__) and ++__xservername__(__appmansuffix__) manual pages. Most configuration file ++parameters, with their defaults, are described below. Driver and module ++specific configuration parameters are described in the relevant driver ++or module manual page. + .SH DESCRIPTION + .B __xservername__ + uses a configuration file called + .I __xconfigfile__ ++and files ending in the suffix ++.I .conf ++from the directory ++.I __xconfigdir__ + for its initial setup. +-This configuration file is searched for in the following places when the ++The ++.I __xconfigfile__ ++configuration file is searched for in the following places when the + server is started as a normal user: + .PP + .RS 4 +@@ -93,9 +101,28 @@ + is the machine's hostname as reported by + .BR gethostname (__libmansuffix__). + .PP ++Additional configuration files are searched for in the following ++directories: ++.PP ++.RS 4 ++.nf ++.I /etc/X11/__xconfigdir__\-4 ++.I /etc/X11/__xconfigdir__ ++.I /etc/__xconfigdir__ ++.IR __projectroot__/etc/X11/__xconfigdir__. <hostname> ++.I __projectroot__/etc/X11/__xconfigdir__\-4 ++.I __projectroot__/etc/X11/__xconfigdir__ ++.IR __projectroot__/lib/X11/__xconfigdir__. <hostname> ++.I __projectroot__/lib/X11/__xconfigdir__\-4 ++.I __projectroot__/lib/X11/__xconfigdir__ ++.fi ++.RE ++.PP + The + .I __xconfigfile__ +-file is composed of a number of sections which may be present in any order, ++and ++.I __xconfigdir__ ++files are composed of a number of sections which may be present in any order, + or omitted to use default configuration values. + Each section has the form: + .PP +@@ -853,6 +880,11 @@ + See the individual input driver manual pages for a description of the + device\-specific options. + .TP 7 ++.BI "Option \*qAutoServerLayout\*q \*q" boolean \*q ++Always add the device to the ServerLayout section used by this instance of ++the server. This affects implied layouts as well as explicit layouts ++specified in the configuration and/or on the command line. ++.TP 7 + .BI "Option \*qCorePointer\*q" + Deprecated, use + .B SendCoreEvents +Index: xorg-server/hw/xfree86/parser/Layout.c +=================================================================== +--- xorg-server.orig/hw/xfree86/parser/Layout.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/parser/Layout.c 2010-03-24 13:05:51.000000000 +0200 +@@ -64,6 +64,10 @@ + #include "Configint.h" + #include <string.h> + ++ ++/* Needed for auto server layout */ ++extern int xf86CheckBoolOption(void* optlist, const char *name, int deflt); ++ + extern LexRec val; + + static xf86ConfigSymTabRec LayoutTab[] = +@@ -450,15 +454,67 @@ + } + + int ++xf86layoutAddInputDevices(XF86ConfigPtr config, XF86ConfLayoutPtr layout) ++{ ++ int count = 0; ++ XF86ConfInputPtr input = config->conf_input_lst; ++ XF86ConfInputrefPtr inptr; ++ ++ /* add all AutoServerLayout devices to the server layout */ ++ while (input) ++ { ++ if (xf86CheckBoolOption(input->inp_option_lst, "AutoServerLayout", FALSE)) ++ { ++ XF86ConfInputrefPtr iref = layout->lay_input_lst; ++ ++ /* avoid duplicates if referenced but lists AutoServerLayout too */ ++ while (iref) ++ { ++ if (strcmp(iref->iref_inputdev_str, input->inp_identifier) == 0) ++ break; ++ iref = iref->list.next; ++ } ++ ++ if (!iref) ++ { ++ XF86ConfInputrefPtr iptr; ++ iptr = calloc(1, sizeof(XF86ConfInputrefRec)); ++ iptr->iref_inputdev_str = input->inp_identifier; ++ layout->lay_input_lst = (XF86ConfInputrefPtr) ++ xf86addListItem((glp)layout->lay_input_lst, (glp)iptr); ++ count++; ++ } ++ } ++ input = input->list.next; ++ } ++ ++ inptr = layout->lay_input_lst; ++ while (inptr) ++ { ++ input = xf86findInput (inptr->iref_inputdev_str, ++ config->conf_input_lst); ++ if (!input) ++ { ++ xf86validationError (UNDEFINED_INPUT_MSG, ++ inptr->iref_inputdev_str, layout->lay_identifier); ++ return -1; ++ } ++ else ++ inptr->iref_inputdev = input; ++ inptr = inptr->list.next; ++ } ++ ++ return count; ++} ++ ++int + xf86validateLayout (XF86ConfigPtr p) + { + XF86ConfLayoutPtr layout = p->conf_layout_lst; + XF86ConfAdjacencyPtr adj; + XF86ConfInactivePtr iptr; +- XF86ConfInputrefPtr inptr; + XF86ConfScreenPtr screen; + XF86ConfDevicePtr device; +- XF86ConfInputPtr input; + + while (layout) + { +@@ -500,21 +556,10 @@ + iptr->inactive_device = device; + iptr = iptr->list.next; + } +- inptr = layout->lay_input_lst; +- while (inptr) +- { +- input = xf86findInput (inptr->iref_inputdev_str, +- p->conf_input_lst); +- if (!input) +- { +- xf86validationError (UNDEFINED_INPUT_MSG, +- inptr->iref_inputdev_str, layout->lay_identifier); +- return (FALSE); +- } +- else +- inptr->iref_inputdev = input; +- inptr = inptr->list.next; +- } ++ ++ if (xf86layoutAddInputDevices(p, layout) == -1) ++ return FALSE; ++ + layout = layout->list.next; + } + return (TRUE); +Index: xorg-server/hw/xfree86/parser/scan.c +=================================================================== +--- xorg-server.orig/hw/xfree86/parser/scan.c 2010-03-24 13:01:50.000000000 +0200 ++++ xorg-server/hw/xfree86/parser/scan.c 2010-03-24 13:05:51.000000000 +0200 +@@ -62,8 +62,11 @@ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> ++#include <sys/types.h> ++#include <dirent.h> + #include <unistd.h> + #include <stdarg.h> ++#include <X11/Xdefs.h> + #include <X11/Xfuncproto.h> + + #if defined(_POSIX_SOURCE) +@@ -90,17 +93,24 @@ + #include "xf86tokens.h" + + #define CONFIG_BUF_LEN 1024 ++#define CONFIG_MAX_FILES 64 + + static int StringToToken (char *, xf86ConfigSymTabRec *); + +-static FILE *configFile = NULL; ++static struct { ++ FILE *file; ++ char *path; ++} configFiles[CONFIG_MAX_FILES]; + static const char **builtinConfig = NULL; + static int builtinIndex = 0; + static int configPos = 0; /* current readers position */ + static int configLineNo = 0; /* linenumber */ + static char *configBuf, *configRBuf; /* buffer for lines */ + static char *configPath; /* path to config file */ ++static char *configDirPath; /* path to config dir */ + static char *configSection = NULL; /* name of current section being parsed */ ++static int numFiles = 0; /* number of config files */ ++static int curFileIndex = 0; /* index of current config file */ + static int pushToken = LOCK_TOKEN; + static int eol_seen = 0; /* private state to handle comments */ + LexRec val; +@@ -155,7 +165,7 @@ + /* + * xf86getNextLine -- + * +- * read from the configFile FILE stream until we encounter a new ++ * read from the configFiles FILE stream until we encounter a new + * line; this is effectively just a big wrapper for fgets(3). + * + * xf86getToken() assumes that we will read up to the next +@@ -213,9 +223,18 @@ + /* read in another block of chars */ + + do { +- ret = fgets(configBuf + pos, configBufLen - pos - 1, configFile); ++ ret = fgets(configBuf + pos, configBufLen - pos - 1, ++ configFiles[curFileIndex].file); + +- if (!ret) break; ++ if (!ret) { ++ /* stop if there are no more files */ ++ if (++curFileIndex >= numFiles) { ++ curFileIndex = 0; ++ break; ++ } ++ configLineNo = 0; ++ continue; ++ } + + /* search for EOL in the new block of chars */ + +@@ -306,7 +325,7 @@ + if (!c) + { + char *ret; +- if (configFile) ++ if (numFiles > 0) + ret = xf86getNextLine(); + else { + if (builtinConfig[builtinIndex] == NULL) +@@ -575,6 +594,12 @@ + #ifndef XCONFIGFILE + #define XCONFIGFILE "xorg.conf" + #endif ++#ifndef XCONFIGDIR ++#define XCONFIGDIR "xorg.conf.d" ++#endif ++#ifndef XCONFIGSUFFIX ++#define XCONFIGSUFFIX ".conf" ++#endif + #ifndef PROJECTROOT + #define PROJECTROOT "/usr/X11R6" + #endif +@@ -616,7 +641,8 @@ + + static char * + DoSubstitution(const char *template, const char *cmdline, const char *projroot, +- int *cmdlineUsed, int *envUsed, char *XConfigFile) ++ int *cmdlineUsed, int *envUsed, ++ const char *XConfigFile) + { + char *result; + int i, l; +@@ -745,7 +771,164 @@ + return result; + } + +-/* ++/* ++ * Given some searching parameters, locate and open the xorg config file. ++ */ ++static char * ++OpenConfigFile(const char *path, const char *cmdline, const char *projroot, ++ const char *confname) ++{ ++ char *filepath = NULL; ++ char *pathcopy; ++ const char *template; ++ int cmdlineUsed = 0; ++ FILE *file = NULL; ++ ++ pathcopy = strdup(path); ++ for (template = strtok(pathcopy, ","); template && !file; ++ template = strtok(NULL, ",")) { ++ filepath = DoSubstitution(template, cmdline, projroot, ++ &cmdlineUsed, NULL, confname); ++ if (!filepath) ++ continue; ++ if (cmdline && !cmdlineUsed) { ++ free(filepath); ++ filepath = NULL; ++ continue; ++ } ++ file = fopen(filepath, "r"); ++ if (!file) { ++ free(filepath); ++ filepath = NULL; ++ } ++ } ++ ++ if (file) { ++ configFiles[numFiles].file = file; ++ configFiles[numFiles].path = strdup(filepath); ++ numFiles++; ++ } ++ return filepath; ++} ++ ++/* ++ * Match non-hidden files in the xorg config directory with a .conf ++ * suffix. This filter is passed to scandir(3). ++ */ ++static int ++ConfigFilter(const struct dirent *de) ++{ ++ const char *name = de->d_name; ++ size_t len = strlen(name); ++ size_t suflen = strlen(XCONFIGSUFFIX); ++ ++ if (!name || name[0] == '.' || len <= suflen) ++ return 0; ++ if (strcmp(&name[len-suflen], XCONFIGSUFFIX) != 0) ++ return 0; ++ return 1; ++} ++ ++static Bool ++AddConfigDirFiles(const char *dirpath, struct dirent **list, int num) ++{ ++ int i; ++ Bool openedFile = FALSE; ++ Bool warnOnce = FALSE; ++ ++ for (i = 0; i < num; i++) { ++ char *path; ++ FILE *file; ++ ++ if (numFiles >= CONFIG_MAX_FILES) { ++ if (!warnOnce) { ++ ErrorF("Maximum number of configuration " ++ "files opened\n"); ++ warnOnce = TRUE; ++ } ++ free(list[i]); ++ continue; ++ } ++ ++ path = malloc(PATH_MAX + 1); ++ snprintf(path, PATH_MAX + 1, "%s/%s", dirpath, ++ list[i]->d_name); ++ free(list[i]); ++ file = fopen(path, "r"); ++ if (!file) { ++ free(path); ++ continue; ++ } ++ openedFile = TRUE; ++ -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1nwz4l-0000eu...@alioth.debian.org