Skip to content

Commit

Permalink
HID: wacom: Set invert_state when either 'Eraser' or 'Invert' usage i…
Browse files Browse the repository at this point in the history
…s 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 use our internal 'invert_state' flag to determine if a pen has an
intent to erase (whether hovering or not). Right now that flag only
depends on the 'Invert' usage, which is sufficient for the first type
of pen (i.e. EMR), but not the second type (i.e. AES). This commit
updates the logic so that 'invert_state' will be set whenever either
of the two usages are.

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 (very remote) chance that the
first event in an interaction comes from an AES pen that is already
in contact with the screen with its eraser button pressed.

Link: https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/windows-pen-states
Signed-off-by: Jason Gerecke <[email protected]>
  • Loading branch information
jigpu committed Oct 8, 2024
1 parent 8046f5d commit 7fe0cda
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion 4.18/wacom_wac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.invert_state |= value;
return;
case HID_DG_ERASER:
wacom_wac->hid_data.invert_state |= value;
fallthrough;
case HID_DG_TIPSWITCH:
wacom_wac->hid_data.tipswitch |= value;
return;
Expand Down Expand Up @@ -2644,6 +2646,7 @@ static void wacom_wac_pen_report(struct hid_device *hdev,
}

wacom_wac->hid_data.tipswitch = false;
wacom_wac->hid_data.invert_state = false;

input_sync(input);
}
Expand Down

0 comments on commit 7fe0cda

Please sign in to comment.