From 53fd6f5b967d60bd019f67a0bdbf3e5ac7635720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 13 Apr 2026 15:05:36 -0400 Subject: [PATCH 1/2] Avalonia: use native window decorations under WSL --- src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs index 7a0e8eb9c7..fb159fdcfb 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs @@ -4,6 +4,7 @@ using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; +using System; using UniGetUI.Avalonia.ViewModels; using UniGetUI.Avalonia.Views.Pages; using UniGetUI.Core.Logging; @@ -100,14 +101,15 @@ private void SetupTitleBar() } else if (OperatingSystem.IsLinux()) { - // Linux: remove the native title bar entirely; our toolbar is the - // only chrome. Custom min/max/close buttons appear on the right. - WindowDecorations = WindowDecorations.None; + // WSLg can report incorrect maximize/input bounds with frameless windows. + // Keep native decorations there and use the in-app toolbar only. + bool isWsl = IsRunningUnderWsl(); + WindowDecorations = isWsl ? WindowDecorations.Full : WindowDecorations.None; TitleBarGrid.ClearValue(HeightProperty); TitleBarGrid.Height = 44; HamburgerPanel.Margin = new Thickness(10, 0, 8, 0); AvatarControl.Height = 32; - LinuxWindowButtons.IsVisible = true; + LinuxWindowButtons.IsVisible = !isWsl; MainContentGrid.Margin = new Thickness(0, 44, 0, 0); // Keep maximize icon in sync with window state this.GetObservable(WindowStateProperty).Subscribe(state => @@ -123,6 +125,13 @@ private void SetupTitleBar() } } + private static bool IsRunningUnderWsl() + { + string? wslDistro = Environment.GetEnvironmentVariable("WSL_DISTRO_NAME"); + string? wslInterop = Environment.GetEnvironmentVariable("WSL_INTEROP"); + return !string.IsNullOrWhiteSpace(wslDistro) || !string.IsNullOrWhiteSpace(wslInterop); + } + private void MinimizeButton_Click(object? sender, RoutedEventArgs e) => WindowState = WindowState.Minimized; From 7a2458a9f25c574679870f63cdc4c16a01a5c70b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 13 Apr 2026 15:34:42 -0400 Subject: [PATCH 2/2] Fix Avalonia import ordering for CI style check --- src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs index fb159fdcfb..8c7274f69c 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs @@ -1,10 +1,10 @@ +using System; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; -using System; using UniGetUI.Avalonia.ViewModels; using UniGetUI.Avalonia.Views.Pages; using UniGetUI.Core.Logging;