Fix v2 not raising closing events (#3961)

This commit is contained in:
Thomas Nind
2025-03-06 20:14:15 +00:00
committed by GitHub
parent fe18c81dc9
commit 7162ed850c
2 changed files with 67 additions and 0 deletions

View File

@@ -194,6 +194,23 @@ public class ApplicationV2 : ApplicationImpl
{
Logging.Logger.LogInformation ($"RequestStop '{top}'");
top ??= Application.Top;
if (top == null)
{
return;
}
var ev = new ToplevelClosingEventArgs (top);
top.OnClosing (ev);
if (ev.Cancel)
{
return;
}
top.Running = false;
// TODO: This definition of stop seems sketchy
Application.TopLevels.TryPop (out _);
@@ -205,6 +222,9 @@ public class ApplicationV2 : ApplicationImpl
{
Application.Top = null;
}
// Notify that it is closed
top.OnClosed (top);
}
/// <inheritdoc/>

View File

@@ -221,6 +221,53 @@ public class ApplicationV2Tests
ApplicationImpl.ChangeInstance (orig);
}
[Fact]
public void Test_V2_ClosingRaised ()
{
var orig = ApplicationImpl.Instance;
var v2 = NewApplicationV2 ();
ApplicationImpl.ChangeInstance (v2);
v2.Init ();
int closing=0;
int closed = 0;
var t=new Toplevel ();
t.Closing
+= (_, a) =>
{
// Cancel the first time
if (closing==0)
{
a.Cancel = true;
}
closing++;
Assert.Same(t,a.RequestingTop);
};
t.Closed
+= (_, a) =>
{
closed++;
Assert.Same (t, a.Toplevel);
};
v2.AddIdle (IdleExit);
// Blocks until the timeout call is hit
v2.Run (t);
Assert.Null (Application.Top);
v2.Shutdown ();
ApplicationImpl.ChangeInstance (orig);
Assert.Equal (2,closing);
Assert.Equal (1, closed);
}
private bool IdleExit ()
{
if (Application.Top != null)