// Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later // Package applicationoverrides defines built-in, event-loop-owned application // adapters. Adapters interpret snapshots; they never own devices or persistence. package applicationoverrides import ( "git.stormux.org/storm/fenrir/internal/command" "git.stormux.org/storm/fenrir/internal/config" "git.stormux.org/storm/fenrir/internal/i18n" "git.stormux.org/storm/fenrir/internal/presentation" "git.stormux.org/storm/fenrir/internal/screen" ) type Region struct { Name, Text string } // Read includes the region's name for an explicit read. Automatic updates can // use Text alone when repeating the name would add unnecessary speech. func (r Region) Read() string { text := r.Text if text == "" { text = i18n.T("Information unavailable") } if r.Name == "" { return text } return i18n.Format("{0}: {1}", r.Name, text) } // Frame supplements the ordinary reader. OwnsPresentation replaces generic // automatic diffs, never raw review/copy or typing echo. Updates are independent // of focus: a focus change must not swallow a simultaneous chat message. type Frame struct { Recognized, OwnsPresentation, FocusChanged bool Focus, Updates []presentation.Message Regions []Region // Input limits typing/deletion echo to an application's actual input field. Input *screen.Region // InputCursor preserves navigation feedback inside Input while automatic // terminal diffs remain suppressed. Activity is indeterminate working state. InputCursor, Activity bool } type Adapter interface { Name() string Configure(*config.Settings) Observe(screen.Snapshot) Frame Command(command.ID) (presentation.CommandResult, bool) // Reset forgets screen-derived baselines after suspension or layout changes. Reset() Close() }