mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-30 01:38:01 +01:00
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.
This commit is contained in:
@@ -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 ();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 = @"
|
||||
|
||||
Reference in New Issue
Block a user