On Sun, Jan 22, 2012 at 8:49 PM, Peter Hutterer
<peter.hutte...@who-t.net> wrote:
> On Fri, Jan 20, 2012 at 10:55:59AM -0800, Jason Gerecke wrote:
>> On Thu, Jan 19, 2012 at 8:12 PM, Peter Hutterer
>> <peter.hutte...@who-t.net> wrote:
>> > CC-ing Eduard, since he's been working on this as well
>> >
>> > On Wed, Jan 18, 2012 at 08:15:47PM -0600, Chris Bagwell wrote:
>> >> Well, this showed up just in time for me to be conflicted.  I've
>> >> completed support for monitoring the battery on wireless bamboo's and
>> >> thinking about adding support to control powersavings timeout period
>> >> like Windows driver has.  Its kinda a waste unless there is a GUI to
>> >> go with it though.
>> >>
>> >> Since sysfs is only read/write by root, we need to overcome that.  I
>> >> was going to make a python daemon that advertises wacom sysfs changes
>> >> on DBUS and supports modifying timeout via DBUS requests. Then add
>> >> some sort of applet GUI for end users that talks over DBUS.
>> >>
>> >> Well, you've provided an interesting alternative to DBUS.  It solves
>> >> the root issue and if we could somehow do a select() on the sysfs then
>> >> I could monitor for battery changes as well and advertise changes as
>> >> property updates.
>> >>
>> >> For me, its probably the same amount of total code either way.  I need
>> >> to decide on if its appropriate to put these type of features into
>> >> xf86-input-wacom.
>> >>
>> >> I'm more comfortable working with DBUS then X properties (says the guy
>> >> working on X drivers :-) ) so probably why I chose it.
>> >>
>> >> I probably only have 1 code comment beyond a general concern if this
>> >> is a feature we should be support (I'd like to hear others opinions).
>> >> See below.
>> >
>> > the reason why I'd like to see this as a property is simple: graphical
>> > applications already communicate with the X server for events and thus have
>> > device-specific knowledge (XI/XI2 applications anyway). I consider the LED
>> > just as an additional feature on the device, so controlling it through a
>> > device property seems to make sense.
>> >
>> > Otherwise a client would have to figure out which device it is that needs
>> > the LED changed, hook up to sysfs (or some custom daemon). Said daemon 
>> > would
>> > need to provide notification systems (if more than one client access the
>> > LED), etc. All this infrastructure is already there in X, even if it may 
>> > not
>> > necessarily be the sanest infrastructure..
>> >
>> > Comments regarding the patch itself are in a separate email.
>> >
>> > Cheers,
>> >  Peter
>> >
>> This is actually kind of what I thought you were getting at the first
>> time you mentioned the idea of libwacom to me. An intermediary library
>> that takes the ugly out of working directly with the X properties that
>> we expose. Combined with a deep knowledge of the actual tablet,
>> clients could do some really neat things without having to duplicate
>> code. For example, it'd be awesome if clients could find out (or
>> libwacom somehow handled) the Intuos4's quirk where the first button
>> in the X properties is *not* the top-left button.
>
> refresh my memory: is this a bug or a feature?
> if it's a bug, I'd argue for not worrying about it too much, otherwise we'll
> just end up in ifdef hell.
>
While it'd be great if the driver made the hardware appear more
consistent, I really don't see that happening. Our X properties don't
carry enough semantic information to make it possible to (sanely)
handle quirks like button 1 on the Intuos4, and radically changing
them would just make the driver needlessly complex while
simultaneously breaking compatibility. Its not the fault of the driver
that button 1 is weird -- that's just the way the hardware *is*. There
should be a way for interested clients to learn about and deal with
these quirks, and going through the X server is not the answer.
Libwacom *may* be the answer (since they share a lot of common
ground), but it also might not be... I'm just mulling over the idea
out loud :)

