Skip to content

[lldb] Optimize statusline redrawing on terminal size change #146435

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

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions lldb/include/lldb/Core/Statusline.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ class Statusline {
/// Draw the statusline with the given text.
void Draw(std::string msg);

/// Update terminal dimensions.
void UpdateTerminalProperties();

enum ScrollWindowMode {
EnableStatusline,
DisableStatusline,
Expand Down
29 changes: 19 additions & 10 deletions lldb/source/Core/Statusline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,26 @@ Statusline::Statusline(Debugger &debugger)
Statusline::~Statusline() { Disable(); }

void Statusline::TerminalSizeChanged() {
UpdateTerminalProperties();
const uint64_t terminal_width = m_debugger.GetTerminalWidth();
const uint64_t terminal_height = m_debugger.GetTerminalHeight();

// Remember whether the terminal height changed.
const bool terminal_height_changed = terminal_height != m_terminal_height;

// Avoid clearing the old statusline if it's not visible (i.e. when the
// terminal height decreases), unless the width changed and the old statusline
// wrapped.
if (terminal_height > m_terminal_height || terminal_width < m_terminal_width)
Copy link
Collaborator

Choose a reason for hiding this comment

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

FWIW, my terminal is not wrapping the status line when the width decreases. In fact, it seems to be internally resetting (disabling) the scroll windows whenever the size changes.

UpdateScrollWindow(DisableStatusline);

// Update the terminal dimensions.
m_terminal_width = terminal_width;
m_terminal_height = terminal_height;

// Update the scroll window if the terminal height changed.
if (terminal_height_changed)
Copy link
Collaborator

Choose a reason for hiding this comment

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

So I think we'd need to do this unconditionally.

UpdateScrollWindow(EnableStatusline);

// This definitely isn't signal safe, but the best we can do, until we
// have proper signal-catching thread.
Redraw(/*update=*/false);
}

Expand Down Expand Up @@ -85,13 +101,6 @@ void Statusline::Draw(std::string str) {
locked_stream << ANSI_RESTORE_CURSOR;
}

void Statusline::UpdateTerminalProperties() {
UpdateScrollWindow(DisableStatusline);
m_terminal_width = m_debugger.GetTerminalWidth();
m_terminal_height = m_debugger.GetTerminalHeight();
UpdateScrollWindow(EnableStatusline);
}

void Statusline::UpdateScrollWindow(ScrollWindowMode mode) {
assert(m_terminal_width != 0 && m_terminal_height != 0);

Expand Down
Loading