diff --git a/pkg/gui/controllers/helpers/app_status_helper.go b/pkg/gui/controllers/helpers/app_status_helper.go index fa402962cc4..17c61ae2632 100644 --- a/pkg/gui/controllers/helpers/app_status_helper.go +++ b/pkg/gui/controllers/helpers/app_status_helper.go @@ -126,6 +126,13 @@ func (self *AppStatusHelper) renderAppStatusSync(stop chan struct{}) { ticker := time.NewTicker(time.Millisecond * time.Duration(self.c.UserConfig().Gui.Spinner.Rate)) defer ticker.Stop() + // Write the status into the view before the first layout below, so that + // layout (which sizes the bottom line based on the actual content of the + // AppStatus view) leaves room for it and it shows right away. The ticker + // only updates the spinner frame using ForceFlushViewsContentOnly, so this + // doesn't re-layout. + self.setAppStatusContent() + // Forcing a re-layout and redraw after we added the waiting status; // this is needed in case the gui.showBottomLine config is set to false, // to make sure the bottom line appears. It's also useful for redrawing @@ -140,9 +147,7 @@ func (self *AppStatusHelper) renderAppStatusSync(stop chan struct{}) { for { select { case <-ticker.C: - appStatus, color := self.statusMgr().GetStatusString(self.c.UserConfig()) - self.c.Views().AppStatus.FgColor = color - self.c.SetViewContent(self.c.Views().AppStatus, appStatus) + self.setAppStatusContent() // Redraw all views of the bottom line: bottomLineViews := []*gocui.View{ self.c.Views().AppStatus, self.c.Views().Options, self.c.Views().Information, @@ -150,8 +155,22 @@ func (self *AppStatusHelper) renderAppStatusSync(stop chan struct{}) { } _ = self.c.GocuiGui().ForceFlushViewsContentOnly(bottomLineViews) case <-stop: + // Clear the status from the view and re-layout, otherwise the + // stale content would keep layout reserving room for it forever. + // The UI thread is free again at this point, so we go through + // OnUIThread like the async renderAppStatus does. + self.c.OnUIThread(func() error { + self.c.SetViewContent(self.c.Views().AppStatus, "") + return nil + }) break outer } } }() } + +func (self *AppStatusHelper) setAppStatusContent() { + appStatus, color := self.statusMgr().GetStatusString(self.c.UserConfig()) + self.c.Views().AppStatus.FgColor = color + self.c.SetViewContent(self.c.Views().AppStatus, appStatus) +}