a74162e34e
- Bottom-bar resolution dropdown (1080p60/1080p30/720p60/480p30) with tooltip on finding upload bandwidth; disabled while live; no in-app speed test - FocusPreservingListBox keeps selection/focus coherent when a selected scene/source is deleted (skip hidden scenes; leave list when empty) - Themes/Controls.xaml: single dark-theme dictionary merged once in App.xaml; custom ComboBox template fixes SelectionBoxItem rendering; GoLiveWindow and ReuseImageDialog consolidated onto shared styles - AppLog file logger + AppDomain/Dispatcher exception hooks; checkpointed MainWindow/VM/dialog constructors (caught MenuItemRole.Separator XAML crash) - Memory map: schema.md conventions, per-directory index.md, updated ai.md/ TASKS.md/README.md (OAuth creds real; token persistence still pending)
41 lines
1.1 KiB
C#
41 lines
1.1 KiB
C#
using System.IO;
|
|
|
|
namespace ytLive.Helpers;
|
|
|
|
/// <summary>
|
|
/// Minimal file logger used to diagnose startup/shutdown crashes on Windows,
|
|
/// where the WPF app has no visible console. Writes to
|
|
/// %APPDATA%\ytLlive\startup.log, appending synchronously so entries survive
|
|
/// a hard crash.
|
|
/// </summary>
|
|
public static class AppLog
|
|
{
|
|
private static readonly string LogPath = Path.Combine(
|
|
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
|
"ytLlive",
|
|
"startup.log");
|
|
|
|
private static readonly object Gate = new();
|
|
|
|
public static void Write(string message)
|
|
{
|
|
try
|
|
{
|
|
lock (Gate)
|
|
{
|
|
Directory.CreateDirectory(Path.GetDirectoryName(LogPath)!);
|
|
File.AppendAllText(LogPath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} {message}{Environment.NewLine}");
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// Never let logging itself crash the app.
|
|
}
|
|
}
|
|
|
|
public static void Write(Exception exception, string message)
|
|
{
|
|
Write($"{message}: {exception}");
|
|
}
|
|
}
|