microsoft/Terminal

Spurious double clicks

Open

#14 474 ouverte le 1 déc. 2022

Voir sur GitHub
 (1 commentaire) (0 réactions) (0 assignés)C++ (3 212 forks)batch import
Area-InputHelp WantedIssue-BugPriority-2Product-Conpty

Métriques du dépôt

Stars
 (35 764 stars)
Métriques de merge PR
 (Merge moyen 27j 19h) (24 PRs mergées en 30 j)

Description

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

https://user-images.githubusercontent.com/11535558/205082756-30e04223-fb40-407b-8766-fc74c8893674.mp4

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:

https://github.com/microsoft/terminal/blob/52cc523ed292a916f28cbd75f6c165285942e21c/src/terminal/parser/InputStateMachineEngine.cpp#L843-L971

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;

Guide contributeur