xfree86: Reorder InputClass option priorities

Currently the config and InputClasses are merged together so that the
options from the config backend have the highest priority. This is bad
since it means options such as a default XKB layout set by the backend
cannot be changed by the user.

This patch changes order of precedence to be:

1. xorg.conf
2. xorg.conf.d (later files have higher priority)
3. config backend

In order to allow this ordering, the config parsing has been changed to
read the xorg.conf.d files before xorg.conf. This has the consequence
that the core device picking which looks for the first InputDevice may
not find it in xorg.conf.

Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Dan Nicholson 2010-02-13 10:40:40 -08:00 committed by Peter Hutterer
parent 48f7298657
commit 8736d112af
4 changed files with 23 additions and 20 deletions

View File

@ -2460,8 +2460,8 @@ xf86HandleConfigFile(Bool autoconfig)
dirfrom = X_CMDLINE;
xf86initConfigFiles();
filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT);
dirname = xf86openConfigDirFiles(dirsearch, xf86ConfigDir, PROJECTROOT);
filename = xf86openConfigFile(filesearch, xf86ConfigFile, PROJECTROOT);
if (filename) {
xf86MsgVerb(filefrom, 0, "Using config file: \"%s\"\n", filename);
xf86ConfigFile = xnfstrdup(filename);

View File

@ -586,38 +586,41 @@ InputClassMatches(XF86ConfInputClassPtr iclass, InputAttributes *attrs)
/*
* Merge in any InputClass configurations. Options in each InputClass
* section have less priority than the original device configuration as
* section have more priority than the original device configuration as
* well as any previous InputClass sections.
*/
static int
MergeInputClasses(IDevPtr idev, InputAttributes *attrs)
{
XF86ConfInputClassPtr cl;
XF86OptionPtr classopts;
XF86OptionPtr classopts, mergedopts = NULL;
char *classdriver = NULL;
for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) {
if (!InputClassMatches(cl, attrs))
continue;
/* Collect class options and merge over previous classes */
xf86Msg(X_CONFIG, "%s: Applying InputClass \"%s\"\n",
idev->identifier, cl->identifier);
if (cl->driver && !idev->driver) {
idev->driver = xstrdup(cl->driver);
if (!idev->driver) {
xf86Msg(X_ERROR, "Could not allocate memory while merging "
"InputClass configuration");
return BadAlloc;
}
}
if (cl->driver)
classdriver = cl->driver;
classopts = xf86optionListDup(cl->option_lst);
if (idev->commonOptions)
idev->commonOptions = xf86optionListMerge(classopts,
idev->commonOptions);
else
idev->commonOptions = classopts;
mergedopts = xf86optionListMerge(mergedopts, classopts);
}
/* Apply options to device with InputClass settings preferred. */
if (classdriver) {
xfree(idev->driver);
idev->driver = xstrdup(classdriver);
if (!idev->driver) {
xf86Msg(X_ERROR, "Failed to allocate memory while merging "
"InputClass configuration");
return BadAlloc;
}
}
idev->commonOptions = xf86optionListMerge(idev->commonOptions, mergedopts);
return Success;
}

View File

@ -988,8 +988,8 @@ These sections are optional and are used to provide configuration for a
class of input devices as they are automatically added. An input device can
match more than one
.B InputClass
section. Each class can only supplement settings from a previous class, so
it is best to arrange the sections with the most generic matches last.
section. Each class can override settings from a previous class, so it is
best to arrange the sections with the most generic matches first.
.PP
.B InputClass
sections have the following format:

View File

@ -136,8 +136,8 @@ winReadConfigfile ()
/* Parse config file into data structure */
xf86initConfigFiles();
filename = xf86openConfigFile (CONFIGPATH, xf86ConfigFile, PROJECTROOT);
dirname = xf86openConfigDirFiles (CONFIGDIRPATH, xf86ConfigDir, PROJECTROOT);
filename = xf86openConfigFile (CONFIGPATH, xf86ConfigFile, PROJECTROOT);
/* Hack for backward compatibility */
if (!filename && from == X_DEFAULT)