summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2010-05-25 17:15:32 +1000
committerKeith Packard <keithp@keithp.com>2010-05-25 10:06:50 -0700
commitc2d0b3b437b7ce6ce975f2ead4d8bb8295ef0ddc (patch)
tree401fc96d44a7ff27923207ee59a90b36df55959f
parent86303a338ad563d0b986a3c052104301c310c4ac (diff)
xfree86: store the InputAttributes in the input device.
InputAttributes largely decide which configuration values get merged from the xorg.conf.d snippets. While they are available in the config backend, they are not available for any other callers of NewInputDeviceRequest(). Drivers implementing driver-side hotplugging do not have access to these attributes and cannot have xorg.conf.d snippets specific to dependent devices. For example, the following case cannot work right now: Section "InputClass" MatchProduct "Wacom" Option "PressCurve" "0 0 100 100" ... EndSection Section "InputClass" MatchProduct "Wacom" MatchProduct "eraser" Option "PressCurve" "10 10 50 50" ... EndSection The second section is not triggered, as the wacom driver cannot supply the InputAttributes to NewInputDeviceRequest(). Add the attributes to the IDevRec and merge them into the InputInfoRec to make them accessible in the driver. This changes the ABI for input drivers. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Dan Nicholson <dbn.lists@gmail.com> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--hw/xfree86/common/xf86Helper.c2
-rw-r--r--hw/xfree86/common/xf86Option.c4
-rw-r--r--hw/xfree86/common/xf86Xinput.c3
-rw-r--r--hw/xfree86/common/xf86Xinput.h1
-rw-r--r--hw/xfree86/common/xf86str.h1
5 files changed, 10 insertions, 1 deletions
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index bde80eacd..d4b935157 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -330,6 +330,8 @@ xf86DeleteInput(InputInfoPtr pInp, int flags)
if (pInp->private)
free(pInp->private);
+ FreeInputAttributes(pInp->attrs);
+
/* Remove the entry from the list. */
if (pInp == xf86InputDevs)
xf86InputDevs = pInp->next;
diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
index 8be893cc3..61d0dcc2e 100644
--- a/hw/xfree86/common/xf86Option.c
+++ b/hw/xfree86/common/xf86Option.c
@@ -164,6 +164,10 @@ xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
else
pInfo->options = tmp;
}
+
+ if (pInfo->conf_idev && pInfo->conf_idev->attrs) {
+ pInfo->attrs = pInfo->conf_idev->attrs;
+ }
}
/* Created for new XInput stuff -- essentially extensions to the parser */
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 2e254821e..356ddab4c 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -622,7 +622,6 @@ MergeInputClasses(IDevPtr idev, InputAttributes *attrs)
mergedopts = xf86ReplaceStrOption(mergedopts, "driver", idev->driver);
}
idev->commonOptions = xf86optionListMerge(idev->commonOptions, mergedopts);
-
return Success;
}
@@ -822,6 +821,8 @@ NewInputDeviceRequest (InputOption *options, InputAttributes *attrs,
rval = MergeInputClasses(idev, attrs);
if (rval != Success)
goto unwind;
+
+ idev->attrs = DuplicateInputAttributes(attrs);
}
if (!idev->driver || !idev->identifier) {
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index aa9e9d507..20a3f1bab 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -148,6 +148,7 @@ typedef struct _LocalDeviceRec {
pointer module;
pointer options;
unsigned int history_size;
+ InputAttributes *attrs;
} LocalDeviceRec, *LocalDevicePtr, InputInfoRec, *InputInfoPtr;
typedef struct _DeviceAssocRec
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index 22f0261b4..c9b261d66 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -406,6 +406,7 @@ typedef struct {
char * driver;
pointer commonOptions;
pointer extraOptions;
+ InputAttributes *attrs;
} IDevRec, *IDevPtr;
typedef struct {