diff --git a/Wino.Mail.WinUI/Services/NavigationService.cs b/Wino.Mail.WinUI/Services/NavigationService.cs index 096ce076..5d22203e 100644 --- a/Wino.Mail.WinUI/Services/NavigationService.cs +++ b/Wino.Mail.WinUI/Services/NavigationService.cs @@ -221,24 +221,29 @@ public class NavigationService : NavigationServiceBase, INavigationService return; } - if (_statePersistanceService.ApplicationMode == WinoApplicationMode.Calendar) - { - var innerShellFrame = GetCoreFrame(NavigationReferenceFrame.InnerShellFrame); - if (innerShellFrame?.CanGoBack == true) - { - innerShellFrame.GoBack(); + var innerShellFrame = GetCoreFrame(NavigationReferenceFrame.InnerShellFrame); - // Calendar mode: Navigate back from EventDetailsPage - _statePersistanceService.IsEventDetailsVisible = false; - } + if (_statePersistanceService.ApplicationMode == WinoApplicationMode.Calendar && innerShellFrame?.CanGoBack == true) + { + innerShellFrame.GoBack(); + + // Calendar mode: Navigate back from EventDetailsPage + _statePersistanceService.IsEventDetailsVisible = false; } else { - // Mail mode: Clear selections and dispose rendering frame - _statePersistanceService.IsReadingMail = false; + if (_statePersistanceService.IsReadingMail && _statePersistanceService.IsReaderNarrowed) + { + // Mail mode: Clear selections and dispose rendering frame + _statePersistanceService.IsReadingMail = false; - WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); - WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); + WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); + WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); + } + else if (innerShellFrame != null && innerShellFrame.CanGoBack) + { + innerShellFrame.GoBack(); + } } } diff --git a/Wino.Mail.WinUI/ShellWindow.xaml.cs b/Wino.Mail.WinUI/ShellWindow.xaml.cs index fefe8f7e..2d47b747 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml.cs +++ b/Wino.Mail.WinUI/ShellWindow.xaml.cs @@ -41,6 +41,9 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient // Use the AppWindow.Closing event to handle the close request AppWindow.Closing += OnAppWindowClosing; + // Register global mouse button listener for back button + RegisterMouseBackButtonListener(); + ShowWinoCommand = new RelayCommand(RestoreFromTray); ExitWinoCommand = new RelayCommand(ForceClose); @@ -66,6 +69,30 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient } } + private void RegisterMouseBackButtonListener() + { + // Subscribe to pointer pressed events on the root content + if (Content is UIElement rootElement) + { + rootElement.AddHandler(UIElement.PointerPressedEvent, new Microsoft.UI.Xaml.Input.PointerEventHandler(OnPointerPressed), true); + } + } + + private void OnPointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + // Check if it's the back button (XButton1) + var pointerPoint = e.GetCurrentPoint(null); + var properties = pointerPoint.Properties; + + // XButton1 is the back button on most mice + if (properties.IsXButton1Pressed) + { + // Call GoBack on NavigationService + NavigationService.GoBack(); + e.Handled = true; + } + } + public void HandleAppActivation(LaunchActivatedEventArgs args) { // Parse launch arguments to determine the application mode