Track the cursor dirty flag in the correct buffer (#20095)

Failure to do so will result in every console API requiring a cursor
update stalling for 500ms because we sent the update to the wrong
buffer.

Closes #20092
This commit is contained in:
Dustin L. Howett
2026-04-08 17:08:28 -05:00
committed by GitHub
parent 41e08a68bd
commit 031998bfc3
3 changed files with 7 additions and 4 deletions

View File

@@ -36,7 +36,7 @@ void ConhostInternalGetSet::UnknownSequence() noexcept
// us from using a more conservative solution (e.g. always fetching the cursor position).
if (gci.IsInVtIoMode())
{
gci.GetActiveOutputBuffer().SetConptyCursorPositionMayBeWrong();
gci.GetActiveOutputBuffer().GetActiveBuffer().SetConptyCursorPositionMayBeWrong();
}
}

View File

@@ -595,9 +595,12 @@ constexpr T saturate(auto val)
RETURN_IF_FAILED(pObjectHandle->GetScreenBuffer(GENERIC_READ, &pObj));
// See ConptyCursorPositionMayBeWrong() for details.
if (pObj->ConptyCursorPositionMayBeWrong())
auto& activeBuffer = pObj->GetActiveBuffer();
// GetConsoleScreenBufferInfoExImpl uses GetActiveBuffer internally, but
// under the console lock.
if (activeBuffer.ConptyCursorPositionMayBeWrong())
{
pObj->WaitForConptyCursorPositionToBeSynchronized();
activeBuffer.WaitForConptyCursorPositionToBeSynchronized();
}
m->_pApiRoutines->GetConsoleScreenBufferInfoExImpl(*pObj, ex);

View File

@@ -166,7 +166,7 @@ void InteractDispatch::MoveCursor(const VTInt row, const VTInt col)
// Unblock any callers inside SCREEN_INFORMATION::WaitForConptyCursorPositionToBeSynchronized().
// The cursor position has now been updated to the terminal's.
info.ResetConptyCursorPositionMayBeWrong();
info.GetActiveBuffer().ResetConptyCursorPositionMayBeWrong();
}
// Routine Description: