I’m trying to figure out why my buttons lose focus immediately. I was able to find out how this was happening by attaching a function to the focus_exited signal of the button and adding a breakpoint.

As it turns out, a control that was inside of another SubViewport was grabbing focus. In my game, I have several SubViewports in order to render UIs on quad meshes in the game world. However, it appears that when my button in the main viewport is focused, this causes the control in the SubViewport to get null when calling gui_get_focus_owner().

Apparently, according to godotengine/godot-proposals#7229, this is because gui_get_focus_owner() will return null if the focus owner isn’t a child

darthLeviN

currently viewports know which control is the focus owner ONLY if it’s directly within them. if it’s within another viewport. they will report a null focus owner.

My code would try to grab focus when the focus owner wasn’t set, and this subsequent grab_focus() would cause my original button to lose focus. So, it appears that grab_focus will also cause all other Viewports to lose focus.

I think the only way to workaround this is to only grab focus when the corresponding SubViewport is focused and the player attempts interact with it.