Skip to content

Commit 6f06d77

Browse files
authored
Merge pull request #3907 from MartinZikmund/dev/mazi/appexit
feat: Application.Exit on GTK and WPF
2 parents 067a98b + cb09f1a commit 6f06d77

File tree

7 files changed

+79
-3
lines changed

7 files changed

+79
-3
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using Uno.UI.Xaml;
3+
using Windows.UI.Xaml;
4+
5+
namespace Uno.UI.Runtime.Skia
6+
{
7+
public class GtkApplicationExtension : IApplicationExtension
8+
{
9+
private readonly Application _owner;
10+
11+
public GtkApplicationExtension(Application owner)
12+
{
13+
_owner = owner ?? throw new ArgumentNullException(nameof(owner));
14+
}
15+
16+
public bool CanExit => true;
17+
18+
public void Exit() => Gtk.Application.Default.Quit();
19+
}
20+
}

src/Uno.UI.Runtime.Skia.Gtk/GtkHost.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
using Windows.UI.Xaml.Controls;
1414
using Gtk;
1515
using Uno.UI.Runtime.Skia.GTK.Extensions.Helpers;
16-
16+
1717
namespace Uno.UI.Runtime.Skia
1818
{
1919
public class GtkHost : ISkiaHost
@@ -46,6 +46,7 @@ public void Run()
4646
SetupTheme();
4747

4848
ApiExtensibility.Register(typeof(Windows.UI.Core.ICoreWindowExtension), o => new GtkCoreWindowExtension(o));
49+
ApiExtensibility.Register<Windows.UI.Xaml.Application>(typeof(Uno.UI.Xaml.IApplicationExtension), o => new GtkApplicationExtension(o));
4950
ApiExtensibility.Register(typeof(Windows.UI.ViewManagement.IApplicationViewExtension), o => new GtkApplicationViewExtension(o));
5051
ApiExtensibility.Register(typeof(ISystemThemeHelperExtension), o => new GtkSystemThemeHelperExtension(o));
5152
ApiExtensibility.Register(typeof(Windows.Graphics.Display.IDisplayInformationExtension), o => _displayInformationExtension ??= new GtkDisplayInformationExtension(o, _window));
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using Uno.UI.Xaml;
3+
using Windows.UI.Xaml;
4+
5+
namespace Uno.UI.Runtime.Skia.Wpf
6+
{
7+
public class WpfApplicationExtension : IApplicationExtension
8+
{
9+
private readonly Application _owner;
10+
11+
public WpfApplicationExtension(Application owner)
12+
{
13+
_owner = owner ?? throw new ArgumentNullException(nameof(owner));
14+
}
15+
16+
public bool CanExit => true;
17+
18+
public void Exit() => System.Windows.Application.Current.Shutdown();
19+
}
20+
}

src/Uno.UI.Runtime.Skia.Wpf/WpfHost.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
using WpfCanvas = System.Windows.Controls.Canvas;
2323
using WpfControl = System.Windows.Controls.Control;
2424
using WpfFrameworkPropertyMetadata = System.Windows.FrameworkPropertyMetadata;
25+
using Uno.UI.Xaml;
26+
using Uno.UI.Runtime.Skia.Wpf;
2527

2628
namespace Uno.UI.Skia.Platform
2729
{
@@ -43,6 +45,7 @@ static WpfHost()
4345
DefaultStyleKeyProperty.OverrideMetadata(typeof(WpfHost), new WpfFrameworkPropertyMetadata(typeof(WpfHost)));
4446

4547
ApiExtensibility.Register(typeof(Windows.UI.Core.ICoreWindowExtension), o => new WpfCoreWindowExtension(o));
48+
ApiExtensibility.Register<Windows.UI.Xaml.Application>(typeof(IApplicationExtension), o => new WpfApplicationExtension(o));
4649
ApiExtensibility.Register(typeof(Windows.UI.ViewManagement.IApplicationViewExtension), o => new WpfApplicationViewExtension(o));
4750
ApiExtensibility.Register(typeof(ISystemThemeHelperExtension), o => new WpfSystemThemeHelperExtension(o));
4851
ApiExtensibility.Register(typeof(IDisplayInformationExtension), o => new WpfDisplayInformationExtension(o));

src/Uno.UI/UI/Xaml/Application.Skia.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
using Uno.UI;
1313
using Uno.UI.Xaml;
1414
using Uno.Foundation.Extensibility;
15+
using Microsoft.Extensions.Logging;
1516

1617
namespace Windows.UI.Xaml
1718
{
1819
public partial class Application : IApplicationEvents
1920
{
2021
private static bool _startInvoked = false;
2122
private static string[] _args;
23+
private readonly IApplicationExtension _applicationExtension;
2224

2325
internal ISkiaHost Host { get; set; }
2426

@@ -32,6 +34,8 @@ public Application()
3234
throw new InvalidOperationException("The application must be started using Application.Start first, e.g. Windows.UI.Xaml.Application.Start(_ => new App());");
3335
}
3436

37+
ApiExtensibility.CreateInstance(this, out _applicationExtension);
38+
3539
CoreDispatcher.Main.RunAsync(CoreDispatcherPriority.Normal, Initialize);
3640
}
3741

@@ -41,6 +45,21 @@ internal static void Start(global::Windows.UI.Xaml.ApplicationInitializationCall
4145
Start(callback);
4246
}
4347

48+
public void Exit()
49+
{
50+
if (_applicationExtension != null && _applicationExtension.CanExit)
51+
{
52+
_applicationExtension.Exit();
53+
}
54+
else
55+
{
56+
if (this.Log().IsEnabled(LogLevel.Warning))
57+
{
58+
this.Log().LogWarning("This platform does not support application exit.");
59+
}
60+
}
61+
}
62+
4463
static partial void StartPartial(ApplicationInitializationCallback callback)
4564
{
4665
_startInvoked = true;

src/Uno.UI/UI/Xaml/Application.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Uno.Helpers.Theming;
1212
using Windows.UI.ViewManagement;
1313
using Uno.Extensions;
14+
using Microsoft.Extensions.Logging;
1415

1516
#if HAS_UNO_WINUI
1617
using LaunchActivatedEventArgs = Microsoft.UI.Xaml.LaunchActivatedEventArgs;
@@ -186,11 +187,14 @@ public void OnSystemThemeChanged()
186187
UISettings.OnColorValuesChanged();
187188
}
188189

189-
#if !__ANDROID__ && !__MACOS__
190+
#if !__ANDROID__ && !__MACOS__ && !__SKIA__
190191
[NotImplemented]
191192
public void Exit()
192193
{
193-
194+
if (this.Log().IsEnabled(LogLevel.Warning))
195+
{
196+
this.Log().LogWarning("This platform does not support application exit.");
197+
}
194198
}
195199
#endif
196200

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Uno.UI.Xaml
2+
{
3+
internal interface IApplicationExtension
4+
{
5+
bool CanExit { get; }
6+
7+
void Exit();
8+
}
9+
}

0 commit comments

Comments
 (0)