-
Notifications
You must be signed in to change notification settings - Fork 488
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8236971: [macos] Gestures handled incorrectly due to missing events #156
8236971: [macos] Gestures handled incorrectly due to missing events #156
Conversation
👋 Welcome back kcr! A progress list of the required criteria for merging this PR into |
…efore final review)" This reverts commit 69f0b38.
/reviewers 2 |
@kevinrushforth |
I've built a fresh JFX, with your changes applied to master, this morning. I can confirm that the primary bug seems to be fixed with these changes but I have observed some behaviour where I am not sure whether it is correct or whether my expectation is just wrong.
|
These are all separate issues that could be explored with follow-on bugs. I'm not sure what the right behavior is for these or whether there is enough information from the OS to do anything about them (e.g., I suspect there is no way to get the touch count for these trackpad-generated gestures on macOS, nor do I really think it would be useful). You might file a follow-on issue for 1 and 3. Would you be able to review this? If not I'll ask @johanvos or @pankaj-bansal to be the second reviewer. |
I think 1. is more a point for discussion and I am also not sure what is right or wrong but 3. is IMHO a bug, especially because the documentation is so explicit about this behaviour. I'll file a new issue for that. What would I have to do to formally review this? I haven't done that before. |
I agree about 1 being a point of discussion. Please do file a bug for 3. As for formally reviewing it, you would press the |
if (gesturesBeganMask == 0) { | ||
[self sendJavaGestureBeginEvent:theEvent]; | ||
} | ||
gesturesBeganMask |= theMask; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rotate and Magnify gestures can be started and performed together.
If Rotate is already in progress then gesturesBeganMask
would be set to 4
.
and If we start a Magnify gesture while the Rotate is not ended then sendJavaGestureBeginEvent
will not be executed for Magnify gesture.
However the application currently receives the synthetic ZOOM_STARTED
event, which is generated as a result of call to sendJavaGestureEvent
and not an event generated from here,
A change in inner if
statement as below can fix the issue,
if ((gesturesBeganMask & theMask) == 0) {
gesturesBeganMask |= theMask;
[self sendJavaGestureBeginEvent:theEvent]
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a good thought, and one I had initially considered, but didn't do for two related reasons:
- The macOS NSEvent code that sends
beginGestureWithEvent
andendGestureWithEvent
when the JDK is compiled with an older SDK doesn't send a begin call when starting a rotate gesture if a zoom gesture is already active, or vice versa. One goal of this change is to match the previous behavior to minimize risk. - More importantly, the existing logic is not expecting nested
sendJavaGestureBeginEvent
/sendJavaGestureEndEvent
calls, and will not track the state correctly if they are nested. I did a quick test implementing your suggestion and confirmed that it misbehaves.
Worth noting, the logic that synthesizes the begin and end gesture notifications that are sent by the Java gesture code already takes care of the case of switching from zoom to rotate and sends the correct sequence to the event listener.
if (gesturesBeganMask == 0) { | ||
[self sendJavaGestureEndEvent:theEvent]; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In continuation to the change in maybeBeginGestureWithEvent
, we would need to remove the inner if
condition change here,
if ((gesturesBeganMask & theMask) != 0) {
gesturesBeganMask &= ~theMask;
[self sendJavaGestureEndEvent:theEvent];
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good to me.
@kevinrushforth This change now passes all automated pre-integration checks. When the change also fulfills all project specific requirements, type
Since the source branch of this PR was last updated there have been 2 commits pushed to the ➡️ To integrate this PR with the above commit message, type |
/integrate |
@kevinrushforth The following commits have been pushed to master since your change was applied:
Your commit was automatically rebased without conflicts. Pushed as commit 247a65d. |
As noted in the JBS issue, this bug is a result of a deliberate change by Apple that affects applications (in this case the JDK) linked against MacOSX 10.11 SDK or later -- they no longer call two methods that we are relying on,
beginGestureWithEvent
andendGestureWithEvent
. There is no deprecation warning or any other indication at compile time or runtime that these methods are ineffective. They just stopped calling them. It is documented in their developer guide:developer.apple.com/documentation/appkit/nsresponder/1526368-begingesturewithevent
Note that it's the version of the MacOSX SDK that the JDK is linked with that matters. JavaFX gesture notification works when run on a JDK that was linked against the 10.10 SDK or earlier (regardless of what MacOSX SDK was used to link the JavaFX libraries). JavaFX gesture notification fails when run on a JDK that was linked against the 10.11 SDK or later.
The solution, as indicated in the Apple documentation referred to above, is to use the phase information from gesture events to track when to call begin / end gesture.
The fix does the following things:
beginGestureWithEvent
andendGestureWithEvent
responder methods inGlassView2D
andGlassView3D
GlassViewDelegate
notification methods,sendJavaGestureBeginEvent
andsendJavaGestureEndEvent
I've tested this on macOS 10.13.6 and 10.15.3 (Catalina) and the attached program now runs correctly. I also tested the GestureEvent sample in Ensemble8 and it reproduces the problem before the fix and works correctly after the fix.
I instrumented the code with print statements (which I have since reverted) and verified that the stream of events is as expected, and matches JDK 8u241 with bundled FX.
Progress
Issue
Reviewers
Download
$ git fetch https://git.openjdk.java.net/jfx pull/156/head:pull/156
$ git checkout pull/156