diff --git a/Terminal.Gui/Views/Markdown/MarkdownView.Mouse.cs b/Terminal.Gui/Views/Markdown/MarkdownView.Mouse.cs index 62e68ba58f..694a5d3253 100644 --- a/Terminal.Gui/Views/Markdown/MarkdownView.Mouse.cs +++ b/Terminal.Gui/Views/Markdown/MarkdownView.Mouse.cs @@ -59,7 +59,10 @@ private void SetupBindingsAndCommands () // The base class binds LeftButtonReleased → Activate; remove that so Activate // fires only on LeftButtonClicked (not twice per click which would clear selection). + // Also remove the base class Ctrl+LeftButtonReleased → Context binding so that + // Ctrl+Click can follow links without triggering the context menu popover. MouseBindings.Remove (MouseFlags.LeftButtonReleased); + MouseBindings.Remove (MouseFlags.LeftButtonReleased | MouseFlags.Ctrl); MouseBindings.ReplaceCommands (MouseFlags.LeftButtonClicked, Command.Activate); // Right-click is handled directly in OnMouseEvent so that the view can be focused diff --git a/Tests/UnitTestsParallelizable/Views/Markdown/MarkdownViewSelectionTests.cs b/Tests/UnitTestsParallelizable/Views/Markdown/MarkdownViewSelectionTests.cs index 156bba53c3..5aa297745e 100644 --- a/Tests/UnitTestsParallelizable/Views/Markdown/MarkdownViewSelectionTests.cs +++ b/Tests/UnitTestsParallelizable/Views/Markdown/MarkdownViewSelectionTests.cs @@ -250,6 +250,49 @@ public void MouseBindings_LeftButtonPressedPositionReport_IsBoundTo_Activate () mv.Dispose (); } + // Copilot - Regression: #5272 — Ctrl+LeftButtonReleased must NOT be bound to Context + // The base View class adds this binding; Markdown must remove it so Ctrl+Click can follow + // links without triggering the context menu popover. + [Fact] + public void MouseBindings_CtrlLeftButtonReleased_IsNotBoundTo_Context () + { + Terminal.Gui.Views.Markdown mv = new (); + + bool found = mv.MouseBindings.TryGet (MouseFlags.LeftButtonReleased | MouseFlags.Ctrl, out _); + + Assert.False (found); + + mv.Dispose (); + } + + // Copilot - Regression: #5272 — Ctrl+Click on a link opens the link and does NOT show context menu + [Fact] + public void CtrlClick_On_Link_Opens_Link_And_Does_Not_Show_Context_Menu () + { + (IApplication app, Runnable window, Terminal.Gui.Views.Markdown mv) = CreateMv ("[Click](https://example.com)"); + + mv.SetFocus (); + + var linkClicked = false; + + mv.LinkClicked += (_, e) => + { + linkClicked = true; + e.Handled = true; + }; + + // Simulate Ctrl+Click: press, Ctrl+release, Ctrl+clicked + mv.NewMouseEvent (new Mouse { Position = new Point (0, 0), Flags = MouseFlags.LeftButtonPressed }); + mv.NewMouseEvent (new Mouse { Position = new Point (0, 0), Flags = MouseFlags.LeftButtonReleased | MouseFlags.Ctrl }); + mv.NewMouseEvent (new Mouse { Position = new Point (0, 0), Flags = MouseFlags.LeftButtonClicked }); + + Assert.True (linkClicked); + Assert.True (mv.ContextMenu is null || !mv.ContextMenu.Visible); + + window.Dispose (); + app.Dispose (); + } + // Copilot - verifies that a drag (press + position-report) activates the selection [Fact] public void Drag_Mouse_Creates_Selection ()