diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-06 16:01:46 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-06 16:01:46 +0200 |
| commit | fcee8baac995b25ffb9ab06567f010df105c3db1 (patch) | |
| tree | caeba14673afcdc66698d63ccfee8d1b535a41ed /internal/tui/tui.go | |
| parent | aca5e2205b4dd18a13706c725daa0f326e10000b (diff) | |
refactor: thread runtime flags through ior and tui (task 385)
Diffstat (limited to 'internal/tui/tui.go')
| -rw-r--r-- | internal/tui/tui.go | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 12c904d..c1ba700 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -65,6 +65,7 @@ type TraceRuntimeBindings interface { } type runtimeBindingsContextKey struct{} +type traceFiltersContextKey struct{} type runtimeBindings struct { mu sync.RWMutex @@ -75,6 +76,11 @@ type runtimeBindings struct { probeManager ProbeManager } +type traceFilters struct { + pidFilter int + tidFilter int +} + func newRuntimeBindings() *runtimeBindings { return &runtimeBindings{} } @@ -152,6 +158,21 @@ func RuntimeBindingsFromContext(ctx context.Context) (TraceRuntimeBindings, bool return bindings, true } +// ContextWithTraceFilters stores the active PID/TID filters for the trace starter. +func ContextWithTraceFilters(ctx context.Context, pidFilter, tidFilter int) context.Context { + filters := traceFilters{pidFilter: pidFilter, tidFilter: tidFilter} + return context.WithValue(ctx, traceFiltersContextKey{}, filters) +} + +// TraceFiltersFromContext returns the active PID/TID filters when provided by the TUI model. +func TraceFiltersFromContext(ctx context.Context) (pidFilter, tidFilter int, ok bool) { + filters, ok := ctx.Value(traceFiltersContextKey{}).(traceFilters) + if !ok { + return 0, 0, false + } + return filters.pidFilter, filters.tidFilter, true +} + // Run starts the TUI program in alternate screen mode. func Run() error { return RunWithTraceStarter(defaultTraceStarter) @@ -159,8 +180,12 @@ func Run() error { // RunWithTraceStarter starts the TUI program with a custom trace starter. func RunWithTraceStarter(starter TraceStarter) error { - cfg := flags.Get() - model := newModelWithRuntimeConfig(cfg.PidFilter, cfg.PidFilter, cfg.TUIExportEnable, starter) + return RunWithTraceStarterConfig(flags.Get(), starter) +} + +// RunWithTraceStarterConfig starts the TUI with explicit runtime flags. +func RunWithTraceStarterConfig(cfg flags.Flags, starter TraceStarter) error { + model := newModelWithRuntimeConfig(cfg.PidFilter, cfg.PidFilter, cfg.TidFilter, cfg.TUIExportEnable, starter) program := tea.NewProgram(model) _, err := program.Run() return err @@ -169,8 +194,12 @@ func RunWithTraceStarter(starter TraceStarter) error { // RunTestFlamesWithTraceStarter starts the TUI directly on dashboard/flame view // with a synthetic static flamegraph source. func RunTestFlamesWithTraceStarter(starter TraceStarter) error { - cfg := flags.Get() - model := newModelWithRuntimeConfig(1, 1, cfg.TUIExportEnable, starter) + return RunTestFlamesWithTraceStarterConfig(flags.Get(), starter) +} + +// RunTestFlamesWithTraceStarterConfig starts test-flames mode with explicit runtime flags. +func RunTestFlamesWithTraceStarterConfig(cfg flags.Flags, starter TraceStarter) error { + model := newModelWithRuntimeConfig(1, 1, -1, cfg.TUIExportEnable, starter) program := tea.NewProgram(model) _, err := program.Run() return err @@ -201,6 +230,7 @@ type Model struct { traceStop context.CancelFunc pidFilter int + tidFilter int exportEnabled bool isDark bool focused bool @@ -220,11 +250,15 @@ type Model struct { // NewModel creates the top-level TUI model. func NewModel(initialPID int, startTrace TraceStarter) Model { - cfg := flags.Get() - return newModelWithRuntimeConfig(initialPID, cfg.PidFilter, cfg.TUIExportEnable, startTrace) + return NewModelWithConfig(flags.Get(), initialPID, startTrace) } -func newModelWithRuntimeConfig(initialPID, startupPidFilter int, exportEnabled bool, startTrace TraceStarter) Model { +// NewModelWithConfig creates the top-level TUI model with explicit runtime flags. +func NewModelWithConfig(cfg flags.Flags, initialPID int, startTrace TraceStarter) Model { + return newModelWithRuntimeConfig(initialPID, cfg.PidFilter, cfg.TidFilter, cfg.TUIExportEnable, startTrace) +} + +func newModelWithRuntimeConfig(initialPID, startupPidFilter, startupTidFilter int, exportEnabled bool, startTrace TraceStarter) Model { common.ApplyPalette(true) syncStylesFromCommon() @@ -245,6 +279,10 @@ func newModelWithRuntimeConfig(initialPID, startupPidFilter int, exportEnabled b if initialPID > 0 { pidFilter = selectedPIDFilter(initialPID) } + tidFilter := selectedPIDFilter(startupTidFilter) + if initialPID > 0 { + tidFilter = -1 + } dashboard.SetPidFilter(pidFilter) model := Model{ @@ -258,13 +296,13 @@ func newModelWithRuntimeConfig(initialPID, startupPidFilter int, exportEnabled b spin: spin, startTrace: startTrace, pidFilter: pidFilter, + tidFilter: tidFilter, exportEnabled: exportEnabled, isDark: true, focused: true, } if initialPID > 0 { - flags.SetPidFilter(initialPID) model.screen = ScreenDashboard model.attaching = true } @@ -529,9 +567,8 @@ func (m Model) updateActiveModel(msg tea.Msg) (tea.Model, tea.Cmd) { func (m Model) handlePidSelected(msg PidSelectedMsg) (tea.Model, tea.Cmd) { pid := selectedPIDFilter(msg.Pid) m.stopTrace() - flags.SetPidFilter(pid) - flags.SetTidFilter(-1) m.pidFilter = pid + m.tidFilter = -1 m.dashboard.SetPidFilter(pid) m.screen = ScreenDashboard m.attaching = true @@ -546,9 +583,8 @@ func (m Model) handleTidSelected(msg TidSelectedMsg) (tea.Model, tea.Cmd) { pid = msg.Pid } m.stopTrace() - flags.SetPidFilter(pid) - flags.SetTidFilter(tid) m.pidFilter = pid + m.tidFilter = tid m.dashboard.SetPidFilter(pid) m.screen = ScreenDashboard m.attaching = true @@ -607,6 +643,7 @@ func (m *Model) beginTraceCmd() tea.Cmd { ctx, cancel := context.WithCancel(context.Background()) m.traceStop = cancel ctx = context.WithValue(ctx, runtimeBindingsContextKey{}, m.runtime) + ctx = ContextWithTraceFilters(ctx, m.pidFilter, m.tidFilter) return startTraceCmd(m.startTrace, ctx) } |
