On Mon, Apr 4, 2011 at 11:53 PM, Peter Hutterer <[email protected]>wrote:

>
> 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.
>

I understand. The tag is based on the assumption that the patch is at least
tested with hotplugging.

Acked-by: Ping Cheng <[email protected]>.

Ping


>
>  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

Reply via email to