On Mon, 14 Jul 2025 19:58:22 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.)
>
> Martin Fox has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Review feedback related to code consistency and clarity.

> To fix this we would have to introduce new API's (like some form of PR 
> https://github.com/openjdk/jfx/pull/1632).

I am not a fan of #1632, I think it's an attempt to band-aid over a fundamental 
design issue, but this is a different topic altogether.

Why would a Spinner or ComboBox consume the key events that it is not supposed 
to?  Ok, let's assume the outer control (Spinner or ComboBox) gets the event 
and fires a copy to the inner control (TextField).  This is perfectly legal, 
but now it must either consume the event if the secondary event is consumed.  
More importantly, it **should not consume** the event if the secondary event is 
not consumed, isn't that the issue?

So it it a responsibility of the entity that creates the secondary event to 
either consume the original event or let it go, or am I mistaken?

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

PR Comment: https://git.openjdk.org/jfx/pull/1848#issuecomment-3075683925

Reply via email to