We only rotate on a per-tablet basis, not per-tool. Don't accept rotation values on dependent devices (unless they're the same, then be quiet about it).
Signed-off-by: Peter Hutterer <[email protected]> --- Changes to v1: - use "parent device" in the man page (see the man page additions on the list) - fix rotation setting for xorg.conf devices, mark devices side effect is that xorg.conf devices that specify different rotation for different devices will not work as requested but at least that's a long-standing bug anyway. we really need flags for hotplugged, parent and xorg.conf devices. but at this stage in the cycle, that's more change than I'd like to introduce. man/wacom.man | 4 +++- src/wcmConfig.c | 23 ++++++++++++++++++++--- src/wcmValidateDevice.c | 16 ++++++++++++---- src/xf86Wacom.h | 2 +- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/man/wacom.man b/man/wacom.man index 1594836..797b388 100644 --- a/man/wacom.man +++ b/man/wacom.man @@ -138,7 +138,9 @@ can be an integer from -1 to 5. Default is 3 for capacitive tools and .B Option \fI"Rotate"\fP \fI"CW"|"CCW"|"HALF"|"NONE"\fP rotates the tablet orientation counterclockwise (CCW) or clockwise (CW) or 180 degrees (HALF). If you have specific tablet mappings, i.e. TopX/Y or BottomX/Y were set, the mapping will be -applied before rotation. The default is "NONE". +applied before rotation. Rotation must be applied to the parent device +(usually the stylus), rotation settings on hotplugged devices will be +ignored. The default is "NONE". .TP 4 .B Option \fI"PressCurve"\fP \fI"x1,y1,x2,y2"\fP sets pressure curve by control points x1, y1, x2, and y2. Their values are in range diff --git a/src/wcmConfig.c b/src/wcmConfig.c index 4caa529..3ccd902 100644 --- a/src/wcmConfig.c +++ b/src/wcmConfig.c @@ -448,6 +448,21 @@ static void wcmLinkTouchAndPen(InputInfoPtr pInfo) } } +/** + * Check if this device was hotplugged by the driver by checking the _source + * option. + * + * Must be called before wcmNeedAutoHotplug() + * + * @return True if the source for this device is the wacom driver itself or + * false otherwise. + */ +static int wcmIsHotpluggedDevice(InputInfoPtr pInfo) +{ + char *source = xf86CheckStrOption(pInfo->options, "_source", ""); + return !strcmp(source, "_driver/wacom"); +} + /* wcmPreInit - called for each input devices with the driver set to * "wacom" */ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 @@ -487,7 +502,7 @@ static int wcmPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) WacomCommonPtr common = NULL; const char* type; char* device, *oldname; - int need_hotplug = 0; + int need_hotplug = 0, is_dependent = 0; gWacomModule.wcmDrv = drv; @@ -534,7 +549,9 @@ static int wcmPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) oldname = pInfo->name; - if ((need_hotplug = wcmNeedAutoHotplug(pInfo, &type))) + if (wcmIsHotpluggedDevice(pInfo)) + is_dependent = 1; + else if ((need_hotplug = wcmNeedAutoHotplug(pInfo, &type))) { /* we need subdevices, change the name so all of them have a type. */ @@ -551,7 +568,7 @@ static int wcmPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) if (!wcmSetType(pInfo, type)) goto SetupProc_fail; - if (!wcmParseOptions(pInfo, need_hotplug)) + if (!wcmParseOptions(pInfo, need_hotplug, is_dependent)) goto SetupProc_fail; if (!wcmInitModel(pInfo)) diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c index 0b03952..610da22 100644 --- a/src/wcmValidateDevice.c +++ b/src/wcmValidateDevice.c @@ -513,6 +513,7 @@ int wcmNeedAutoHotplug(InputInfoPtr pInfo, const char **type) xf86Msg(X_INFO, "%s: type not specified, assuming '%s'.\n", pInfo->name, *type); xf86Msg(X_INFO, "%s: other types will be automatically added.\n", pInfo->name); + /* Note: wcmIsHotpluggedDevice() relies on this */ pInfo->options = xf86AddNewOption(pInfo->options, "Type", *type); pInfo->options = xf86ReplaceStrOption(pInfo->options, "_source", "_driver/wacom"); @@ -521,12 +522,16 @@ int wcmNeedAutoHotplug(InputInfoPtr pInfo, const char **type) /** * Parse the options for this device. + * Note that parameters is_primary and is_dependent are mutually exclusive, + * though both may be false in the case of an xorg.conf device. * - * @param is_primary True if the device is the primary/parent device for + * @param is_primary True if the device is the parent device for * hotplugging, False if the device is a depent or xorg.conf device. + * @param is_hotplugged True if the device is a dependent device, FALSE + * otherwise. * @retvalue True on success or False otherwise. */ -Bool wcmParseOptions(InputInfoPtr pInfo, Bool is_primary) +Bool wcmParseOptions(InputInfoPtr pInfo, Bool is_primary, Bool is_dependent) { WacomDevicePtr priv = (WacomDevicePtr)pInfo->private; WacomCommonPtr common = priv->common; @@ -588,8 +593,11 @@ Bool wcmParseOptions(InputInfoPtr pInfo, Bool is_primary) goto error; } - common->wcmRotate = rotation; - + if (is_dependent && rotation != common->wcmRotate) + xf86Msg(X_INFO, "%s: ignoring rotation of dependent" + " device\n", pInfo->name); + else + common->wcmRotate = rotation; } common->wcmRawSample = xf86SetIntOption(pInfo->options, "RawSample", diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h index 5351be2..013d378 100644 --- a/src/xf86Wacom.h +++ b/src/xf86Wacom.h @@ -140,7 +140,7 @@ extern int wcmNeedAutoHotplug(InputInfoPtr pInfo, const char **type); extern void wcmHotplugOthers(InputInfoPtr pInfo, const char *basename); /* setup */ -extern Bool wcmParseOptions(InputInfoPtr pInfo, Bool is_primary); +extern Bool wcmParseOptions(InputInfoPtr pInfo, Bool is_primary, Bool is_dependent); extern void wcmInitialCoordinates(InputInfoPtr pInfo, int axes); extern void wcmInitialScreens(InputInfoPtr pInfo); extern void wcmInitialScreens(InputInfoPtr pInfo); -- 1.7.4.2 ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Linuxwacom-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
