On Thu, Oct 26, 2017 at 11:09 AM, Jason Gerecke <killert...@gmail.com>
wrote:
> These three devices share very similar pad report formats, so there is
> little reason to have a near-duplicate IRQ handler specific for the Intuos
> Pro. This commit merges the wacom_mspro_pad_irq and wacom_intuosp2_pad_irq
> functions into one.
>
> Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
> ---
> 2.6.30/wacom_wac.c | 106 ++++++++++++------------------
> -----------------------
> 2.6.36/wacom_wac.c | 103 +++++++++++-------------------
> ---------------------
> 2.6.38/wacom_wac.c | 103 +++++++++++-------------------
> ---------------------
> 3.7/wacom_wac.c | 103 +++++++++++-------------------
> ---------------------
> 4 files changed, 90 insertions(+), 325 deletions(-)
>
> diff --git a/2.6.30/wacom_wac.c b/2.6.30/wacom_wac.c
> index 31629c7..78d6858 100644
> --- a/2.6.30/wacom_wac.c
> +++ b/2.6.30/wacom_wac.c
> @@ -1516,11 +1516,13 @@ static int wacom_tpc_irq(struct wacom_wac *wacom,
> size_t len)
>
> static int wacom_mspro_pad_irq(struct wacom_wac *wacom)
> {
> + struct wacom_features *features = &wacom->features;
> unsigned char *data = wacom->data;
> struct input_dev *input = wacom->input;
> - int nbuttons = wacom->features.numbered_buttons;
> - bool prox, ringstatus;
> - int buttons, ring;
> + int nbuttons = features->numbered_buttons;
> + bool prox;
> + int buttons, ring, ringvalue;
> + bool active = false;
>
> switch (nbuttons) {
> case 11:
> @@ -1529,53 +1531,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> case 13:
> buttons = data[1] | (data[3] << 8);
> break;
> - default:
> - if (nbuttons)
> - dev_warn(input->dev.parent, "%s:
> unsupported device #%d\n", __func__, data[0]);
> - return 0;
> - }
> -
> - ring = le16_to_cpup((__le16 *)&data[4]);
> - ringstatus = ring & 0x80;
> -
> - if (input->id.product == 0x34d || input->id.product == 0x34e) {
> - /* MobileStudio Pro */
> - ring = 35 - (ring & 0x7F);
> - ring += 36/2;
> - if (ring > 35)
> - ring -= 36;
> - }
> - else {
> - /* "Standard" devices */
> - ring = 71 - (ring & 0x7F);
> - ring += 72/4;
> - if (ring > 71)
> - ring -= 72;
> - }
> -
> - prox = buttons || ringstatus;
> -
> - wacom_report_numbered_buttons(input, nbuttons, buttons);
> - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0);
> -
> - input_report_key(input, wacom->tool[1], prox ? 1 : 0);
> - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
> -
> - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
> -
> - return 1;
> -}
> -
> -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> - int nbuttons = wacom->features.numbered_buttons;
> - bool prox;
> - int buttons, ring, ringvalue;
> - bool active = false;
> -
> - switch (nbuttons) {
> case 9:
> buttons = (data[1]) | (data[3] << 8);
> break;
> @@ -1586,17 +1541,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac
> *wacom)
>
> ring = le16_to_cpup((__le16 *)&data[4]);
> /* Fix touchring data: userspace expects 0 at left and increasing
> clockwise */
> - ringvalue = 71 - (ring & 0x7F);
> if (input->id.product == 0x357 || input->id.product == 0x358) {
> /* 2nd-gen Intuos Pro */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 3*72/16;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> + }
> + else if (input->id.product == 0x34d || input->id.product == 0x34e)
> {
> + /* MobileStudio Pro */
> + ringvalue = 35 - (ring & 0x7F);
> + ringvalue += 36/2;
> + if (ringvalue > 35)
> + ringvalue -= 36;
> }
> else {
> /* "Standard" devices */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 72/4;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> }
> - if (ringvalue > 71)
> - ringvalue -= 72;
>
> if (ring != WACOM_INTUOSP2_RING_UNTOUCHED)
> prox = buttons || ring;
> @@ -1726,26 +1691,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom)
> return 0;
> }
>
> -static int wacom_intuosp2_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> -
> - switch (data[0]) {
> - case WACOM_REPORT_MSPRO:
> - return wacom_mspro_pen_irq(wacom);
> - case WACOM_REPORT_MSPROPAD:
> - return wacom_intuosp2_pad_irq(wacom);
> - case WACOM_REPORT_MSPRODEVICE:
> - return 0;
> - default:
> - dev_dbg(input->dev.parent,
> - "%s: received unknown report #%d\n",
> __func__, data[0]);
> - break;
> - }
> - return 0;
> -}
> -
> void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> {
> bool sync;
> @@ -1807,7 +1752,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> break;
>
> case WACOM_MSPRO:
> - sync = wacom_mspro_irq(wacom_wac);
> + case INTUOSP2:
> + if (len == WACOM_PKGLEN_INTUOSP2T &&
> + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> + sync = wacom_multitouch_generic(wacom_wac);
> + else
> + sync = wacom_mspro_irq(wacom_wac);
> break;
>
> case DTH1152T:
> @@ -1827,14 +1777,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> sync = wacom_intuos_irq(wacom_wac);
> break;
>
> - case INTUOSP2:
> - if (len == WACOM_PKGLEN_INTUOSP2T &&
> - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> - sync = wacom_multitouch_generic(wacom_wac);
> - else
> - sync = wacom_intuosp2_irq(wacom_wac);
> - break;
> -
> case TABLETPC:
> case TABLETPC2FG:
> case MTTPC:
> diff --git a/2.6.36/wacom_wac.c b/2.6.36/wacom_wac.c
> index 0339618..9be5390 100644
> --- a/2.6.36/wacom_wac.c
> +++ b/2.6.36/wacom_wac.c
> @@ -1366,8 +1366,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> unsigned char *data = wacom->data;
> struct input_dev *input = wacom->input;
> int nbuttons = features->numbered_buttons;
> - bool prox, ringstatus;
> - int buttons, ring;
> + bool prox;
> + int buttons, ring, ringvalue;
> + bool active = false;
>
> switch (nbuttons) {
> case 11:
> @@ -1376,53 +1377,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> case 13:
> buttons = data[1] | (data[3] << 8);
> break;
> - default:
> - if (nbuttons)
> - dev_warn(input->dev.parent, "%s:
> unsupported device #%d\n", __func__, data[0]);
> - return 0;
> - }
> -
> - ring = le16_to_cpup((__le16 *)&data[4]);
> - ringstatus = ring & 0x80;
> -
> - if (input->id.product == 0x34d || input->id.product == 0x34e) {
> - /* MobileStudio Pro */
> - ring = 35 - (ring & 0x7F);
> - ring += 36/2;
> - if (ring > 35)
> - ring -= 36;
> - }
> - else {
> - /* "Standard" devices */
> - ring = 71 - (ring & 0x7F);
> - ring += 72/4;
> - if (ring > 71)
> - ring -= 72;
> - }
> -
> - prox = buttons || ringstatus;
> -
> - wacom_report_numbered_buttons(input, nbuttons, buttons);
> - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0);
> -
> - input_report_key(input, wacom->tool[1], prox ? 1 : 0);
> - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
> -
> - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
> -
> - return 1;
> -}
> -
> -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> - int nbuttons = wacom->features.numbered_buttons;
> - bool prox;
> - int buttons, ring, ringvalue;
> - bool active = false;
> -
> - switch (nbuttons) {
> case 9:
> buttons = (data[1]) | (data[3] << 8);
> break;
> @@ -1433,17 +1387,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac
> *wacom)
>
> ring = le16_to_cpup((__le16 *)&data[4]);
> /* Fix touchring data: userspace expects 0 at left and increasing
> clockwise */
> - ringvalue = 71 - (ring & 0x7F);
> if (input->id.product == 0x357 || input->id.product == 0x358) {
> /* 2nd-gen Intuos Pro */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 3*72/16;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> + }
> + else if (input->id.product == 0x34d || input->id.product == 0x34e)
> {
> + /* MobileStudio Pro */
> + ringvalue = 35 - (ring & 0x7F);
> + ringvalue += 36/2;
> + if (ringvalue > 35)
> + ringvalue -= 36;
> }
> else {
> /* "Standard" devices */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 72/4;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> }
> - if (ringvalue > 71)
> - ringvalue -= 72;
>
> if (ring != WACOM_INTUOSP2_RING_UNTOUCHED)
> prox = buttons || ring;
> @@ -1571,26 +1535,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom)
> return 0;
> }
>
> -static int wacom_intuosp2_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> -
> - switch (data[0]) {
> - case WACOM_REPORT_MSPRO:
> - return wacom_mspro_pen_irq(wacom);
> - case WACOM_REPORT_MSPROPAD:
> - return wacom_intuosp2_pad_irq(wacom);
> - case WACOM_REPORT_MSPRODEVICE:
> - return 0;
> - default:
> - dev_dbg(input->dev.parent,
> - "%s: received unknown report #%d\n",
> __func__, data[0]);
> - break;
> - }
> - return 0;
> -}
> -
> void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> {
> bool sync;
> @@ -1651,20 +1595,17 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> break;
>
> case WACOM_MSPRO:
> - sync = wacom_mspro_irq(wacom_wac);
> - break;
> -
> - case DTH1152T:
> - case WACOM_MSPROT:
> - sync = wacom_multitouch_generic(wacom_wac);
> - break;
> -
> case INTUOSP2:
> if (len == WACOM_PKGLEN_INTUOSP2T &&
> wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> sync = wacom_multitouch_generic(wacom_wac);
> else
> - sync = wacom_intuosp2_irq(wacom_wac);
> + sync = wacom_mspro_irq(wacom_wac);
> + break;
> +
> + case DTH1152T:
> + case WACOM_MSPROT:
> + sync = wacom_multitouch_generic(wacom_wac);
> break;
>
> case TABLETPC:
> diff --git a/2.6.38/wacom_wac.c b/2.6.38/wacom_wac.c
> index 6454465..c7ceb3d 100644
> --- a/2.6.38/wacom_wac.c
> +++ b/2.6.38/wacom_wac.c
> @@ -1828,8 +1828,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> unsigned char *data = wacom->data;
> struct input_dev *input = wacom->input;
> int nbuttons = features->numbered_buttons;
> - bool prox, ringstatus;
> - int buttons, ring;
> + bool prox;
> + int buttons, ring, ringvalue;
> + bool active = false;
>
> switch (nbuttons) {
> case 11:
> @@ -1838,53 +1839,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> case 13:
> buttons = data[1] | (data[3] << 8);
> break;
> - default:
> - if (nbuttons)
> - dev_warn(input->dev.parent, "%s:
> unsupported device #%d\n", __func__, data[0]);
> - return 0;
> - }
> -
> - ring = le16_to_cpup((__le16 *)&data[4]);
> - ringstatus = ring & 0x80;
> -
> - if (input->id.product == 0x34d || input->id.product == 0x34e) {
> - /* MobileStudio Pro */
> - ring = 35 - (ring & 0x7F);
> - ring += 36/2;
> - if (ring > 35)
> - ring -= 36;
> - }
> - else {
> - /* "Standard" devices */
> - ring = 71 - (ring & 0x7F);
> - ring += 72/4;
> - if (ring > 71)
> - ring -= 72;
> - }
> -
> - prox = buttons || ringstatus;
> -
> - wacom_report_numbered_buttons(input, nbuttons, buttons);
> - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0);
> -
> - input_report_key(input, wacom->tool[1], prox ? 1 : 0);
> - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
> -
> - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
> -
> - return 1;
> -}
> -
> -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> - int nbuttons = wacom->features.numbered_buttons;
> - bool prox;
> - int buttons, ring, ringvalue;
> - bool active = false;
> -
> - switch (nbuttons) {
> case 9:
> buttons = (data[1]) | (data[3] << 8);
> break;
> @@ -1895,17 +1849,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac
> *wacom)
>
> ring = le16_to_cpup((__le16 *)&data[4]);
> /* Fix touchring data: userspace expects 0 at left and increasing
> clockwise */
> - ringvalue = 71 - (ring & 0x7F);
> if (input->id.product == 0x357 || input->id.product == 0x358) {
> /* 2nd-gen Intuos Pro */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 3*72/16;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> + }
> + else if (input->id.product == 0x34d || input->id.product == 0x34e)
> {
> + /* MobileStudio Pro */
> + ringvalue = 35 - (ring & 0x7F);
> + ringvalue += 36/2;
> + if (ringvalue > 35)
> + ringvalue -= 36;
> }
> else {
> /* "Standard" devices */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 72/4;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> }
> - if (ringvalue > 71)
> - ringvalue -= 72;
>
> if (ring != WACOM_INTUOSP2_RING_UNTOUCHED)
> prox = buttons || ring;
> @@ -2033,26 +1997,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom)
> return 0;
> }
>
> -static int wacom_intuosp2_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> -
> - switch (data[0]) {
> - case WACOM_REPORT_MSPRO:
> - return wacom_mspro_pen_irq(wacom);
> - case WACOM_REPORT_MSPROPAD:
> - return wacom_intuosp2_pad_irq(wacom);
> - case WACOM_REPORT_MSPRODEVICE:
> - return 0;
> - default:
> - dev_dbg(input->dev.parent,
> - "%s: received unknown report #%d\n",
> __func__, data[0]);
> - break;
> - }
> - return 0;
> -}
> -
> void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> {
> bool sync;
> @@ -2110,7 +2054,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> break;
>
> case WACOM_MSPRO:
> - sync = wacom_mspro_irq(wacom_wac);
> + case INTUOSP2:
> + if (len == WACOM_PKGLEN_INTUOSP2T &&
> + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> + sync = wacom_multitouch_generic(wacom_wac);
> + else
> + sync = wacom_mspro_irq(wacom_wac);
> break;
>
> case DTH1152T:
> @@ -2137,14 +2086,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> sync = wacom_intuos_irq(wacom_wac);
> break;
>
> - case INTUOSP2:
> - if (len == WACOM_PKGLEN_INTUOSP2T &&
> - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> - sync = wacom_multitouch_generic(wacom_wac);
> - else
> - sync = wacom_intuosp2_irq(wacom_wac);
> - break;
> -
> case TABLETPC:
> case TABLETPCE:
> case TABLETPC2FG:
> diff --git a/3.7/wacom_wac.c b/3.7/wacom_wac.c
> index 070b07c..14548f1 100644
> --- a/3.7/wacom_wac.c
> +++ b/3.7/wacom_wac.c
> @@ -1808,8 +1808,9 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> unsigned char *data = wacom->data;
> struct input_dev *input = wacom->input;
> int nbuttons = features->numbered_buttons;
> - bool prox, ringstatus;
> - int buttons, ring;
> + bool prox;
> + int buttons, ring, ringvalue;
> + bool active = false;
>
> switch (nbuttons) {
> case 11:
> @@ -1818,53 +1819,6 @@ static int wacom_mspro_pad_irq(struct wacom_wac
> *wacom)
> case 13:
> buttons = data[1] | (data[3] << 8);
> break;
> - default:
> - if (nbuttons)
> - dev_warn(input->dev.parent, "%s:
> unsupported device #%d\n", __func__, data[0]);
> - return 0;
> - }
> -
> - ring = le16_to_cpup((__le16 *)&data[4]);
> - ringstatus = ring & 0x80;
> -
> - if (input->id.product == 0x34d || input->id.product == 0x34e) {
> - /* MobileStudio Pro */
> - ring = 35 - (ring & 0x7F);
> - ring += 36/2;
> - if (ring > 35)
> - ring -= 36;
> - }
> - else {
> - /* "Standard" devices */
> - ring = 71 - (ring & 0x7F);
> - ring += 72/4;
> - if (ring > 71)
> - ring -= 72;
> - }
> -
> - prox = buttons || ringstatus;
> -
> - wacom_report_numbered_buttons(input, nbuttons, buttons);
> - input_report_abs(input, ABS_WHEEL, ringstatus ? ring : 0);
> -
> - input_report_key(input, wacom->tool[1], prox ? 1 : 0);
> - input_report_abs(input, ABS_MISC, prox ? PAD_DEVICE_ID : 0);
> -
> - input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff);
> -
> - return 1;
> -}
> -
> -static int wacom_intuosp2_pad_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> - int nbuttons = wacom->features.numbered_buttons;
> - bool prox;
> - int buttons, ring, ringvalue;
> - bool active = false;
> -
> - switch (nbuttons) {
> case 9:
> buttons = (data[1]) | (data[3] << 8);
> break;
> @@ -1875,17 +1829,27 @@ static int wacom_intuosp2_pad_irq(struct wacom_wac
> *wacom)
>
> ring = le16_to_cpup((__le16 *)&data[4]);
> /* Fix touchring data: userspace expects 0 at left and increasing
> clockwise */
> - ringvalue = 71 - (ring & 0x7F);
> if (input->id.product == 0x357 || input->id.product == 0x358) {
> /* 2nd-gen Intuos Pro */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 3*72/16;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> + }
> + else if (input->id.product == 0x34d || input->id.product == 0x34e)
> {
> + /* MobileStudio Pro */
> + ringvalue = 35 - (ring & 0x7F);
> + ringvalue += 36/2;
> + if (ringvalue > 35)
> + ringvalue -= 36;
> }
> else {
> /* "Standard" devices */
> + ringvalue = 71 - (ring & 0x7F);
> ringvalue += 72/4;
> + if (ringvalue > 71)
> + ringvalue -= 72;
> }
> - if (ringvalue > 71)
> - ringvalue -= 72;
>
> if (ring != WACOM_INTUOSP2_RING_UNTOUCHED)
> prox = buttons || ring;
> @@ -2013,26 +1977,6 @@ static int wacom_mspro_irq(struct wacom_wac *wacom)
> return 0;
> }
>
> -static int wacom_intuosp2_irq(struct wacom_wac *wacom)
> -{
> - unsigned char *data = wacom->data;
> - struct input_dev *input = wacom->input;
> -
> - switch (data[0]) {
> - case WACOM_REPORT_MSPRO:
> - return wacom_mspro_pen_irq(wacom);
> - case WACOM_REPORT_MSPROPAD:
> - return wacom_intuosp2_pad_irq(wacom);
> - case WACOM_REPORT_MSPRODEVICE:
> - return 0;
> - default:
> - dev_dbg(input->dev.parent,
> - "%s: received unknown report #%d\n",
> __func__, data[0]);
> - break;
> - }
> - return 0;
> -}
> -
> void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
> {
> bool sync;
> @@ -2090,7 +2034,12 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> break;
>
> case WACOM_MSPRO:
> - sync = wacom_mspro_irq(wacom_wac);
> + case INTUOSP2:
> + if (len == WACOM_PKGLEN_INTUOSP2T &&
> + wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> + sync = wacom_multitouch_generic(wacom_wac);
> + else
> + sync = wacom_mspro_irq(wacom_wac);
> break;
>
> case DTH1152T:
> @@ -2117,14 +2066,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac,
> size_t len)
> sync = wacom_intuos_irq(wacom_wac);
> break;
>
> - case INTUOSP2:
> - if (len == WACOM_PKGLEN_INTUOSP2T &&
> - wacom_wac->data[0] == WACOM_REPORT_VENDOR_DEF_TOUCH)
> - sync = wacom_multitouch_generic(wacom_wac);
> - else
> - sync = wacom_intuosp2_irq(wacom_wac);
> - break;
> -
> case TABLETPC:
> case TABLETPCE:
> case TABLETPC2FG:
> --
> 2.14.2
>
> Tested-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel