浏览代码

Merge pull request #3395 from BDisp/v2_view-dispose-mousegrabview-fix_3394

Fixes #3394. View.Dispose doen't call UngrabMouse if MouseGrabView is the view itself.
Tig 1 年之前
父节点
当前提交
980fed4bbb
共有 3 个文件被更改,包括 35 次插入20 次删除
  1. 6 0
      Terminal.Gui/Views/Menu/MenuBar.cs
  2. 25 0
      UnitTests/Application/MouseTests.cs
  3. 4 20
      UnitTests/Views/MenuBarTests.cs

+ 6 - 0
Terminal.Gui/Views/Menu/MenuBar.cs

@@ -1386,6 +1386,12 @@ public class MenuBar : View
                 menu = _openSubMenu [i];
                 Application.Current.Remove (menu);
                 _openSubMenu.Remove (menu);
+
+                if (Application.MouseGrabView == menu)
+                {
+                    Application.GrabMouse (this);
+                }
+
                 menu.Dispose ();
             }
 

+ 25 - 0
UnitTests/Application/MouseTests.cs

@@ -371,5 +371,30 @@ public class MouseTests
         }
     }
 
+    [Fact]
+    [AutoInitShutdown]
+    public void View_Is_Responsible_For_Calling_UnGrabMouse_Before_Being_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);
+        Application.UngrabMouse ();
+        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
 }

+ 4 - 20
UnitTests/Views/MenuBarTests.cs

@@ -3262,11 +3262,7 @@ Edit
         Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
         Assert.Equal (new Rectangle (1, 0, 8, 1), pos);
 
-        Assert.True (
-                     menu.NewMouseEvent (
-                                      new MouseEvent { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }
-                                     )
-                    );
+        Assert.True (menu.NewMouseEvent (new () { X = 1, Y = 0, Flags = MouseFlags.Button1Pressed, View = menu }));
         top.Draw ();
 
         expected = @"
@@ -3281,11 +3277,7 @@ Edit
         pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
         Assert.Equal (new Rectangle (1, 0, 10, 6), pos);
 
-        Assert.False (
-                      menu.NewMouseEvent (
-                                       new MouseEvent { X = 1, Y = 2, Flags = MouseFlags.Button1Clicked, View = Application.Top.Subviews [1] }
-                                      )
-                     );
+        Assert.False (menu.NewMouseEvent (new () { X = 1, Y = 2, Flags = MouseFlags.Button1Clicked, View = Application.Top.Subviews [1] }));
         top.Draw ();
 
         expected = @"
@@ -3301,11 +3293,7 @@ Edit
         pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
         Assert.Equal (new Rectangle (1, 0, 15, 7), pos);
 
-        Assert.False (
-                      menu.NewMouseEvent (
-                                       new MouseEvent { X = 1, Y = 1, Flags = MouseFlags.Button1Clicked, View = Application.Top.Subviews [2] }
-                                      )
-                     );
+        Assert.False (menu.NewMouseEvent (new () { X = 1, Y = 1, Flags = MouseFlags.Button1Clicked, View = Application.Top.Subviews [2] }));
         top.Draw ();
 
         expected = @"
@@ -3320,11 +3308,7 @@ Edit
         pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
         Assert.Equal (new Rectangle (1, 0, 10, 6), pos);
 
-        Assert.False (
-                      menu.NewMouseEvent (
-                                       new MouseEvent { X = 70, Y = 2, Flags = MouseFlags.Button1Clicked, View = Application.Top }
-                                      )
-                     );
+        Assert.False (menu.NewMouseEvent (new () { X = 70, Y = 2, Flags = MouseFlags.Button1Clicked, View = Application.Top }));
         top.Draw ();
 
         expected = @"