The Mac platform code sends a KeyEvent into the scene graph and if the event is 
not consumed it gets sent on to the system menu. But ComboBox and Spinner 
always consume the original event and fire a copy which the system menu ignores.

In the past the platform code sent key events to the system menu even if the 
scene graph consumed them. This caused various bugs and was fixed in PR #1528 
leading to this issue.

One could argue that a ComboBox or Spinner shouldn’t consume all key events but 
one could also argue that the system menu shouldn’t behave so differently from 
a standard MenuBar which will respond to any KeyEvent that reaches the 
top-level Scene no matter where it came from.

This PR installs an event dispatcher which forwards KEY_PRESSED events on to 
the platform so any event bubbling through the dispatch chain can trigger the 
system menu. The dispatcher is placed by the top-level (non-popup) Window such 
that it’s the last dispatcher encountered while bubbling.

In this PR once the key event reaches the GlassSystemMenu it passes the JavaFX 
key code and modifiers into the Mac platform code. This isn’t enough 
information to construct an NSEvent to pass to the main menu. Instead the code 
uses the code and modifiers to verify that the originating key down NSEvent 
(which it retained) should be sent on to NSApp.mainMenu.

(There are other ways this could work. GlassSystemMenu could take the KeyEvent 
and perform its own accelerator matching entirely inside Java. This would match 
the way the standard MenuBar finds accelerators instead of using Apple’s 
matching algorithm. This PR is the more conservative approach, basically just 
shifting the timing of system menu matching without changing how it’s done.)

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

Commit messages:
 - Merge remote-tracking branch 'upstream/master' into sysmenuinplatform
 - Merge branch 'sysmenuinplatform' of ssh://github.com/beldenfox/jfx into 
sysmenuinplatform
 - Cleanup and fixed a popup redirection bug.
 - Validating the system menu key event against the originating NSEvent before 
sending it to NSApp.mainMenu.
 - Merge remote-tracking branch 'upstream/master' into sysmenuinplatform
 - System menu accelerators triggered in scene graph but resolved in platform 
code

Changes: https://git.openjdk.org/jfx/pull/1848/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1848&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8354539
  Stats: 220 lines in 13 files changed: 168 ins; 30 del; 22 mod
  Patch: https://git.openjdk.org/jfx/pull/1848.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1848/head:pull/1848

PR: https://git.openjdk.org/jfx/pull/1848

Reply via email to