diff --git a/cmd/root.go b/cmd/root.go index 02ebbd0104e88a59b659c322a0605189b01afaaf..20c92f19357ed3350a36633c9b1be7bd91cd7ce0 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -120,6 +120,8 @@ to assist developers in writing, debugging, and understanding code directly from tea.WithAltScreen(), tea.WithKeyReleases(), tea.WithUniformKeyLayout(), + tea.WithMouseCellMotion(), // Use cell motion instead of all motion to reduce event flooding + tea.WithFilter(tui.MouseEventFilter), // Filter mouse events based on focus state ) // Setup the subscriptions, this will send services events to the TUI diff --git a/internal/tui/components/chat/editor/editor.go b/internal/tui/components/chat/editor/editor.go index 30d3aeef80c57487e665952f699cd7b4522db214..1464512a403d8208aea669dced2811e3efa4bae8 100644 --- a/internal/tui/components/chat/editor/editor.go +++ b/internal/tui/components/chat/editor/editor.go @@ -258,6 +258,7 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } } + m.textarea, cmd = m.textarea.Update(msg) cmds = append(cmds, cmd) return m, tea.Batch(cmds...) diff --git a/internal/tui/page/chat/chat.go b/internal/tui/page/chat/chat.go index b079859c5b935f02247f84ff0757933fc7a11a4f..59b8ac86da3901bfb5a3affe8aeedf27f293a507 100644 --- a/internal/tui/page/chat/chat.go +++ b/internal/tui/page/chat/chat.go @@ -39,6 +39,7 @@ type ( type ChatPage interface { util.Model layout.Help + IsChatFocused() bool } type chatPage struct { @@ -415,3 +416,8 @@ func NewChatPage(app *app.App) ChatPage { header: header.New(app.LSPClients), } } + +// IsChatFocused returns whether the chat messages are focused (true) or editor is focused (false) +func (p *chatPage) IsChatFocused() bool { + return p.chatFocused +} diff --git a/internal/tui/tui.go b/internal/tui/tui.go index 7ab868f20f830d040df3a5d2f17347faaec235d0..dd0d4f9085d92b20aa92c8d2f25227b5e2206816 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -31,6 +31,29 @@ import ( "github.com/charmbracelet/lipgloss/v2" ) +// MouseEventFilter filters mouse events based on the current focus state +// This is used with tea.WithFilter to prevent mouse scroll events from +// interfering with typing performance in the editor +func MouseEventFilter(m tea.Model, msg tea.Msg) tea.Msg { + // Only filter mouse events + switch msg.(type) { + case tea.MouseWheelMsg, tea.MouseMotionMsg: + // Check if we have an appModel and if editor is focused + if appModel, ok := m.(*appModel); ok { + if appModel.currentPage == chat.ChatPageID { + if chatPage, ok := appModel.pages[appModel.currentPage].(chat.ChatPage); ok { + // If editor is focused (not chatFocused), filter out mouse wheel/motion events + if !chatPage.IsChatFocused() { + return nil // Filter out the event + } + } + } + } + } + // Allow all other events to pass through + return msg +} + // appModel represents the main application model that manages pages, dialogs, and UI state. type appModel struct { wWidth, wHeight int // Window dimensions @@ -82,9 +105,6 @@ func (a appModel) Init() tea.Cmd { return nil }) - // Enable mouse support. - cmds = append(cmds, tea.EnableMouseAllMotion) - return tea.Batch(cmds...) }