Thank you Michael, Jose, Florian, and Markus

In my mind the "Too many touch points reported" exception fix (#394) appears to not be the correct fix for that issue and is what caused this regression.

There seems to be two possible paths forward, either revert #394 or integrate this. In both cases the "Too many touch points reported" issue will need to be readdressed.

It would be nice to see this move forward somehow.

Thanks again,
Jurgen


On Tue, 04 Jun 2024 18:28:47 +0200, Markus Mack <mm...@openjdk.org> wrote:

On Tue, 21 May 2024 14:25:51 GMT, Michael Strauß <mstra...@openjdk.org> wrote:

This PR fixes a bug ([JDK-8289115](https://bugs.openjdk.org/browse/JDK-8289115)) that was introduced with #394, which changed the following line in the `NotifyTouchInput` function (ViewContainer.cpp):

- const bool isDirect = true;
+ const bool isDirect = IsTouchEvent();


`IsTouchEvent` is a small utility function that uses the Windows SDK function `GetMessageExtraInfo` to distinguish between mouse events and pen events as described in this article: https://learn.microsoft.com/en-us/windows/win32/tablet/system-events-and-mouse-messages

I think that using this function to distinguish between touchscreen events and pen events is erroneous. The linked article states: _"When your application receives a **mouse message** (such as WM_LBUTTONDOWN) [...]"_

But we are not receiving a mouse message in `NotifyTouchInput`, we are receiving a `WM_TOUCH` message. I couldn't find any information on whether this API usage is also supported for `WM_TOUCH` messages, but my testing shows that that's probably not the case (I tested this with a XPS 15 touchscreen laptop, where `GetMessageExtraInfo` returns 0 for `WM_TOUCH` messages).

My suggestion is to check the `TOUCHEVENTF_PEN` flag of the `TOUCHINPUT` structure instead:

const bool isDirect = (ti->dwFlags & TOUCHEVENTF_PEN) == 0;

I attempted to test this with the sample app in [JDK-8249737](https://bugs.openjdk.org/browse/JDK-8249737) and [Microsoft.Windows.Simulator](https://stackoverflow.com/questions/40274660/windows-10-how-do-i-test-touch-events-without-a-touchscreen)
using the simulator's "Basic touch mode".

The "Too many touch points reported" exception seems to be thrown consistently with
`const bool isDirect = true;` (original before #394)
and `const bool isDirect = (ti->dwFlags & TOUCHEVENTF_PEN) == 0;` (this PR)

I didn't see the exception with `const bool isDirect = IsTouchEvent();` (#394) and `const bool isDirect = false` (which is probably what IsTouchEvent() returns here).

Not sure what this simulator actually sends, but someone more knowledgeable might want to have a look at what's happening.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1459#issuecomment-2147933056

Reply via email to