On Mon, Nov 29, 2010 at 11:29 PM, Peter Hutterer
<[email protected]> wrote:
> Our serial number is always 0 to begin with. The event processing code knows
> the serial number of the tool but didn't pass it on. This patch hooks into
> the processing code to update the serial number in the device property.
>
> Because of SIGIO malloc restrictions, the property must be updated through a
> timer function.
>
> Reported-by: Alexia Death <[email protected]>
> Signed-off-by: Peter Hutterer <[email protected]>
> ---
> src/wcmCommon.c | 16 +++++++++-----
> src/wcmConfig.c | 4 +++
> src/wcmXCommand.c | 56
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> src/xf86Wacom.h | 1 +
> src/xf86WacomDefs.h | 2 +
> 5 files changed, 73 insertions(+), 6 deletions(-)
>
> diff --git a/src/wcmCommon.c b/src/wcmCommon.c
> index 5264ba5..3d52fd6 100644
> --- a/src/wcmCommon.c
> +++ b/src/wcmCommon.c
> @@ -594,13 +594,17 @@ void wcmSendEvents(InputInfoPtr pInfo, const
> WacomDeviceState* ds)
> int naxes = priv->naxes;
> int v3, v4, v5;
>
> - if (priv->serial && serial != priv->serial)
> + if (priv->serial)
> {
> - DBG(10, priv, "serial number"
> - " is %u but your system configured %u",
> - serial, (int)priv->serial);
> - return;
> - }
> + if (serial != priv->serial)
> + {
> + DBG(10, priv, "serial number"
> + " is %u but your system configured
> %u",
> + serial, (int)priv->serial);
> + return;
> + }
> + } else
> + wcmUpdateSerial(pInfo, serial);
Alexia got me thinking about this as well. I was thinking originally
that it could be done one function back; in commonDispatchDevice().
Here is were we map device_type of incoming event to a specific
hotplug device:
/* Find the device the current events are meant for */
/* 1: Find the tool (the one with correct serial or in second
* hand, the one with serial set to 0 if no match with the
* specified serial exists) that is used for this event */
for (tool = common->wcmTool; tool; tool = tool->next)
{
if (tool->typeid == ds->device_type)
{
if (tool->serial == ds->serial_num)
break;
else if (!tool->serial)
tooldef = tool;
}
}
So its an option to set serial # in that "else if (!tool->serial)" and
also break out of loop. Then we can get rid of that "tooldef" concept
since serial #'s will match and protocol GENERIC and protocol 4 always
use fixed serial #'s for same device_type's based on channel #.
We could also auto-hotplug a new tool if the for() loop ever hits end
without finding matching serial # or a case were tool->serial == 0.
This is only an untested idea that might have issues... so either way
you decide will get us new useful behavior:
Acked-by: Chris Bagwell <[email protected]>
Chris
>
> /* don't move the cursor when going out-prox */
> if (!ds->proximity)
> diff --git a/src/wcmConfig.c b/src/wcmConfig.c
> index d660088..efdc659 100644
> --- a/src/wcmConfig.c
> +++ b/src/wcmConfig.c
> @@ -142,6 +142,9 @@ static int wcmAllocate(InputInfoPtr pInfo)
> area->next = NULL; /* next area in list */
> area->device = pInfo; /* associated WacomDevice */
>
> + /* timers */
> + priv->serial_timer = TimerSet(NULL, 0, 0, NULL, NULL);
> +
> return 1;
>
> error:
> @@ -164,6 +167,7 @@ static void wcmFree(InputInfoPtr pInfo)
> if (!priv)
> return;
>
> + TimerFree(priv->serial_timer);
> free(priv->toolarea);
> free(priv->tool);
> wcmFreeCommon(&priv->common);
> diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c
> index 1b36280..58c95c9 100644
> --- a/src/wcmXCommand.c
> +++ b/src/wcmXCommand.c
> @@ -24,6 +24,7 @@
> #include "xf86Wacom.h"
> #include "wcmFilter.h"
> #include <exevents.h>
> +#include <xf86_OSproc.h>
>
> /*****************************************************************************
> * wcmDevSwitchModeCall --
> @@ -687,6 +688,14 @@ int wcmSetProperty(DeviceIntPtr dev, Atom property,
> XIPropertyValuePtr prop,
> wcmRotateTablet(pInfo, value);
> } else if (property == prop_serials)
> {
> + /* This property is read-only but we need to
> + * set it at runtime. If we get here from wcmUpdateSerial,
> + * we know the serial has ben set internally already, so we
> + * can reply with success. */
> + if (prop->size == 4 && prop->format == 32)
> + if (((CARD32*)prop->data)[3] == priv->serial)
> + return Success;
> +
> return BadValue; /* Read-only */
> } else if (property == prop_strip_buttons)
> return wcmSetStripProperty(dev, property, prop, checkonly);
> @@ -842,4 +851,51 @@ int wcmSetProperty(DeviceIntPtr dev, Atom property,
> XIPropertyValuePtr prop,
>
> return Success;
> }
> +
> +static CARD32
> +serialTimerFunc(OsTimerPtr timer, CARD32 now, pointer arg)
> +{
> + InputInfoPtr pInfo = arg;
> + WacomDevicePtr priv = pInfo->private;
> + XIPropertyValuePtr prop;
> + CARD32 prop_value[4];
> + int sigstate;
> + int rc;
> +
> + sigstate = xf86BlockSIGIO();
> +
> + rc = XIGetDeviceProperty(pInfo->dev, prop_serials, &prop);
> + if (rc != Success || prop->format != 32 || prop->size != 4)
> + {
> + xf86Msg(X_ERROR, "%s: Failed to update serial number.\n",
> + pInfo->name);
> + return 0;
> + }
> +
> + memcpy(prop_value, prop->data, sizeof(prop_value));
> + prop_value[3] = priv->serial;
> +
> + XIChangeDeviceProperty(pInfo->dev, prop_serials, XA_INTEGER,
> + prop->format, PropModeReplace,
> + prop->size, prop_value, TRUE);
> +
> + xf86UnblockSIGIO(sigstate);
> +
> + return 0;
> +}
> +
> +void
> +wcmUpdateSerial(InputInfoPtr pInfo, int serial)
> +{
> + WacomDevicePtr priv = pInfo->private;
> + if (!serial || priv->serial == serial)
> + return;
> +
> + priv->serial = serial;
> + /* This function is called during SIGIO. Schedule timer for property
> + * event delivery outside of signal handler. */
> + priv->serial_timer = TimerSet(priv->serial_timer, 0 /* reltime */,
> + 1, serialTimerFunc, pInfo);
> +}
> +
> /* vim: set noexpandtab tabstop=8 shiftwidth=8: */
> diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h
> index bcc3b73..ff8841b 100644
> --- a/src/xf86Wacom.h
> +++ b/src/xf86Wacom.h
> @@ -176,6 +176,7 @@ extern int wcmGetPhyDeviceID(WacomDevicePtr priv);
> extern int wcmSetProperty(DeviceIntPtr dev, Atom property,
> XIPropertyValuePtr prop, BOOL checkonly);
> extern int wcmDeleteProperty(DeviceIntPtr dev, Atom property);
> extern void InitWcmDeviceProperties(InputInfoPtr pInfo);
> +extern void wcmUpdateSerial(InputInfoPtr pInfo, int serial);
>
> /* Utility functions */
> extern Bool is_absolute(InputInfoPtr pInfo);
> diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
> index 8cdc9e2..98b7f21 100644
> --- a/src/xf86WacomDefs.h
> +++ b/src/xf86WacomDefs.h
> @@ -264,6 +264,8 @@ struct _WacomDeviceRec
> Atom btn_actions[WCM_MAX_BUTTONS];
> Atom wheel_actions[4];
> Atom strip_actions[4];
> +
> + OsTimerPtr serial_timer;
> };
>
> /******************************************************************************
> --
> 1.7.3.2
>
> ------------------------------------------------------------------------------
> Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
> Tap into the largest installed PC base & get more eyes on your game by
> optimizing for Intel(R) Graphics Technology. Get started today with the
> Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
> http://p.sf.net/sfu/intelisp-dev2dev
> _______________________________________________
> Linuxwacom-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel