diff --git a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs index e3fc7526d8..7974069184 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs +++ b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs @@ -18,7 +18,7 @@ namespace Avalonia.FreeDesktop private static readonly Lazy s_fileChooser = new(() => DBusHelper.Connection? .CreateProxy("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop")); - internal static async Task TryCreate(IPlatformHandle handle) + internal static async Task TryCreate(IPlatformHandle handle) { if (handle.HandleDescriptor == "XID" && s_fileChooser.Value is { } fileChooser) { diff --git a/src/Avalonia.X11/NativeDialogs/LinuxStorageProvider.cs b/src/Avalonia.X11/NativeDialogs/CompositeStorageProvider.cs similarity index 62% rename from src/Avalonia.X11/NativeDialogs/LinuxStorageProvider.cs rename to src/Avalonia.X11/NativeDialogs/CompositeStorageProvider.cs index 75293e12fb..5fe0f46b14 100644 --- a/src/Avalonia.X11/NativeDialogs/LinuxStorageProvider.cs +++ b/src/Avalonia.X11/NativeDialogs/CompositeStorageProvider.cs @@ -1,17 +1,17 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; using System.Threading.Tasks; -using Avalonia.FreeDesktop; using Avalonia.Platform.Storage; namespace Avalonia.X11.NativeDialogs; -internal class LinuxStorageProvider : IStorageProvider +internal class CompositeStorageProvider : IStorageProvider { - private readonly X11Window _window; - public LinuxStorageProvider(X11Window window) + private readonly IEnumerable>> _factories; + public CompositeStorageProvider(IEnumerable>> factories) { - _window = window; + _factories = factories; } public bool CanOpen => true; @@ -20,22 +20,14 @@ internal class LinuxStorageProvider : IStorageProvider private async Task EnsureStorageProvider() { - var options = AvaloniaLocator.Current.GetService() ?? new X11PlatformOptions(); - - if (options.UseDBusFilePicker) + foreach (var factory in _factories) { - var dBusDialog = await DBusSystemDialog.TryCreate(_window.Handle); - if (dBusDialog is not null) + var provider = await factory(); + if (provider is not null) { - return dBusDialog; + return provider; } } - - var gtkDialog = await GtkSystemDialog.TryCreate(_window); - if (gtkDialog is not null) - { - return gtkDialog; - } throw new InvalidOperationException("Neither DBus nor GTK are available on the system"); } @@ -46,7 +38,7 @@ internal class LinuxStorageProvider : IStorageProvider return await provider.OpenFilePickerAsync(options).ConfigureAwait(false); } - public async Task SaveFilePickerAsync(FilePickerSaveOptions options) + public async Task SaveFilePickerAsync(FilePickerSaveOptions options) { var provider = await EnsureStorageProvider().ConfigureAwait(false); return await provider.SaveFilePickerAsync(options).ConfigureAwait(false); @@ -58,13 +50,13 @@ internal class LinuxStorageProvider : IStorageProvider return await provider.OpenFolderPickerAsync(options).ConfigureAwait(false); } - public async Task OpenFileBookmarkAsync(string bookmark) + public async Task OpenFileBookmarkAsync(string bookmark) { var provider = await EnsureStorageProvider().ConfigureAwait(false); return await provider.OpenFileBookmarkAsync(bookmark).ConfigureAwait(false); } - public async Task OpenFolderBookmarkAsync(string bookmark) + public async Task OpenFolderBookmarkAsync(string bookmark) { var provider = await EnsureStorageProvider().ConfigureAwait(false); return await provider.OpenFolderBookmarkAsync(bookmark).ConfigureAwait(false); diff --git a/src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs b/src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs index ca3e0cd33d..89aa0340b5 100644 --- a/src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs +++ b/src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs @@ -31,7 +31,7 @@ namespace Avalonia.X11.NativeDialogs public override bool CanPickFolder => true; - internal static async Task TryCreate(X11Window window) + internal static async Task TryCreate(X11Window window) { _initialized ??= StartGtk(); diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index ef8ae2f70f..009ccb6159 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -22,6 +22,7 @@ using Avalonia.Rendering; using Avalonia.Rendering.Composition; using Avalonia.Threading; using Avalonia.X11.Glx; +using Avalonia.X11.NativeDialogs; using static Avalonia.X11.XLib; // ReSharper disable IdentifierTypo // ReSharper disable StringLiteralTypo @@ -215,7 +216,11 @@ namespace Avalonia.X11 _x11.Atoms.XA_CARDINAL, 32, PropertyMode.Replace, ref _xSyncCounter, 1); } - StorageProvider = new NativeDialogs.LinuxStorageProvider(this); + StorageProvider = new CompositeStorageProvider(new Func>[] + { + () => _platform.Options.UseDBusFilePicker ? DBusSystemDialog.TryCreate(Handle) : Task.FromResult(null), + () => GtkSystemDialog.TryCreate(this), + }); } class SurfaceInfo : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo