Redispatch unconsumed mouse wheel events (#2425) #2438
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is a cherry-pick (with some adaptations) of #2425
Redispatch mouse wheel events which the Compose scene did not consume.
Difference with Swing behavior
This fix introduces a slight difference with how Swing handles nested mouse-wheel scrolling. In Swing, there is essentially no nested scrolling. In a scenario with a
JScrollPane
inside anotherJScrollPane
, only the inner one can be scrolled when the mouse is over it. With this PR, aComposePanel
with a scrollable element within aJScrollPane
will scroll until it reaches the start/end and then the outerJScrollPane
will scroll.This behavior seems to be an improvement, so we thought it was ok to have this difference.
Danger, Will Robinson
Note that this includes a potentially dangerous hack of whose consequences I'm not yet sure. If it proves too problematic, we will need to take a different approach (documented in the source).
The hack is that in order to allow AWT to find the correct target for the redispatched event, we temporarily unregister
ComposeSceneMediator
's mouse listeners.Feature flag
I've put the behavior behind
ComposeFeatureFlags.redispatchUnconsumedMouseWheelEvents
. The flag will be:false
by default in 1.9.1true
by default in 1.10In this PR, it's
true
, as it merges intojb-main
. In the cherry-pick to 1.9.1, we should change it tofalse
. When it's approved I will add a ticket to remove it for 1.11Other mouse events
Note that this PR only deals with mouse wheel events, but at least in the case of a lightweight skia layer (i.e.
SkiaSwingLayer
), we should probably do the same for other mouse events.Fixes https://youtrack.jetbrains.com/issue/CMP-4601
Testing
Added unit tests, and also tested manually with
This should be tested by QA
Release Notes
Fixes - Desktop
ComposePanel
can now re-dispatch unconsumed mouse wheel events, allowing scrollable components beneath to be scrolled. To enable this behavior, set the system property"compose.swing.redispatchMouseWheelEvents"
to"true"
.