Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions lldb/include/lldb/Core/Debugger.h
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,7 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
lldb::LockableStreamFileSP GetErrorStreamSP() { return m_error_stream_sp; }
/// @}

bool IsInteractiveColorTTY();
bool StatuslineSupported();

void PushIOHandler(const lldb::IOHandlerSP &reader_sp,
Expand Down
9 changes: 9 additions & 0 deletions lldb/include/lldb/Utility/AnsiTerminal.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,15 @@

#define ANSI_ESC_START_LEN 2

// OSC (Operating System Commands)
#define OSC_ESCAPE_START "\033"
#define OSC_ESCAPE_END "\x07"

#define OSC_PROGRESS_REMOVE OSC_ESCAPE_START "]9;4;0;0" OSC_ESCAPE_END
#define OSC_PROGRESS_SHOW OSC_ESCAPE_START "]9;4;1;%u" OSC_ESCAPE_END
#define OSC_PROGRESS_ERROR OSC_ESCAPE_START "]9;4;2;%u" OSC_ESCAPE_END
#define OSC_PROGRESS_INDETERMINATE OSC_ESCAPE_START "]9;4;3;%u" OSC_ESCAPE_END

#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
Expand Down
10 changes: 6 additions & 4 deletions lldb/source/Core/CoreProperties.td
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,12 @@ let Definition = "debugger" in {
Global,
DefaultTrue,
Desc<"Whether to use Ansi color codes or not.">;
def ShowProgress: Property<"show-progress", "Boolean">,
Global,
DefaultTrue,
Desc<"Whether to show progress or not if the debugger's output is an interactive color-enabled terminal.">;
def ShowProgress
: Property<"show-progress", "Boolean">,
Global,
DefaultFalse,
Desc<"Whether to show progress using Operating System Command (OSC) "
"Sequences in supporting terminal emulators.">;
def ShowProgressAnsiPrefix: Property<"show-progress-ansi-prefix", "String">,
Copy link
Collaborator

Choose a reason for hiding this comment

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

We should/should have release noted that this and the next setting now do nothing.

Copy link
Member Author

Choose a reason for hiding this comment

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

You're right. I've retroactively included in the new release note.

Global,
DefaultStringValue<"${ansi.faint}">,
Expand Down
49 changes: 39 additions & 10 deletions lldb/source/Core/Debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2066,19 +2066,23 @@ void Debugger::CancelForwardEvents(const ListenerSP &listener_sp) {
m_forward_listener_sp.reset();
}

bool Debugger::IsInteractiveColorTTY() {
if (lldb::LockableStreamFileSP stream_sp = GetOutputStreamSP()) {
File &file = stream_sp->GetUnlockedFile();
return file.GetIsInteractive() && file.GetIsRealTerminal() &&
file.GetIsTerminalWithColors();
}
return false;
}

bool Debugger::StatuslineSupported() {
// We have trouble with the contol codes on Windows, see
// https://github.com/llvm/llvm-project/issues/134846.
#ifndef _WIN32
if (GetShowStatusline()) {
if (lldb::LockableStreamFileSP stream_sp = GetOutputStreamSP()) {
File &file = stream_sp->GetUnlockedFile();
return file.GetIsInteractive() && file.GetIsRealTerminal() &&
file.GetIsTerminalWithColors();
}
}
#endif
return GetShowStatusline() && IsInteractiveColorTTY();
#else
return false;
#endif
}

static bool RequiresFollowChildWorkaround(const Process &process) {
Expand Down Expand Up @@ -2271,10 +2275,11 @@ void Debugger::HandleProgressEvent(const lldb::EventSP &event_sp) {
ProgressReport progress_report{data->GetID(), data->GetCompleted(),
data->GetTotal(), data->GetMessage()};

// Do some bookkeeping regardless of whether we're going to display
// progress reports.
{
std::lock_guard<std::mutex> guard(m_progress_reports_mutex);

// Do some bookkeeping regardless of whether we're going to display
// progress reports.
auto it = llvm::find_if(m_progress_reports, [&](const auto &report) {
return report.id == progress_report.id;
});
Expand All @@ -2287,6 +2292,30 @@ void Debugger::HandleProgressEvent(const lldb::EventSP &event_sp) {
} else {
m_progress_reports.push_back(progress_report);
}

// Show progress using Operating System Command (OSC) sequences.
if (GetShowProgress() && IsInteractiveColorTTY()) {
if (lldb::LockableStreamFileSP stream_sp = GetOutputStreamSP()) {

// Clear progress if this was the last progress event.
if (m_progress_reports.empty()) {
stream_sp->Lock() << OSC_PROGRESS_REMOVE;
return;
}

const ProgressReport &report = m_progress_reports.back();

// Show indeterminate progress.
if (report.total == UINT64_MAX) {
stream_sp->Lock() << OSC_PROGRESS_INDETERMINATE;
return;
}

// Compute and show the progress value (0-100).
const unsigned value = (report.completed / report.total) * 100;
stream_sp->Lock().Printf(OSC_PROGRESS_SHOW, value);
}
}
}
}

Expand Down
Loading