diff --git a/internal/ui/ui_glfw.go b/internal/ui/ui_glfw.go index 1b253618f..b3a47e03e 100644 --- a/internal/ui/ui_glfw.go +++ b/internal/ui/ui_glfw.go @@ -83,6 +83,7 @@ type userInterfaceImpl struct { // bufferOnceSwapped must be accessed from the main thread. bufferOnceSwapped bool + updateOnceCalled bool origWindowPosX int origWindowPosY int @@ -1276,6 +1277,10 @@ func (u *UserInterface) setFPSMode(fpsMode FPSModeType) error { // update must be called from the main thread. func (u *UserInterface) update() (float64, float64, error) { + defer func() { + u.updateOnceCalled = true + }() + if err := u.error(); err != nil { return 0, 0, err } @@ -1383,7 +1388,9 @@ func (u *UserInterface) update() (float64, float64, error) { } } - for !u.isRunnableOnUnfocused() { + // If isRunnableOnUnfocused is false and the window is not focused, wait here. + // For the first update, skip this check as the window might not be seen yet in some environments like ChromeOS (#3091). + for !u.isRunnableOnUnfocused() && u.updateOnceCalled { // In the initial state on macOS, the window is not shown (#2620). visible, err := u.window.GetAttrib(glfw.Visible) if err != nil {