>> Of course, the devil's in figuring out how to represent those quirks
>> (both to libwacom in its config files, and to clients via the API)...
>
> some of it is true. yes, I want libwacom to be a convenience library so that
> clients don't have to poke at properties around. Nonetheless, the above is
> still true - the client that has to do all the work would just be libwacom
> (plus any client not using it).
>
>> Or the quirk that
>> the 24HD can actually turn off all the LEDs in a bank since it only
>> has 3 of the expected 4 LEDs.
>
> other tablets can't turn off all LEDs?
>
That's correct. I'm not sure if future tablets will be like the 24HD
and let you turn them off, but the I4 and 21UX2 have no "off" option
I'm aware of. You might be able to fake it by setting the active and
inactive luminosity to zero, but I'm not sure if zero is really "off"
or just "dim".

> Cheers,
>  Peter
>
>> >> On Wed, Jan 18, 2012 at 6:25 PM, Ping Cheng <pingli...@gmail.com> wrote:
>> >> > Signed-off-by: Ping Cheng <pi...@wacom.com>
>> >> > ---
>> >> > Changes to v1:
>> >> > Updated test_parameter_number;
>> >> > Added DBG to report sysfs node.
>> >> > ---
>> >> >  include/wacom-properties.h |    3 ++
>> >> >  man/xsetwacom.man          |    7 ++++
>> >> >  src/wcmCommon.c            |    4 ++-
>> >> >  src/wcmConfig.c            |   67 
>> >> > +++++++++++++++++++++++++++++++++++++++++++-
>> >> >  src/wcmXCommand.c          |   39 +++++++++++++++++++++++++-
>> >> >  src/xf86Wacom.c            |   14 ++++++++-
>> >> >  src/xf86WacomDefs.h        |    6 +++-
>> >> >  tools/xsetwacom.c          |   18 +++++++++++-
>> >> >  8 files changed, 152 insertions(+), 6 deletions(-)
>> >> >
>> >> > diff --git a/include/wacom-properties.h b/include/wacom-properties.h
>> >> > index 0bb84b1..b2a3523 100644
>> >> > --- a/include/wacom-properties.h
>> >> > +++ b/include/wacom-properties.h
>> >> > @@ -46,6 +46,9 @@
>> >> >   */
>> >> >  #define WACOM_PROP_STRIPBUTTONS "Wacom Strip Buttons"
>> >> >
>> >> > +/* 8 bit, 2 values, LED0 (right side) and LED1 (left side) */
>> >> > +#define WACOM_PROP_LED "Wacom LEDs"
>> >> > +
>> >> >  /* 8 bit, 6 values, rel wheel up, rel wheel down, abs wheel up, abs 
>> >> > wheel down, abs wheel 2 up, abs wheel 2 down
>> >> >    OR
>> >> >    Atom, 6 values , rel wheel up, rel wheel down, abs wheel up, abs 
>> >> > wheel down, abs wheel 2 up, abs wheel 2 down
>> >> > diff --git a/man/xsetwacom.man b/man/xsetwacom.man
>> >> > index dc0995f..97da416 100644
>> >> > --- a/man/xsetwacom.man
>> >> > +++ b/man/xsetwacom.man
>> >> > @@ -201,6 +201,13 @@ sets the max distance from tablet to stop 
>> >> > reporting movement for cursor in
>> >> >  relative mode. Default for Intuos series is 10, for Graphire series 
>> >> > (including
>> >> >  Volitos) is 42. Only available for the cursor/puck device.
>> >> >  .TP
>> >> > +\fBLED0\fR status
>> >> > +Set the right LED status of an Intuos4/Cintiq 21UX/Cintiq 24HD. 
>> >> > Default:  0,
>> >> > +range of 0 to 3.
>> >> > +.TP
>> >> > +\fBLED1\fR status
>> >> > +Set the left LED status of a Cintiq 21UX/24HD. Default:  0, range of 0 
>> >> > to 3.
>> >> > +.TP
>> >> >  \fBThreshold\fR level
>> >> >  Set the minimum pressure necessary to generate a Button event for the 
>> >> > stylus
>> >> >  tip, eraser, or touch.  The pressure levels of all tablets are 
>> >> > normalized to
>> >> > diff --git a/src/wcmCommon.c b/src/wcmCommon.c
>> >> > index 0f041e3..e4a8630 100644
>> >> > --- a/src/wcmCommon.c
>> >> > +++ b/src/wcmCommon.c
>> >> > @@ -1,6 +1,6 @@
>> >> >  /*
>> >> >  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
>> >> > - * Copyright 2002-2010 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> > + * Copyright 2002-2012 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> >  *
>> >> >  * This program is free software; you can redistribute it and/or
>> >> >  * modify it under the terms of the GNU General Public License
>> >> > @@ -1472,6 +1472,8 @@ WacomCommonPtr wcmNewCommon(void)
>> >> >        common->wcmMaxStripY = 4096;       /* Max fingerstrip Y */
>> >> >        common->wcmMaxtiltX = 128;         /* Max tilt in X directory */
>> >> >        common->wcmMaxtiltY = 128;         /* Max tilt in Y directory */
>> >> > +       common->fd_sysfs0 = -1;            /* file descriptor to sysfs 
>> >> > led0 */
>> >> > +       common->fd_sysfs1 = -1;            /* file descriptor to sysfs 
>> >> > led1 */
>> >> >        common->wcmCursorProxoutDistDefault = PROXOUT_INTUOS_DISTANCE;
>> >> >                        /* default to Intuos */
>> >> >        common->wcmSuppress = DEFAULT_SUPPRESS;
>> >> > diff --git a/src/wcmConfig.c b/src/wcmConfig.c
>> >> > index 5920e11..aff8b0f 100644
>> >> > --- a/src/wcmConfig.c
>> >> > +++ b/src/wcmConfig.c
>> >> > @@ -1,6 +1,6 @@
>> >> >  /*
>> >> >  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
>> >> > - * Copyright 2002-2010 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> > + * Copyright 2002-2012 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> >  *
>> >> >  * This program is free software; you can redistribute it and/or
>> >> >  * modify it under the terms of the GNU General Public License
>> >> > @@ -21,6 +21,7 @@
>> >> >  #include <config.h>
>> >> >  #endif
>> >> >
>> >> > +#include <libudev.h>
>> >> >  #include "xf86Wacom.h"
>> >> >  #include "wcmFilter.h"
>> >> >  #include <sys/stat.h>
>> >> > @@ -441,6 +442,65 @@ static int wcmIsHotpluggedDevice(InputInfoPtr 
>> >> > pInfo)
>> >> >        return !strcmp(source, "_driver/wacom");
>> >> >  }
>> >> >
>> >> > +static void wcmStoreLEDsysfsInfo(InputInfoPtr pInfo)
>> >> > +{
>> >> > +       WacomDevicePtr  priv = (WacomDevicePtr)pInfo->private;
>> >> > +       WacomCommonPtr  common = priv->common;
>> >> > +       struct stat st;
>> >> > +       struct udev *udev = udev_new();
>> >> > +       struct udev_device *parent;
>> >> > +       struct udev_device *device;
>> >> > +       char fs_path[128], buf[10];
>> >> > +       int err = -1;
>> >> > +
>> >> > +       stat(common->device_path, &st);
>> >> > +       device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
>> >> > +       if (!device)
>> >> > +               return;
>> >> > +
>> >> > +       parent = udev_device_get_parent_with_subsystem_devtype(device,
>> >> > +                "usb", NULL);
>> >> > +
>> >> > +       if (!parent)
>> >> > +               return;
>> >> > +
>> >> > +       sprintf(fs_path, "%s/wacom_led/status_led0_select",
>> >> > +               udev_device_get_syspath(parent));
>> >> > +       common->fd_sysfs0 = open(fs_path, O_RDWR);
>> >> > +       if (common->fd_sysfs0 >= 0)
>> >> > +       {
>> >> > +               SYSCALL(err = read(common->fd_sysfs0, buf, 1));
>> >> > +               if (err < -1)
>> >> > +               {
>> >> > +                       xf86Msg(X_WARNING, "%s: failed to get led0 
>> >> > status in "
>> >> > +                               "wcmStoreLEDsysfsInfo.\n", pInfo->name);
>> >> > +               }
>> >> > +               else
>> >> > +                       common->led0_status = buf[0] - '0';
>> >> > +       }
>> >> > +       else
>> >> > +               DBG(2, common, "No LED0 sysfs on %s for %s\n",
>> >> > +                                       fs_path, pInfo->name);
>> >> > +
>> >> > +       sprintf(fs_path, "%s/wacom_led/status_led1_select",
>> >> > +               udev_device_get_syspath(parent));
>> >> > +       common->fd_sysfs1 = open(fs_path, O_RDWR);
>> >> > +       if (common->fd_sysfs1 >= 0)
>> >> > +       {
>> >> > +               SYSCALL(err = read(common->fd_sysfs1, buf, 1));
>> >> > +               if (err < -1)
>> >> > +               {
>> >> > +                       xf86Msg(X_WARNING, "%s: failed to get led1 
>> >> > status in "
>> >> > +                               "wcmStoreLEDsysfsInfo.\n", pInfo->name);
>> >> > +               }
>> >> > +               else
>> >> > +                       common->led1_status = buf[0] - '0';
>> >> > +       }
>> >> > +       else
>> >> > +               DBG(2, common, "No LED1 sysfs on %s for %s\n",
>> >> > +                                       fs_path, pInfo->name);
>> >>
>> >> This is complicated enough that I'd factor it out into a function for
>> >> common behavior or at list make it a for() loop somehow.
>> >>
>> >> Chris
>> >>
>> >> > +}
>> >> > +
>> >> >  /* wcmPreInit - called for each input devices with the driver set to
>> >> >  * "wacom" */
>> >> >  #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
>> >> > @@ -524,9 +584,14 @@ static int wcmPreInit(InputDriverPtr drv, 
>> >> > InputInfoPtr pInfo, int flags)
>> >> >
>> >> >        /* check if this is the first tool on the port */
>> >> >        if (!wcmMatchDevice(pInfo, &common))
>> >> > +       {
>> >> >                /* initialize supported keys with the first tool on the 
>> >> > port */
>> >> >                wcmDeviceTypeKeys(pInfo);
>> >> >
>> >> > +               /* store lED sysfs file descriptor and initial status */
>> >> > +               wcmStoreLEDsysfsInfo(pInfo);
>> >> > +       }
>> >> > +
>> >> >        common->debugLevel = xf86SetIntOption(pInfo->options,
>> >> >                                              "CommonDBG", 
>> >> > common->debugLevel);
>> >> >        oldname = pInfo->name;
>> >> > diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c
>> >> > index 40393dc..aec3fee 100644
>> >> > --- a/src/wcmXCommand.c
>> >> > +++ b/src/wcmXCommand.c
>> >> > @@ -1,5 +1,5 @@
>> >> >  /*
>> >> > - * Copyright 2007-2010 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> > + * Copyright 2007-2012 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> >  *
>> >> >  * This program is free software; you can redistribute it and/or
>> >> >  * modify it under the terms of the GNU General Public License
>> >> > @@ -91,6 +91,7 @@ Atom prop_tv_resolutions;
>> >> >  Atom prop_cursorprox;
>> >> >  Atom prop_threshold;
>> >> >  Atom prop_suppress;
>> >> > +Atom prop_led;
>> >> >  Atom prop_touch;
>> >> >  Atom prop_gesture;
>> >> >  Atom prop_gesture_param;
>> >> > @@ -206,6 +207,10 @@ void InitWcmDeviceProperties(InputInfoPtr pInfo)
>> >> >        values[1] = common->wcmRawSample;
>> >> >        prop_suppress = InitWcmAtom(pInfo->dev, WACOM_PROP_SAMPLE, 
>> >> > XA_INTEGER, 32, 2, values);
>> >> >
>> >> > +       values[0] = common->led0_status;
>> >> > +       values[1] = common->led1_status;
>> >> > +       prop_led = InitWcmAtom(pInfo->dev, WACOM_PROP_LED, XA_INTEGER, 
>> >> > 8, 2, values);
>> >> > +
>> >> >        values[0] = common->wcmTouch;
>> >> >        prop_touch = InitWcmAtom(pInfo->dev, WACOM_PROP_TOUCH, 
>> >> > XA_INTEGER, 8, 1, values);
>> >> >
>> >> > @@ -695,6 +700,38 @@ int wcmSetProperty(DeviceIntPtr dev, Atom 
>> >> > property, XIPropertyValuePtr prop,
>> >> >                        common->wcmSuppress = values[0];
>> >> >                        common->wcmRawSample = values[1];
>> >> >                }
>> >> > +       } else if (property == prop_led)
>> >> > +       {
>> >> > +               CARD8 *values;
>> >> > +
>> >> > +               if (prop->size != 2 || prop->format != 8)
>> >> > +                       return BadValue;
>> >> > +
>> >> > +               values = (CARD8*)prop->data;
>> >> > +
>> >> > +               if ((values[0] < 0) || (values[0] > 3))
>> >> > +                       return BadValue;
>> >> > +               else if ((common->fd_sysfs0 >= 0) && !checkonly)
>> >> > +               {
>> >> > +                       char buf[10];
>> >> > +                       int err = -1;
>> >> > +                       sprintf(buf, "%d", values[0]);
>> >> > +                       err = xf86WriteSerial(common->fd_sysfs0, buf, 
>> >> > strlen(buf));
>> >> > +                       if (err == strlen(buf))
>> >> > +                               common->led0_status = values[0];
>> >> > +               }
>> >> > +
>> >> > +               if ((values[1] < 0) || (values[1] > 3))
>> >> > +                       return BadValue;
>> >> > +               else if ((common->fd_sysfs1 >= 0) && !checkonly)
>> >> > +               {
>> >> > +                       char buf[10];
>> >> > +                       int err = -1;
>> >> > +                       sprintf(buf, "%d", values[1]);
>> >> > +                       err = xf86WriteSerial(common->fd_sysfs1, buf, 
>> >> > strlen(buf));
>> >> > +                       if (err == strlen(buf))
>> >> > +                               common->led1_status = values[1];
>> >> > +               }
>> >> >        } else if (property == prop_rotation)
>> >> >        {
>> >> >                CARD8 value;
>> >> > diff --git a/src/xf86Wacom.c b/src/xf86Wacom.c
>> >> > index d1c149f..de7135c 100644
>> >> > --- a/src/xf86Wacom.c
>> >> > +++ b/src/xf86Wacom.c
>> >> > @@ -1,6 +1,6 @@
>> >> >  /*
>> >> >  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
>> >> > - * Copyright 2002-2010 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> > + * Copyright 2002-2012 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> >  *
>> >> >  * This program is free software; you can redistribute it and/or
>> >> >  * modify it under the terms of the GNU General Public License
>> >> > @@ -770,6 +770,18 @@ static void wcmDevClose(InputInfoPtr pInfo)
>> >> >                        xf86CloseSerial (common->fd);
>> >> >                }
>> >> >        }
>> >> > +
>> >> > +       if (common->fd_sysfs0 >= 0)
>> >> > +       {
>> >> > +               xf86CloseSerial(common->fd_sysfs0);
>> >> > +               common->fd_sysfs0 = -1;
>> >> > +       }
>> >> > +
>> >> > +       if (common->fd_sysfs1 >= 0)
>> >> > +       {
>> >> > +               xf86CloseSerial(common->fd_sysfs1);
>> >> > +               common->fd_sysfs1 = -1;
>> >> > +       }
>> >> >  }
>> >> >
>> >> >  static void wcmEnableDisableTool(DeviceIntPtr dev, Bool enable)
>> >> > diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
>> >> > index 2f3f7b4..22dea41 100644
>> >> > --- a/src/xf86WacomDefs.h
>> >> > +++ b/src/xf86WacomDefs.h
>> >> > @@ -1,6 +1,6 @@
>> >> >  /*
>> >> >  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
>> >> > - * Copyright 2002-2010 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> > + * Copyright 2002-2012 by Ping Cheng, Wacom. <pi...@wacom.com>
>> >> >  *
>> >> >  * This program is free software; you can redistribute it and/or
>> >> >  * modify it under the terms of the GNU General Public License
>> >> > @@ -420,6 +420,10 @@ struct _WacomCommonRec
>> >> >        int tablet_type;             /* bitmask of tablet features 
>> >> > (WCM_LCD, WCM_PEN, etc) */
>> >> >        int fd;                      /* file descriptor to tablet */
>> >> >        int fd_refs;                 /* number of references to fd; if 
>> >> > =0, fd is invalid */
>> >> > +       int fd_sysfs0;               /* file descriptor to sysfs led0 */
>> >> > +       int fd_sysfs1;               /* file descriptor to sysfs led1 */
>> >> > +       unsigned char led0_status;   /* Right LED status */
>> >> > +       unsigned char led1_status;   /* Left LED status */
>> >> >        unsigned long wcmKeys[NBITS(KEY_MAX)]; /* supported tool types 
>> >> > for the device */
>> >> >        WacomDevicePtr wcmTouchDevice; /* The pointer for pen to access 
>> >> > the
>> >> >                                          touch tool of the same device 
>> >> > id */
>> >> > diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
>> >> > index 9ab285b..fa22352 100644
>> >> > --- a/tools/xsetwacom.c
>> >> > +++ b/tools/xsetwacom.c
>> >> > @@ -361,6 +361,22 @@ static param_t parameters[] =
>> >> >                .get_func = get_map,
>> >> >        },
>> >> >        {
>> >> > +               .name = "LED0",
>> >> > +               .desc = "Sets right LED status ",
>> >> > +               .prop_name = WACOM_PROP_LED,
>> >> > +               .prop_format = 8,
>> >> > +               .prop_offset = 0,
>> >> > +               .arg_count = 1,
>> >> > +       },
>> >> > +       {
>> >> > +               .name = "LED1",
>> >> > +               .desc = "Sets left LED status ",
>> >> > +               .prop_name = WACOM_PROP_LED,
>> >> > +               .prop_format = 8,
>> >> > +               .prop_offset = 1,
>> >> > +               .arg_count = 1,
>> >> > +       },
>> >> > +       {
>> >> >                .name = "Threshold",
>> >> >                .desc = "Sets tip/eraser pressure threshold "
>> >> >                "(default is 27). ",
>> >> > @@ -2689,7 +2705,7 @@ static void test_parameter_number(void)
>> >> >         * deprecated them.
>> >> >         * Numbers include trailing NULL entry.
>> >> >         */
>> >> > -       assert(ARRAY_SIZE(parameters) == 36);
>> >> > +       assert(ARRAY_SIZE(parameters) == 38);
>> >> >        assert(ARRAY_SIZE(deprecated_parameters) == 17);
>> >> >  }
>> >> >
>> >> > --
>> >> > 1.7.6.4
>> >> >
>> >> >
>> >> > ------------------------------------------------------------------------------
>> >> > Keep Your Developer Skills Current with LearnDevNow!
>> >> > The most comprehensive online learning library for Microsoft developers
>> >> > is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
>> >> > Metro Style Apps, more. Free future releases when you subscribe now!
>> >> > http://p.sf.net/sfu/learndevnow-d2d
>> >> > _______________________________________________
>> >> > Linuxwacom-devel mailing list
>> >> > Linuxwacom-devel@lists.sourceforge.net
>> >> > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>> >>
>> >> ------------------------------------------------------------------------------
>> >> Keep Your Developer Skills Current with LearnDevNow!
>> >> The most comprehensive online learning library for Microsoft developers
>> >> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
>> >> Metro Style Apps, more. Free future releases when you subscribe now!
>> >> http://p.sf.net/sfu/learndevnow-d2d
>> >> _______________________________________________
>> >> Linuxwacom-devel mailing list
>> >> Linuxwacom-devel@lists.sourceforge.net
>> >> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>> >>
>> > Cheers,
>> >  Peter
>> >
>> > ------------------------------------------------------------------------------
>> > Keep Your Developer Skills Current with LearnDevNow!
>> > The most comprehensive online learning library for Microsoft developers
>> > is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
>> > Metro Style Apps, more. Free future releases when you subscribe now!
>> > http://p.sf.net/sfu/learndevnow-d2d
>> > _______________________________________________
>> > Linuxwacom-devel mailing list
>> > Linuxwacom-devel@lists.sourceforge.net
>> > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>>



Jason

---
Day xee-nee-svsh duu-'ushtlh-ts'it;
nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it.
Huu-chan xuu naa~-gha.

------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to