void Scraper::directScrapeOutput()

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);
    }
}