RFR: 8282702: Button is pressed one more time on Raspberry Pi with Touchscreen

Alexander Scherbatiy alexsch at openjdk.java.net
Sat Mar 5 14:05:21 UTC 2022


Tapping on a button and next tapping on another place on the screen leads that the button is pressed twice on a Raspberry Pi with Touchscreen.

For example, run the [JFXButtonExample](https://bugs.openjdk.java.net/secure/attachment/98181/JFXButtonExample.java) 
app and first tap on the button in the left bottom side of the screen and second tap on the center of the screen.

This is a log of the state from LinuxStatefulMultiTouchProcessor.processEvents() method when `System.out.printf("state: %s%n", state);` code is added before the line:
https://github.com/openjdk/jfx/blob/2e8a4a5e97bb88a5807ae5fe075b98e1d54a4ca0/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/LinuxStatefulMultiTouchProcessor.java#L140

state: TouchState[1,TouchState.Point[id=91,x=257,y=419]]
state: TouchState[1,TouchState.Point[id=91,x=257,y=420]]
state: TouchState[0]
Hello World!
state: TouchState[2,TouchState.Point[id=91,x=257,y=419],TouchState.Point[id=92,x=410,y=265]]
state: TouchState[2,TouchState.Point[id=91,x=257,y=419],TouchState.Point[id=92,x=409,y=267]]
state: TouchState[2,TouchState.Point[id=91,x=257,y=419],TouchState.Point[id=92,x=408,y=286]]
state: TouchState[0]
Hello World!

The TouchState contains only button coordinates (x=257,y=419) for the first tap on the button.
The TouchState contains both the button coordinates  (x=257,y=419) and coordinates of the center of screen (x=408,y=286) for the second tap on the center of the screen.

This happens because when LinuxStatefulMultiTouchProcessor.processEvents() pushes the state with current touches to the pipeline the LookaheadTouchFilter  saves the current state and copies the previous saved state to the current state.
https://github.com/openjdk/jfx/blob/2e8a4a5e97bb88a5807ae5fe075b98e1d54a4ca0/modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/LookaheadTouchFilter.java#L74

That leads that the already deleted touch state (which contains the button coordinate) is restored. 

The proposed solution is to put the copy of the touch state to the pipeline .

Printing the touch state after the fix shows the log:

state: TouchState[1,TouchState.Point[id=65,x=267,y=423]]
state: TouchState[1,TouchState.Point[id=65,x=269,y=425]]
state: TouchState[0]
Hello World!
state: TouchState[1,TouchState.Point[id=66,x=414,y=243]]
state: TouchState[1,TouchState.Point[id=66,x=414,y=238]]
state: TouchState[0]

The TouchState does not contains the button coordinates for the second tap.

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

Commit messages:
 - 8282702: Button is pressed one more time on Raspberry Pi with Touchscreen

Changes: https://git.openjdk.java.net/jfx/pull/746/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=746&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8282702
  Stats: 3 lines in 1 file changed: 2 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jfx/pull/746.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/746/head:pull/746

PR: https://git.openjdk.java.net/jfx/pull/746


More information about the openjfx-dev mailing list