From 2216f3a5daaee3d41eec0684a63ae599c3fd991a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Gustav=20Larsen?= <164860481+jglanycon@users.noreply.github.com> Date: Wed, 3 Apr 2024 21:32:19 +0200 Subject: [PATCH] Problem with setting the cursor position on the right screen edge when drawing. (#831) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When moving the cursor back to its original location, a problem arises when cursor placed in the right edge column, where an off by one error occur. This pull request will resolve this problem. Co-authored-by: Jørn Gustav Larsen Co-authored-by: Jørn Gustav Larsen Co-authored-by: ArthurSonzogni --- CHANGELOG.md | 1 + src/ftxui/component/screen_interactive.cpp | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a976af..4963ac5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ current (development) - Bugfix: `Input` `onchange` was not called on backspace or delete key. Fixed by @chrysante in chrysante in PR #776. - Bugfix: Propertly restore cursor shape on exit. See #792. +- Bugfix: Fix cursor position in when in the last column. See #831. ### Dom - Feature: Add `hscroll_indicator`. It display an horizontal indicator diff --git a/src/ftxui/component/screen_interactive.cpp b/src/ftxui/component/screen_interactive.cpp index c446f2e..dc729ac 100644 --- a/src/ftxui/component/screen_interactive.cpp +++ b/src/ftxui/component/screen_interactive.cpp @@ -844,10 +844,18 @@ void ScreenInteractive::Draw(Component component) { const int dx = dimx_ - 1 - cursor_.x + int(dimx_ != terminal.dimx); const int dy = dimy_ - 1 - cursor_.y; - set_cursor_position = "\x1B[" + std::to_string(dy) + "A" + // - "\x1B[" + std::to_string(dx) + "D"; - reset_cursor_position = "\x1B[" + std::to_string(dy) + "B" + // - "\x1B[" + std::to_string(dx) + "C"; + set_cursor_position.clear(); + reset_cursor_position.clear(); + + if (dy != 0) { + set_cursor_position += "\x1B[" + std::to_string(dy) + "A"; + reset_cursor_position += "\x1B[" + std::to_string(dy) + "B"; + } + + if (dx != 0) { + set_cursor_position += "\x1B[" + std::to_string(dx) + "D"; + reset_cursor_position += "\x1B[" + std::to_string(dx) + "C"; + } if (cursor_.shape == Cursor::Hidden) { set_cursor_position += "\033[?25l";