> macOS processes a shortcut key like Cmd+A in two phases. In the first phase > it’s shopped around as a “key equivalent”. If it’s not consumed as a key > equivalent it enters the second phase and processed as a normal keyDown > event. Among other things the key equivalent phase ensures the shortcut will > be seen by the system menu bar *before* being treated as a keyDown. This is > the opposite of how JavaFX works; it expects a key event to be fired at the > current focus node which gets first crack at the event before it works its > way out to the menu bar. > > We can’t really opt out of the key equivalent phase but we can get the event > before the system menu bar does. Our implementation of performKeyEquivalent > pushes the event through the JavaFX scene graph but has no way of knowing if > the scene graph consumed it. The result is that a consumed event is always > handed to the system menu bar where it can also trigger a menu item. > > This PR introduces a variant of notifyKey that returns a boolean indicating > whether the event was consumed or not. If the event was consumed > performKeyEquivalent doesn’t allow it to continue on to the system menu bar. > > I’m trying to fix this old, old problem because I’ve seen at least one JavaFX > app tie itself up in knots trying to work around this. Despite the number of > files being touched it is not a deep fix; there’s just a boolean return value > that needs to be plumbed through multiple layers.
Martin Fox has updated the pull request incrementally with three additional commits since the last revision: - Added some comments - Removed redundant check to avoid having the same NSEvent sent into the scene graph twice. - performKeyEquivalent and keyDown now do the same thing with a guard to prevent double-processing. ------------- Changes: - all: https://git.openjdk.org/jfx/pull/1528/files - new: https://git.openjdk.org/jfx/pull/1528/files/06d9422c..592b317e Webrevs: - full: https://webrevs.openjdk.org/?repo=jfx&pr=1528&range=01 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=1528&range=00-01 Stats: 39 lines in 4 files changed: 24 ins; 11 del; 4 mod Patch: https://git.openjdk.org/jfx/pull/1528.diff Fetch: git fetch https://git.openjdk.org/jfx.git pull/1528/head:pull/1528 PR: https://git.openjdk.org/jfx/pull/1528