diff options
author | Dan Nicholson <dbn.lists@gmail.com> | 2010-02-13 10:40:40 -0800 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-02-15 15:27:42 +1000 |
commit | 8736d112afb0dd61dfdaadd6378eafd200b2ef5f (patch) | |
tree | 692a3f333a62c89cf1b61c180fa32d87192127ef | |
parent | 48f7298657f91843db36566b8d66d6c4c18dbd4c (diff) |
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>
-rw-r--r-- | hw/xfree86/common/xf86Config.c | 2 | ||||
-rw-r--r-- | hw/xfree86/common/xf86Xinput.c | 35 | ||||
-rw-r--r-- | hw/xfree86/doc/man/xorg.conf.man.pre | 4 | ||||
-rw-r--r-- | hw/xwin/winconfig.c | 2 |
4 files changed, 23 insertions, 20 deletions
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 1abc182da..132e8bc37 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -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); diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index c2d9f49de..e9f7f2fb7 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -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->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; } diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index c8a3c3ac2..93c8ac41d 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -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: diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c index f1e805c4c..259b3d238 100644 --- a/hw/xwin/winconfig.c +++ b/hw/xwin/winconfig.c @@ -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) |