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
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.