From 3304ad4166f61749592e445862c2d4930f5e228e Mon Sep 17 00:00:00 2001 From: Jason Gerecke Date: Tue, 8 Oct 2024 13:30:37 -0700 Subject: [PATCH] HID: wacom: Set eraser status when either 'Eraser' or 'Invert' usage is set Microsoft defines two slightly different behaviors for pens that are being used to erase. The first one, for pens that can be used while inverted specifies that both 'Invert' and 'Eraser' usages should be set while the pen is in contact and erasing. For pens that use an eraser button though, they specify that only the 'Eraser' usage should be set (while hovering, only the 'Invert' usage is to be set). We used our internal 'invert_state' flag to determine if a pen has an intent to erase (whether hovering or not). That flag was previously only depending on the 'Invert' usage, which was sufficient for the first type of pen (EMR) but not the second type (AES). This commit makes the flag depend on either usage being set, and also renames it to make its function more clear. This should not normally have an impact on userspace since we determine the tool type (e.g. BTN_TOOL_RUBBER) only when a device first enters range, and keep the type fixed for the remainder of the interaction. This would only improve reporting in the situation where the first event in an interaction comes from an AES pen that is already in contact with the screen when its eraser button is pressed. Link: https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states Signed-off-by: Jason Gerecke --- 4.18/wacom_wac.c | 7 +++++-- 4.18/wacom_wac.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/4.18/wacom_wac.c b/4.18/wacom_wac.c index 304e2042..d89f9a72 100644 --- a/4.18/wacom_wac.c +++ b/4.18/wacom_wac.c @@ -2447,9 +2447,11 @@ static void wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field wacom_wac->hid_data.sense_state = value; return; case HID_DG_INVERT: - wacom_wac->hid_data.invert_state = value; + wacom_wac->hid_data.eraser |= value; return; case HID_DG_ERASER: + wacom_wac->hid_data.eraser |= value; + fallthrough; case HID_DG_TIPSWITCH: wacom_wac->hid_data.tipswitch |= value; return; @@ -2590,7 +2592,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev, if (entering_range) { /* first in range */ /* Going into range select tool */ - if (wacom_wac->hid_data.invert_state) + if (wacom_wac->hid_data.eraser) wacom_wac->tool[0] = BTN_TOOL_RUBBER; else if (wacom_wac->features.quirks & WACOM_QUIRK_AESPEN) wacom_wac->tool[0] = BTN_TOOL_PEN; @@ -2644,6 +2646,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev, } wacom_wac->hid_data.tipswitch = false; + wacom_wac->hid_data.eraser = false; input_sync(input); } diff --git a/4.18/wacom_wac.h b/4.18/wacom_wac.h index 62689ffc..cb5b637f 100644 --- a/4.18/wacom_wac.h +++ b/4.18/wacom_wac.h @@ -327,7 +327,7 @@ struct hid_data { __s16 inputmode_index; /* InputMode HID feature index in the report */ bool sense_state; bool inrange_state; - bool invert_state; + bool eraser; bool tipswitch; bool barrelswitch; bool barrelswitch2;