Message ID | 20221103173304.128651-1-jason.gerecke@wacom.com |
---|---|
State | Accepted |
Commit | f77810f744139572a63e5a85ab6a8c10c2d44fb1 |
Headers | show |
Series | HID: wacom: Fix logic used for 3rd barrel switch emulation | expand |
On Thu, 3 Nov 2022, Jason Gerecke wrote: > From: Jason Gerecke <killertofu@gmail.com> > > When support was added for devices using an explicit 3rd barrel switch, > the logic used by devices emulating this feature was broken. The 'if' > statement / block that was introduced only handles the case where the > button is pressed (i.e. 'barrelswitch' and 'barrelswitch2' are both set) > but not the case where it is released (i.e. one or both being cleared). > This results in a BTN_STYLUS3 "down" event being sent when the button > is pressed, but no "up" event ever being sent afterwards. > > This patch restores the previously-used logic for determining button > states in the emulated case so that switches are reported correctly > again. > > Link: https://github.com/linuxwacom/xf86-input-wacom/issues/292 > Fixes: 6d09085b38e5 ("HID: wacom: Adding Support for new usages") > CC: stable@vger.kernel.org #v5.19+ > Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> > Tested-by: Joshua Dickens <joshua.dickens@wacom.com> > Reviewed-by: Ping Cheng <ping.cheng@wacom.com> Applied, thank you.
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 77486962a773f..0f3d57b426846 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -2520,11 +2520,12 @@ static void wacom_wac_pen_report(struct hid_device *hdev, if (!delay_pen_events(wacom_wac) && wacom_wac->tool[0]) { int id = wacom_wac->id[0]; - if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3 && - wacom_wac->hid_data.barrelswitch & wacom_wac->hid_data.barrelswitch2) { - wacom_wac->hid_data.barrelswitch = 0; - wacom_wac->hid_data.barrelswitch2 = 0; - wacom_wac->hid_data.barrelswitch3 = 1; + if (wacom_wac->features.quirks & WACOM_QUIRK_PEN_BUTTON3) { + int sw_state = wacom_wac->hid_data.barrelswitch | + (wacom_wac->hid_data.barrelswitch2 << 1); + wacom_wac->hid_data.barrelswitch = sw_state == 1; + wacom_wac->hid_data.barrelswitch2 = sw_state == 2; + wacom_wac->hid_data.barrelswitch3 = sw_state == 3; } input_report_key(input, BTN_STYLUS, wacom_wac->hid_data.barrelswitch); input_report_key(input, BTN_STYLUS2, wacom_wac->hid_data.barrelswitch2);