Compare commits

...

2 Commits

Author SHA1 Message Date
Copilot b9a3001c11 Add DISCORDCHATEXPORTER_SETTINGS_PATH env var override for settings file path (#1500)
Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-03-02 20:06:20 +02:00
Copilot dadfe5b8ef Guard App.Dispose() against double-invocation and late shutdown (#1499)
Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-03-02 18:42:35 +02:00
3 changed files with 49 additions and 7 deletions
+23
View File
@@ -26,6 +26,8 @@ public class App : Application, IDisposable
private readonly SettingsService _settingsService;
private readonly MainViewModel _mainViewModel;
private bool _isDisposed;
public App()
{
var services = new ServiceCollection();
@@ -98,8 +100,24 @@ public class App : Application, IDisposable
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainView { DataContext = _mainViewModel };
void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs args)
{
if (sender is IControlledApplicationLifetime lifetime)
lifetime.Exit -= OnExit;
Dispose();
}
// Although `App.Dispose()` is invoked from `Program.Main(...)`, on some platforms
// it may be called too late in the shutdown lifecycle. Attach an exit
// handler to ensure timely disposal as a safeguard.
// https://github.com/Tyrrrz/YoutubeDownloader/issues/795
desktop.Exit += OnExit;
}
base.OnFrameworkInitializationCompleted();
// Set up custom theme colors
@@ -115,6 +133,11 @@ public class App : Application, IDisposable
public void Dispose()
{
if (_isDisposed)
return;
_isDisposed = true;
_eventRoot.Dispose();
_services.Dispose();
}
@@ -1,6 +1,4 @@
using System;
using System.IO;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization;
using Cogwheel;
using CommunityToolkit.Mvvm.ComponentModel;
using DiscordChatExporter.Core.Discord;
@@ -13,10 +11,7 @@ namespace DiscordChatExporter.Gui.Services;
[ObservableObject]
public partial class SettingsService()
: SettingsBase(
Path.Combine(AppContext.BaseDirectory, "Settings.dat"),
SerializerContext.Default
)
: SettingsBase(StartOptions.Current.SettingsPath, SerializerContext.Default)
{
[ObservableProperty]
public partial bool IsUkraineSupportMessageEnabled { get; set; } = true;
+24
View File
@@ -0,0 +1,24 @@
using System;
using System.IO;
namespace DiscordChatExporter.Gui;
public partial class StartOptions
{
public required string SettingsPath { get; init; }
}
public partial class StartOptions
{
public static StartOptions Current { get; } =
new()
{
SettingsPath =
Environment.GetEnvironmentVariable("DISCORDCHATEXPORTER_SETTINGS_PATH") is { } path
&& !string.IsNullOrWhiteSpace(path)
? Path.EndsInDirectorySeparator(path) || Directory.Exists(path)
? Path.Combine(path, "Settings.dat")
: path
: Path.Combine(AppContext.BaseDirectory, "Settings.dat"),
};
}