On Mon, 14 Jul 2025 17:39:50 GMT, Martin Fox <m...@openjdk.org> wrote:
> 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.) modules/javafx.graphics/src/main/java/com/sun/glass/ui/delegate/MenuBarDelegate.java line 35: > 33: public long getNativeMenu(); > 34: // Returns true if the key event was processed > 35: default public boolean handleKeyEvent(int code, int modifiers) { This should be `public default` or just `default` as everything is always public in an interface anyway. modules/javafx.graphics/src/main/java/javafx/stage/PopupWindow.java line 904: > 902: new > WindowCloseRequestHandler(this), > 903: new EventHandlerManager(this)); > 904: You should remove this unrelated change. ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1848#discussion_r2205626389 PR Review Comment: https://git.openjdk.org/jfx/pull/1848#discussion_r2205622373