Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: reimplement the event loop with a sequence parser #1080

Merged
merged 18 commits into from
Aug 19, 2024
Merged

Conversation

aymanbagabas
Copy link
Member

@aymanbagabas aymanbagabas commented Aug 12, 2024

Currently, Bubble Tea uses a simple lookup table to detect input events. Here, we're introducing an actual input sequence parser instead of simply using a lookup table. This will allow Bubble Tea programs to read all sorts of input events such Kitty keyboard, background color, mode report, and all sorts of ANSI sequence input events.

This PR includes the following changes:

  • Support clipboard OSC52 read messages (OSC 52 ?)
  • Support terminal foreground/background/cursor color report messages (OSC10, OSC11, OSC12)
  • Support terminal focus events (mode 1004)
  • Deprecate the old KeyMsg API in favor of KeyPressMsg and KeyReleaseMsg
    • KeyType const values are different now. Programs that use int value comparison will break. E.g. key.Type == 13 where 13 is the control code for CR that corresponds to the enter key. (BREAKING CHANGE!)
    • Bubble Tea will send two messages for key presses, the first of type KeyMsg and the second of type KeyPressMsg. This is to keep backwards compatibility and not break the API
    • tea.Key contains breaking changes (BREAKING CHANGE!)
  • Deprecate MouseMsg in favor of MouseClickMsg, MouseReleaseMsg, MouseWheelMsg, and MouseMotionMsg
    • Bubble Tea will send two messages for mouse clicks, releases, wheel, and motion. The first message will be a MouseMsg type. And the second will have the new corresponding type. This is to keep backwards compatibility and not break the API
    • tea.Mouse contains breaking changes (BREAKING CHANGE!)
  • Support reading Kitty keyboard reports (reading the results of sending CSI ? u to the terminal)
  • Support reading Kitty keyboard and fixterms keys CSI u
  • Support reading terminal mode reports (DECRPM)
  • Bracketed-paste messages now have their own message type PasteMsg. Use PasteStartMsg and PasteEndMsg to listen to the start/end of the paste message.
    • Bubble Tea will send two messages for bracketed-paste, the first is of type KeyMsg and the second is of type PasteMsg. This is to keep backwards compatibility and not break the API
  • Support more obscure key input sequences found in URxvt and others
  • Support reading termcap/terminfo capabilities through XTGETTCAP. These capabilities will get reported as TermcapMsg
  • Support reading terminfo databases for key input sequences (disabled for now)
  • Support reading Win32 Input Mode keys
  • Support reading Xterm modifyOtherKeys keys

TODO:

Supersedes: #1079
Supersedes: #1014
Related: #869
Related: #163
Related: #918
Related: #850
Related: #207

Currently, Bubble Tea uses a simple lookup table to detect input events.
Here, we're introducing an actual input sequence parser instead of
simply using a lookup table. This will allow Bubble Tea programs to read
all sorts of input events such Kitty keyboard, background color, mode
report, and all sorts of ANSI sequence input events.

Supersedes: #1079
Supersedes: #1014
Related: #869
Related: #163
Related: #918
Related: #850
Related: #207
Comment on lines +3 to +5
go 1.21

toolchain go1.22.5
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this on purpose?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure, examples/ wouldn't build on go1.18 and this is what go mod tidy gave me

renderer.go Show resolved Hide resolved
We need to initialize the tty and the input handler before writing to
it.
)

func TestParseSequence_Events(t *testing.T) {
input := []byte("\x1b\x1b[Ztest\x00\x1b]10;rgb:1234/1234/1234\x07\x1b[27;2;27~\x1b[?1049;2$y")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we maybe be generating the input here programmatically? If this test fails, it seems like it might be a bit of a headache to figure out what went wrong with this sequence

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Always good to have more tests. We already do for key sequences in key_test.go.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added more tests for Kitty/fixterms, Xterm modifyOtherKeys, and terminal bg/fg/cur colors in their respective PRs.

A modified F3 key press has the same sequence as cursor position report.
We need to handle that by reporting both messages and letting the
program determine which one to listen for. On most cases, programs don't
care about modified F3 key press since terminals tend to have different
sequences for it.
aymanbagabas added a commit that referenced this pull request Aug 13, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
Move tracking bp to the program instead of the renderer. The renderer
doesn't need to know about the state of bp and gains nothing from that
information.
aymanbagabas added a commit that referenced this pull request Aug 13, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
aymanbagabas added a commit that referenced this pull request Aug 14, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
aymanbagabas added a commit that referenced this pull request Aug 14, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
aymanbagabas added a commit that referenced this pull request Aug 15, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
@aymanbagabas aymanbagabas merged commit 0c1a6a4 into master Aug 19, 2024
18 checks passed
@aymanbagabas aymanbagabas deleted the input branch August 19, 2024 15:47
aymanbagabas added a commit that referenced this pull request Aug 19, 2024
This adds the necessary options to enable/disable the kitty keyboard
protocol.

Needs: #1080
Fixes: #869
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants