diff --git a/go.mod b/go.mod index 8cf89c9ba1..8e6b2999f3 100644 --- a/go.mod +++ b/go.mod @@ -120,7 +120,7 @@ require ( github.com/axiomhq/hyperloglog v0.2.5 github.com/buger/jsonparser v1.1.1 github.com/charmbracelet/bubbles v0.20.0 - github.com/charmbracelet/bubbletea v1.3.3 + github.com/charmbracelet/bubbletea v1.3.4 github.com/charmbracelet/lipgloss v1.0.1-0.20250110214317-ecc1bd014d51 github.com/coder/quartz v0.1.3 github.com/d4l3k/messagediff v1.2.1 diff --git a/go.sum b/go.sum index cf87ab5e6e..e973c485d2 100644 --- a/go.sum +++ b/go.sum @@ -269,8 +269,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= -github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY= -github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= +github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= +github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/lipgloss v1.0.1-0.20250110214317-ecc1bd014d51 h1:f+0mEkhorXNiBaHb4V9wyd364OH/aF7md7ZngkS+1gU= github.com/charmbracelet/lipgloss v1.0.1-0.20250110214317-ecc1bd014d51/go.mod h1:QRGthpgH59/perglqXZC8xPHqDGZ9BB45ChJCFEWEMI= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= diff --git a/vendor/github.com/charmbracelet/bubbletea/inputreader_other.go b/vendor/github.com/charmbracelet/bubbletea/inputreader_other.go index 8e63a87dc6..3426a177c7 100644 --- a/vendor/github.com/charmbracelet/bubbletea/inputreader_other.go +++ b/vendor/github.com/charmbracelet/bubbletea/inputreader_other.go @@ -9,6 +9,6 @@ import ( "github.com/muesli/cancelreader" ) -func newInputReader(r io.Reader) (cancelreader.CancelReader, error) { +func newInputReader(r io.Reader, _ bool) (cancelreader.CancelReader, error) { return cancelreader.NewReader(r) } diff --git a/vendor/github.com/charmbracelet/bubbletea/inputreader_windows.go b/vendor/github.com/charmbracelet/bubbletea/inputreader_windows.go index dd5277cf0b..9af89428d8 100644 --- a/vendor/github.com/charmbracelet/bubbletea/inputreader_windows.go +++ b/vendor/github.com/charmbracelet/bubbletea/inputreader_windows.go @@ -25,7 +25,7 @@ type conInputReader struct { var _ cancelreader.CancelReader = &conInputReader{} -func newInputReader(r io.Reader) (cancelreader.CancelReader, error) { +func newInputReader(r io.Reader, enableMouse bool) (cancelreader.CancelReader, error) { fallback := func(io.Reader) (cancelreader.CancelReader, error) { return cancelreader.NewReader(r) } @@ -38,11 +38,21 @@ func newInputReader(r io.Reader) (cancelreader.CancelReader, error) { return fallback(r) } - originalMode, err := prepareConsole(conin, - windows.ENABLE_MOUSE_INPUT, + modes := []uint32{ windows.ENABLE_WINDOW_INPUT, windows.ENABLE_EXTENDED_FLAGS, - ) + } + + // Since we have options to enable mouse events, [WithMouseCellMotion], + // [WithMouseAllMotion], and [EnableMouseCellMotion], + // [EnableMouseAllMotion], and [DisableMouse], we need to check if the user + // has enabled mouse events and add the appropriate mode accordingly. + // Otherwise, mouse events will be enabled all the time. + if enableMouse { + modes = append(modes, windows.ENABLE_MOUSE_INPUT) + } + + originalMode, err := prepareConsole(conin, modes...) if err != nil { return nil, fmt.Errorf("failed to prepare console input: %w", err) } diff --git a/vendor/github.com/charmbracelet/bubbletea/tea.go b/vendor/github.com/charmbracelet/bubbletea/tea.go index 743a866e93..0bc915e5b3 100644 --- a/vendor/github.com/charmbracelet/bubbletea/tea.go +++ b/vendor/github.com/charmbracelet/bubbletea/tea.go @@ -16,6 +16,7 @@ import ( "io" "os" "os/signal" + "runtime" "runtime/debug" "sync" "sync/atomic" @@ -183,6 +184,9 @@ type Program struct { // fps is the frames per second we should set on the renderer, if // applicable, fps int + + // mouseMode is true if the program should enable mouse mode on Windows. + mouseMode bool } // Quit is a special command that tells the Bubble Tea program to exit. @@ -413,9 +417,25 @@ func (p *Program) eventLoop(model Model, cmds chan Cmd) (Model, error) { // mouse mode (1006) is a no-op if the terminal doesn't support it. p.renderer.enableMouseSGRMode() + // XXX: This is used to enable mouse mode on Windows. We need + // to reinitialize the cancel reader to get the mouse events to + // work. + if runtime.GOOS == "windows" && !p.mouseMode { + p.mouseMode = true + p.initCancelReader(true) //nolint:errcheck + } + case disableMouseMsg: p.disableMouse() + // XXX: On Windows, mouse mode is enabled on the input reader + // level. We need to instruct the input reader to stop reading + // mouse events. + if runtime.GOOS == "windows" && p.mouseMode { + p.mouseMode = false + p.initCancelReader(true) //nolint:errcheck + } + case showCursorMsg: p.renderer.showCursor() @@ -579,6 +599,11 @@ func (p *Program) Run() (Model, error) { p.renderer.enableMouseAllMotion() p.renderer.enableMouseSGRMode() } + + // XXX: Should we enable mouse mode on Windows? + // This needs to happen before initializing the cancel and input reader. + p.mouseMode = p.startupOptions&withMouseCellMotion != 0 || p.startupOptions&withMouseAllMotion != 0 + if p.startupOptions&withReportFocus != 0 { p.renderer.enableReportFocus() } @@ -607,7 +632,7 @@ func (p *Program) Run() (Model, error) { // Subscribe to user input. if p.input != nil { - if err := p.initCancelReader(); err != nil { + if err := p.initCancelReader(false); err != nil { return model, err } } @@ -763,7 +788,7 @@ func (p *Program) RestoreTerminal() error { if err := p.initTerminal(); err != nil { return err } - if err := p.initCancelReader(); err != nil { + if err := p.initCancelReader(false); err != nil { return err } if p.altScreenWasActive { diff --git a/vendor/github.com/charmbracelet/bubbletea/tty.go b/vendor/github.com/charmbracelet/bubbletea/tty.go index 02507782cc..9490facacb 100644 --- a/vendor/github.com/charmbracelet/bubbletea/tty.go +++ b/vendor/github.com/charmbracelet/bubbletea/tty.go @@ -75,9 +75,14 @@ func (p *Program) restoreInput() error { } // initCancelReader (re)commences reading inputs. -func (p *Program) initCancelReader() error { +func (p *Program) initCancelReader(cancel bool) error { + if cancel && p.cancelReader != nil { + p.cancelReader.Cancel() + p.waitForReadLoop() + } + var err error - p.cancelReader, err = newInputReader(p.input) + p.cancelReader, err = newInputReader(p.input, p.mouseMode) if err != nil { return fmt.Errorf("error creating cancelreader: %w", err) } diff --git a/vendor/modules.txt b/vendor/modules.txt index a707124216..7119c9773e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -537,7 +537,7 @@ github.com/charmbracelet/bubbles/runeutil github.com/charmbracelet/bubbles/spinner github.com/charmbracelet/bubbles/textinput github.com/charmbracelet/bubbles/viewport -# github.com/charmbracelet/bubbletea v1.3.3 +# github.com/charmbracelet/bubbletea v1.3.4 ## explicit; go 1.18 github.com/charmbracelet/bubbletea # github.com/charmbracelet/lipgloss v1.0.1-0.20250110214317-ecc1bd014d51