Commit 8736d112 authored by Dan Nicholson's avatar Dan Nicholson Committed by Peter Hutterer

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's avatarDan Nicholson <>
Reviewed-by: Peter Hutterer's avatarPeter Hutterer <>
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <>
parent 48f72986
......@@ -2460,8 +2460,8 @@ xf86HandleConfigFile(Bool autoconfig)
dirfrom = X_CMDLINE;
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);
......@@ -586,37 +586,40 @@ 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-> {
if (!InputClassMatches(cl, attrs))
/* 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 = classopts;
mergedopts = xf86optionListMerge(mergedopts, classopts);
/* Apply options to device with InputClass settings preferred. */
if (classdriver) {
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;
......@@ -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.
.B InputClass
sections have the following format:
......@@ -136,8 +136,8 @@ winReadConfigfile ()
/* Parse config file into data structure */
filename = xf86openConfigFile (CONFIGPATH, xf86ConfigFile, PROJECTROOT);
dirname = xf86openConfigDirFiles (CONFIGDIRPATH, xf86ConfigDir, PROJECTROOT);
filename = xf86openConfigFile (CONFIGPATH, xf86ConfigFile, PROJECTROOT);
/* Hack for backward compatibility */
if (!filename && from == X_DEFAULT)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment