diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md index db611b4588..2ca34378c3 100644 --- a/BREAKING_CHANGES.md +++ b/BREAKING_CHANGES.md @@ -2,6 +2,37 @@ # develop +## Change + +Components that have setMouseClickGrabsKeyboardFocus() set to false will not +accept or propagate keyboard focus to parent components due to a mouse click +event. This is now true even if the mouse click event happens in a child +component with setMouseClickGrabsKeyboardFocus (true) and +setWantsKeyboardFocus (false). + +**Possible Issues** + +Components that rely on child components propagating keyboard focus from a +mouse click, when those child components have setMouseClickGrabsKeyboardFocus() +set to false, will no longer grab keyboard focus. + +**Workaround** + +Add a MouseListener to the component receiving the click and override the +mouseDown() method in the listener. In the mouseDown() method call +Component::grabKeyboardFocus() for the component that should be focused. + +**Rationale** + +The intent of setMouseClickGrabsKeyboardFocus (false) is to reject focus changes +coming from mouse clicks even if the component is otherwise capable of receiving +keyboard focus. + +The previous behaviour could result in surprising focus changes when a child +component was clicked. This manifested in the focus seemingly disappearing when +a PopupMenu item added to a component was clicked. + + ## Change The NodeID argument to AudioProcessorGraph::addNode() has been changed to take diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index def4007d27..c559f6eede 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -2180,13 +2180,10 @@ void Component::internalMouseDown (MouseInputSource source, } } - if (! flags.dontFocusOnMouseClickFlag) - { - grabKeyboardFocusInternal (focusChangedByMouseClick, true, FocusChangeDirection::unknown); + grabKeyboardFocusInternal (focusChangedByMouseClick, true, FocusChangeDirection::unknown); - if (checker.shouldBailOut()) - return; - } + if (checker.shouldBailOut()) + return; if (flags.repaintOnMouseActivityFlag) repaint(); @@ -2623,6 +2620,9 @@ void Component::takeKeyboardFocus (FocusChangeType cause, FocusChangeDirection d void Component::grabKeyboardFocusInternal (FocusChangeType cause, bool canTryParent, FocusChangeDirection direction) { + if (flags.dontFocusOnMouseClickFlag && cause == FocusChangeType::focusChangedByMouseClick) + return; + if (! isShowing()) return;