summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-05 19:46:49 +0200
committerPaul Buetow <paul@buetow.org>2026-03-05 19:46:49 +0200
commitad9747939b3689f395cf7bffeb3ed2b17efb8a41 (patch)
tree8c6f2133b08ff5d583c6e2eeb0c4b4280ad26f6a
parentcffb087c70c3cc51afeb6ba1d7cad30e3059a10b (diff)
feat(tui): set contextual window title
-rw-r--r--internal/tui/tui.go34
-rw-r--r--internal/tui/tui_test.go23
2 files changed, 47 insertions, 10 deletions
diff --git a/internal/tui/tui.go b/internal/tui/tui.go
index f1c172b..3551e72 100644
--- a/internal/tui/tui.go
+++ b/internal/tui/tui.go
@@ -499,41 +499,54 @@ func (m *Model) applyTheme(isDark bool) {
m.probeModal = m.probeModal.SetDarkMode(isDark)
}
+func (m Model) windowTitle() string {
+ switch m.screen {
+ case ScreenPIDPicker:
+ return "ior - select process"
+ case ScreenDashboard:
+ if m.pidFilter > 0 {
+ return fmt.Sprintf("ior - tracing PID %d", m.pidFilter)
+ }
+ }
+ return "ior - I/O Riot"
+}
+
// View renders the currently active screen and startup overlay state.
func (m Model) View() tea.View {
+ title := m.windowTitle()
if m.quitting {
- return altScreenView("")
+ return altScreenView("", title)
}
width, height := common.EffectiveViewport(m.width, m.height)
if m.attaching {
line := fmt.Sprintf("%s Attaching tracepoints...", m.spin.View())
- return altScreenView(placeToViewport(width, height, ScreenStyle.Render(PanelStyle.Render(line))))
+ return altScreenView(placeToViewport(width, height, ScreenStyle.Render(PanelStyle.Render(line))), title)
}
if m.lastErr != nil {
- return altScreenView(placeToViewport(width, height, ScreenStyle.Render(ErrorStyle.Render(m.lastErr.Error()))))
+ return altScreenView(placeToViewport(width, height, ScreenStyle.Render(ErrorStyle.Render(m.lastErr.Error()))), title)
}
switch m.screen {
case ScreenPIDPicker:
base := m.pidPicker.View().Content
if m.exporter.Visible() {
- return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base))
+ return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base), title)
}
- return altScreenView(placeToViewport(width, height, base))
+ return altScreenView(placeToViewport(width, height, base), title)
case ScreenDashboard:
base := m.dashboard.View().Content
if m.probeModal.Visible() {
- return altScreenView(placeToViewport(width, height, m.probeModal.View(width, height)))
+ return altScreenView(placeToViewport(width, height, m.probeModal.View(width, height)), title)
}
if m.exporter.Visible() {
- return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base))
+ return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base), title)
}
- return altScreenView(placeToViewport(width, height, base))
+ return altScreenView(placeToViewport(width, height, base), title)
default:
- return altScreenView("")
+ return altScreenView("", title)
}
}
@@ -703,10 +716,11 @@ func placeToViewport(width, height int, content string) string {
return lipgloss.Place(width, height, lipgloss.Left, lipgloss.Top, content)
}
-func altScreenView(content string) tea.View {
+func altScreenView(content, title string) tea.View {
view := tea.NewView(content)
view.AltScreen = true
view.ReportFocus = true
+ view.WindowTitle = title
view.KeyboardEnhancements.ReportEventTypes = true
return view
}
diff --git a/internal/tui/tui_test.go b/internal/tui/tui_test.go
index 156b876..e15c937 100644
--- a/internal/tui/tui_test.go
+++ b/internal/tui/tui_test.go
@@ -657,3 +657,26 @@ func TestKeyboardEnhancementsMsgHandledGracefully(t *testing.T) {
t.Fatalf("expected non-zero flags to report key disambiguation support")
}
}
+
+func TestViewSetsDynamicWindowTitle(t *testing.T) {
+ m := NewModel(-1, func(context.Context) error { return nil })
+
+ m.screen = ScreenPIDPicker
+ view := m.View()
+ if view.WindowTitle != "ior - select process" {
+ t.Fatalf("unexpected picker window title: %q", view.WindowTitle)
+ }
+
+ m.screen = ScreenDashboard
+ m.pidFilter = 1234
+ view = m.View()
+ if view.WindowTitle != "ior - tracing PID 1234" {
+ t.Fatalf("unexpected tracing window title: %q", view.WindowTitle)
+ }
+
+ m.pidFilter = -1
+ view = m.View()
+ if view.WindowTitle != "ior - I/O Riot" {
+ t.Fatalf("unexpected default window title: %q", view.WindowTitle)
+ }
+}