倉庫指標
- Star
- (35,764 star)
- PR 合併指標
- (平均合併 27天 19小時) (30 天內合併 24 個 PR)
描述
Windows Terminal version
Current main
Windows build number
10.0.19044.2251
Other Software
Any win32 console app with mouse support, e.g. Far Manager
Steps to reproduce
Single-clicking intensively in different places in any console application with mouse support running in the Windows Terminal.
Code for repro
#include <iostream>
#include "windows.h"
int main()
{
auto reply = INPUT_RECORD{};
auto count = DWORD{};
auto input = ::GetStdHandle(STD_INPUT_HANDLE);
::SetConsoleMode(input, ENABLE_EXTENDED_FLAGS | ENABLE_MOUSE_INPUT);
while (::ReadConsoleInputW(input, &reply, 1, &count) && count)
{
if (reply.EventType == MOUSE_EVENT
&& reply.Event.MouseEvent.dwEventFlags & DOUBLE_CLICK)
{
std::cout << "DOUBLE_CLICK\n";
}
else if (reply.EventType == KEY_EVENT
&& reply.Event.KeyEvent.wVirtualKeyCode == 27)
{
break;
}
}
}
Expected Behavior
No spurious double clicks.
Actual Behavior
Spurious double clicks are triggered randomly
Apparently this is due to the SGR mouse tracking protocol misinterpretation. Mouse drag is interpreted as a single click and its last position is remembered as with a normal click, and when the button is released, a false double click occurs:
Everything works as expected If dragging is silently ignored (see possible fix below).
Possible fix: terminal\src\terminal\parser\InputStateMachineEngine.cpp:873:
const auto buttonID = (sgrEncoding & 0x3) | ((sgrEncoding & 0xC0) >> 4) | ((sgrEncoding & 0x20) >> 5) * 3;