Skip to content

Conhost window is not refreshed after software scroll #15932

Closed

Description

Windows Terminal version

1.18.1462.0

Windows build number

10.0.19045.3324

Other Software

No response

Steps to reproduce

  1. Compile the code:
Details
#include <iostream>
#include <stdexcept>
#include <string>

#include <windows.h>

void scroll(bool page, bool up)
{
	const auto out = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	if (!GetConsoleScreenBufferInfo(out, &csbi))
		throw std::runtime_error("GetConsoleScreenBufferInfo");

	if (up && !csbi.srWindow.Top)
		return;

	if (!up && csbi.srWindow.Bottom == csbi.dwSize.Y - 1)
		return;

	auto lines = page?
		csbi.srWindow.Bottom - csbi.srWindow.Top + 1:
		1;

	if (up)
		lines = -lines;

	csbi.srWindow.Top += lines;
	csbi.srWindow.Bottom += lines;

	if (csbi.srWindow.Top < 0)
	{
		csbi.srWindow.Bottom -= csbi.srWindow.Top;
		csbi.srWindow.Top = 0;
	}

	if (csbi.srWindow.Bottom >= csbi.dwSize.Y)
	{
		csbi.srWindow.Top -= (csbi.srWindow.Bottom - (csbi.dwSize.Y - 1));
		csbi.srWindow.Bottom = csbi.dwSize.Y - 1;
	}

	if (!SetConsoleWindowInfo(out, true, &csbi.srWindow))
		throw std::runtime_error("SetConsoleWindowInfo");
}

void run()
{
	const auto width = 80, height = 25;
	const auto screens = 5;
	const auto out = GetStdHandle(STD_OUTPUT_HANDLE);
	const SMALL_RECT Window{ 0, 0, width - 1, height - 1 };
	SetConsoleWindowInfo(out, true, &Window);
	SetConsoleScreenBufferSize(out, { width, height * screens });

	for (size_t i = 0; i != height * screens - 1; ++i)
	{
		const auto data = L"Line " + std::to_wstring(i) + L"\n";
		DWORD n;
		WriteConsole(out, data.data(), static_cast<DWORD>(data.size()), &n, {});
	}

	const auto in = GetStdHandle(STD_INPUT_HANDLE);
	for (;;)
	{
		INPUT_RECORD r;
		DWORD n;
		if (!ReadConsoleInput(in, &r, 1, &n))
			break;

		if (r.EventType != KEY_EVENT || !r.Event.KeyEvent.bKeyDown)
			continue;

		switch (const auto key = r.Event.KeyEvent.wVirtualKeyCode)
		{
		case VK_UP:
		case VK_DOWN:
		case VK_NEXT:
		case VK_PRIOR:
			scroll(key == VK_NEXT || key == VK_PRIOR, key == VK_UP || key == VK_PRIOR);
		}
	}
}

int main()
{
	try
	{
		run();
	}
	catch(const std::exception& e)
	{
		std::cerr << e.what();
	}
}
  1. Run it with the latest published OpenConsole, e.g. from WT 1.18.1462.
  2. Press Up and Down a few times.
  3. Press PgUp and PgDn a few times.

Expected Behavior

The viewport moves up or down, line by line or page by page.

Actual Behavior

Pressing Up or Down works as expected.
Pressing PgUp or PgDown doesn't.

When PgUp/PgDown are pressed, the scrollbar on the right moves appropriately, indicating that the viewport has moved, but the window is not refreshed and shows the very same content.

The issue occurs only if the number of lines to scroll is >= window height.

The original issue is described here:
FarGroup/FarManager#727
According to the comments, the default conhost in Windows 11 is also affected to some extent.

Activity

  1. added
    Issue-BugIt either shouldn't be doing this or needs an investigation.
    Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting
    on Sep 5, 2023
  2. changed the title [-]Conhost window not in refreshed after software scroll[/-] [+]Conhost window is not refreshed after software scroll[/+] on Sep 5, 2023
  3. zadjii-msft commented on Sep 6, 2023

    @zadjii-msft
    Member
  4. added
    Product-ConhostFor issues in the Console codebase
    Area-OutputRelated to output processing (inserting text into buffer, retrieving buffer text, etc.)
    on Sep 6, 2023
  5. removed
    Product-ConhostFor issues in the Console codebase
    Area-OutputRelated to output processing (inserting text into buffer, retrieving buffer text, etc.)
    Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting
    on Sep 6, 2023
  6. added
    Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting
    on Sep 6, 2023
  7. added
    Product-ConhostFor issues in the Console codebase
    Area-OutputRelated to output processing (inserting text into buffer, retrieving buffer text, etc.)
    and removed
    Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting
    on Sep 6, 2023
  8. lhecker commented on Sep 6, 2023

    @lhecker
    Member

    FYI #15769 will be closed by #15935, but that's just because I'm effectively working around this bug. The timing of you filing this issue is great, because it just made me realize that the cause for #15769 is not SSH's handling of SIGWINCH directly, but rather SetConsoleWindowInfo itself.

  9. lhecker commented on Nov 17, 2023

    @lhecker
    Member

    This regression was caused by 81b7e54. Reverting it has no or negligible impact on performance at this point, likely due to the overall vastly better performance of conhost nowadays.

  10. added a commit that references this issue on Nov 27, 2023
    7a1b6f9
  11. added a commit that references this issue on Dec 4, 2023
    d4292d1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Area-OutputRelated to output processing (inserting text into buffer, retrieving buffer text, etc.)In-PRThis issue has a related PRIssue-BugIt either shouldn't be doing this or needs an investigation.Needs-Tag-FixDoesn't match tag requirementsProduct-ConhostFor issues in the Console codebase

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions