[Lldb-commits] [lldb] aa889ed - [lldb] Fix statusline terminal resizing
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Mon Mar 31 23:58:44 PDT 2025
Author: Jonas Devlieghere
Date: 2025-03-31T23:53:35-07:00
New Revision: aa889ed129ff26d9341c50a9eaba4db728ca6212
URL: https://github.com/llvm/llvm-project/commit/aa889ed129ff26d9341c50a9eaba4db728ca6212
DIFF: https://github.com/llvm/llvm-project/commit/aa889ed129ff26d9341c50a9eaba4db728ca6212.diff
LOG: [lldb] Fix statusline terminal resizing
Simplify and fix the logic to clear the old statusline when the terminal
window dimensions have changed. I accidentally broke the terminal
resizing behavior when addressing code review feedback.
I'd really like to figure out a way to test this. PExpect isn't a good
fit for this, because I really need to check the result, rather than the
control characters, as the latter doesn't tell me whether any part of
the old statusline is still visible.
Added:
Modified:
lldb/include/lldb/Core/Statusline.h
lldb/source/Core/Statusline.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/Core/Statusline.h b/lldb/include/lldb/Core/Statusline.h
index c1449f0f69081..521b9f2526f6b 100644
--- a/lldb/include/lldb/Core/Statusline.h
+++ b/lldb/include/lldb/Core/Statusline.h
@@ -10,8 +10,6 @@
#define LLDB_CORE_STATUSLINE_H
#include "lldb/lldb-forward.h"
-#include "llvm/ADT/StringRef.h"
-#include <csignal>
#include <cstdint>
#include <string>
@@ -34,10 +32,6 @@ class Statusline {
/// Inform the statusline that the terminal dimensions have changed.
void TerminalSizeChanged();
-protected:
- /// Pad and trim the given string to fit to the given width.
- static std::string TrimAndPad(std::string str, size_t width);
-
private:
/// Draw the statusline with the given text.
void Draw(std::string msg);
@@ -46,20 +40,15 @@ class Statusline {
void UpdateTerminalProperties();
enum ScrollWindowMode {
- ScrollWindowExtend,
- ScrollWindowShrink,
+ EnableStatusline,
+ DisableStatusline,
};
/// Set the scroll window for the given mode.
void UpdateScrollWindow(ScrollWindowMode mode);
- /// Clear the statusline (without redrawing the background).
- void Reset();
-
Debugger &m_debugger;
std::string m_last_str;
-
- volatile std::sig_atomic_t m_terminal_size_has_changed = 1;
uint64_t m_terminal_width = 0;
uint64_t m_terminal_height = 0;
};
diff --git a/lldb/source/Core/Statusline.cpp b/lldb/source/Core/Statusline.cpp
index c01388eb7e7b5..c18fbb6c5561e 100644
--- a/lldb/source/Core/Statusline.cpp
+++ b/lldb/source/Core/Statusline.cpp
@@ -23,7 +23,8 @@
#define ANSI_SAVE_CURSOR ESCAPE "7"
#define ANSI_RESTORE_CURSOR ESCAPE "8"
#define ANSI_CLEAR_BELOW ESCAPE "[J"
-#define ANSI_CLEAR_LINE "\r\x1B[2K"
+#define ANSI_CURSOR_DOWN ESCAPE "[B"
+#define ANSI_CLEAR_LINE ESCAPE "[2K"
#define ANSI_SET_SCROLL_ROWS ESCAPE "[0;%ur"
#define ANSI_TO_START_OF_ROW ESCAPE "[%u;0f"
#define ANSI_UP_ROWS ESCAPE "[%dA"
@@ -31,12 +32,16 @@
using namespace lldb;
using namespace lldb_private;
-Statusline::Statusline(Debugger &debugger) : m_debugger(debugger) { Enable(); }
+Statusline::Statusline(Debugger &debugger)
+ : m_debugger(debugger), m_terminal_width(m_debugger.GetTerminalWidth()),
+ m_terminal_height(m_debugger.GetTerminalHeight()) {
+ Enable();
+}
Statusline::~Statusline() { Disable(); }
void Statusline::TerminalSizeChanged() {
- m_terminal_size_has_changed = 1;
+ UpdateTerminalProperties();
// This definitely isn't signal safe, but the best we can do, until we
// have proper signal-catching thread.
@@ -44,20 +49,16 @@ void Statusline::TerminalSizeChanged() {
}
void Statusline::Enable() {
- UpdateTerminalProperties();
-
// Reduce the scroll window to make space for the status bar below.
- UpdateScrollWindow(ScrollWindowShrink);
+ UpdateScrollWindow(EnableStatusline);
// Draw the statusline.
- Redraw();
+ Redraw(/*update=*/true);
}
void Statusline::Disable() {
- UpdateTerminalProperties();
-
// Extend the scroll window to cover the status bar.
- UpdateScrollWindow(ScrollWindowExtend);
+ UpdateScrollWindow(DisableStatusline);
}
void Statusline::Draw(std::string str) {
@@ -65,8 +66,6 @@ void Statusline::Draw(std::string str) {
if (!stream_sp)
return;
- UpdateTerminalProperties();
-
m_last_str = str;
str = ansi::TrimAndPad(str, m_terminal_width);
@@ -80,58 +79,37 @@ void Statusline::Draw(std::string str) {
locked_stream << ANSI_RESTORE_CURSOR;
}
-void Statusline::Reset() {
- lldb::LockableStreamFileSP stream_sp = m_debugger.GetOutputStreamSP();
- if (!stream_sp)
- return;
-
- LockedStreamFile locked_stream = stream_sp->Lock();
- locked_stream << ANSI_SAVE_CURSOR;
- locked_stream.Printf(ANSI_TO_START_OF_ROW,
- static_cast<unsigned>(m_terminal_height));
- locked_stream << ANSI_CLEAR_LINE;
- locked_stream << ANSI_RESTORE_CURSOR;
-}
-
void Statusline::UpdateTerminalProperties() {
- if (m_terminal_size_has_changed == 0)
- return;
-
- // Clear the previous statusline using the previous dimensions.
- Reset();
-
+ UpdateScrollWindow(DisableStatusline);
m_terminal_width = m_debugger.GetTerminalWidth();
m_terminal_height = m_debugger.GetTerminalHeight();
-
- // Set the scroll window based on the new terminal height.
- UpdateScrollWindow(ScrollWindowShrink);
-
- // Clear the flag.
- m_terminal_size_has_changed = 0;
+ UpdateScrollWindow(EnableStatusline);
}
void Statusline::UpdateScrollWindow(ScrollWindowMode mode) {
+ assert(m_terminal_width != 0 && m_terminal_height != 0);
+
lldb::LockableStreamFileSP stream_sp = m_debugger.GetOutputStreamSP();
if (!stream_sp)
return;
const unsigned scroll_height =
- (mode == ScrollWindowExtend) ? m_terminal_height : m_terminal_height - 1;
+ (mode == DisableStatusline) ? m_terminal_height : m_terminal_height - 1;
LockedStreamFile locked_stream = stream_sp->Lock();
locked_stream << ANSI_SAVE_CURSOR;
locked_stream.Printf(ANSI_SET_SCROLL_ROWS, scroll_height);
locked_stream << ANSI_RESTORE_CURSOR;
switch (mode) {
- case ScrollWindowExtend:
- // Clear the screen below to hide the old statusline.
- locked_stream << ANSI_CLEAR_BELOW;
- break;
- case ScrollWindowShrink:
+ case EnableStatusline:
// Move everything on the screen up.
locked_stream.Printf(ANSI_UP_ROWS, 1);
locked_stream << '\n';
break;
+ case DisableStatusline:
+ // Clear the screen below to hide the old statusline.
+ locked_stream << ANSI_CLEAR_BELOW;
+ break;
}
}
More information about the lldb-commits
mailing list