Quick answer: Set mouse_filter = MOUSE_FILTER_IGNORE on decorative overlays and MOUSE_FILTER_PASS on containers that should let children receive input. Buttons keep MOUSE_FILTER_STOP so they consume their own clicks.
A semi-transparent gradient panel sits on top of your button row for visual effect. Clicks on the buttons do nothing because the panel ate them.
The Symptom
Buttons visible but unresponsive. Clicks register on a parent or overlay Control instead. Console may show a focus on the wrong node.
The Three Filter Modes
- MOUSE_FILTER_STOP (default for many Controls): consume the input. Children don’t see it.
- MOUSE_FILTER_PASS: this Control receives the input AND lets it propagate to siblings/children below.
- MOUSE_FILTER_IGNORE: this Control is invisible to input; events pass straight through.
The Fix
Decorative overlays: Ignore.
$GradientOverlay.mouse_filter = Control.MOUSE_FILTER_IGNORE
The gradient renders but doesn’t catch clicks. Buttons underneath fire.
Container that wants its own hover but lets buttons work: Pass.
Buttons: leave at default Stop. They eat their own clicks (correct).
Layout Containers
VBoxContainer, HBoxContainer, etc. default to Stop in some versions, which is occasionally surprising. If a layout container appears to swallow clicks, set it to Pass.
Verifying
Use the Debugger’s focus visualization or print on _gui_input. The button’s pressed signal should fire on click. If a parent prints first instead, that parent is on Stop and needs to switch.
“Ignore for decoration. Pass for layout. Stop for interactive. Clicks land where they should.”
Related Issues
For Theme stylebox states, see stylebox. For RichTextLabel BBCode, see BBCode.
Three filter modes. Pick per role.