diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs index 7a0e8eb9c..8c7274f69 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs @@ -1,3 +1,4 @@ +using System; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; @@ -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;