in src/agent/Scraper.cc [434:474]
void Scraper::directScrapeOutput(const ConsoleScreenBufferInfo &info,
bool consoleCursorVisible)
{
const SmallRect windowRect = info.windowRect();
const SmallRect scrapeRect(
windowRect.left(), windowRect.top(),
std::min<SHORT>(std::min(windowRect.width(), m_ptySize.X),
MAX_CONSOLE_WIDTH),
std::min<SHORT>(std::min(windowRect.height(), m_ptySize.Y),
BUFFER_LINE_COUNT));
const int w = scrapeRect.width();
const int h = scrapeRect.height();
const Coord cursor = info.cursorPosition();
const bool showTerminalCursor =
consoleCursorVisible && scrapeRect.contains(cursor);
const int cursorColumn = !showTerminalCursor ? -1 : cursor.X - scrapeRect.Left;
const int cursorLine = !showTerminalCursor ? -1 : cursor.Y - scrapeRect.Top;
if (!showTerminalCursor) {
m_terminal->hideTerminalCursor();
}
largeConsoleRead(m_readBuffer, *m_consoleBuffer, scrapeRect, attributesMask());
for (int line = 0; line < h; ++line) {
const CHAR_INFO *const curLine =
m_readBuffer.lineData(scrapeRect.top() + line);
ConsoleLine &bufLine = m_bufferData[line];
if (bufLine.detectChangeAndSetLine(curLine, w)) {
const int lineCursorColumn =
line == cursorLine ? cursorColumn : -1;
m_terminal->sendLine(line, curLine, w, lineCursorColumn);
}
}
if (showTerminalCursor) {
m_terminal->showTerminalCursor(cursorColumn, cursorLine);
}
}