On Tue, Nov 30, 2010 at 09:23:47AM +0200, Alexia Death wrote: > Just out of curiosity, why is this better than the get > handler/old_serial way I solved it?
sorry, I had only looked at your first patch before I wrote this patch and that one didn't include the property update. I'll comment on it in-line in your patch, that's easier and reduces duplication on the list where to look for the answer. For the reply, see the thread here: http://old.nabble.com/Support-for-multiple-separate-pens-hotplug-in-new-X-driver-with-wip-patch-to30317565.html Cheers, Peter > One reason I can see is that it > offers a place to hook the auto-spawning of serial tools to. But that > doesn't cover the use of timer to update the property. Updating the > property when anyone who cares about it asks it is soon enough, no? > Sorry, if my questions are a bother, just trying to understand... > > On Tue, Nov 30, 2010 at 7:29 AM, 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); > > > > /* 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 > > > > > > -- > --Alexia > ------------------------------------------------------------------------------ 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
