Parcourir la source

Fixes #3394. View.Dispose doen't call UngrabMouse if MouseGrabView is the view itself.

BDisp il y a 1 an
Parent
commit
d5800743ea
2 fichiers modifiés avec 29 ajouts et 0 suppressions
  1. 5 0
      Terminal.Gui/View/View.cs
  2. 24 0
      UnitTests/Application/MouseTests.cs

+ 5 - 0
Terminal.Gui/View/View.cs

@@ -521,6 +521,11 @@ public partial class View : Responder, ISupportInitializeNotification
 
         DisposeAdornments ();
 
+        if (Application.MouseGrabView is { } && Application.MouseGrabView == this)
+        {
+            Application.UngrabMouse ();
+        }
+
         for (int i = InternalSubviews.Count - 1; i >= 0; i--)
         {
             View subview = InternalSubviews [i];

+ 24 - 0
UnitTests/Application/MouseTests.cs

@@ -371,5 +371,29 @@ public class MouseTests
         }
     }
 
+    [Fact]
+    [AutoInitShutdown]
+    public void MouseGrabView_Is_Set_To_Null_If_A_View_Was_Disposed ()
+    {
+        var count = 0;
+        var view = new View { Width = 1, Height = 1 };
+        view.MouseEvent += (s, e) => count++;
+        var top = new Toplevel ();
+        top.Add (view);
+        Application.Begin (top);
+
+        Assert.Null (Application.MouseGrabView);
+        Application.GrabMouse (view);
+        Assert.Equal (view, Application.MouseGrabView);
+        top.Remove (view);
+        view.Dispose ();
+#if DEBUG_IDISPOSABLE
+        Assert.True (view.WasDisposed);
+#endif
+
+        Application.OnMouseEvent (new () { X = 0, Y = 0, Flags = MouseFlags.Button1Pressed });
+        Assert.Null (Application.MouseGrabView);
+        Assert.Equal (0, count);
+    }
     #endregion
 }