diff --git a/UI/Debugger/Controls/CodeScrollBar.axaml.cs b/UI/Debugger/Controls/CodeScrollBar.axaml.cs index 6ab79a25..a8b11d0c 100644 --- a/UI/Debugger/Controls/CodeScrollBar.axaml.cs +++ b/UI/Debugger/Controls/CodeScrollBar.axaml.cs @@ -120,7 +120,7 @@ private void UpdatePosition() protected override void OnPointerWheelChanged(PointerWheelEventArgs e) { base.OnPointerWheelChanged(e); - Value = Math.Max(0, Math.Min(Maximum, Value - (int)(e.Delta.Y * 3))); + Value = Math.Max(0, Math.Min(Maximum, Value - (int)(e.GetDeltaY() * 3))); } private void IncrementClick(object? sender, RoutedEventArgs e) diff --git a/UI/Debugger/Controls/HexEditor.cs b/UI/Debugger/Controls/HexEditor.cs index 07f77828..f2eba3c0 100644 --- a/UI/Debugger/Controls/HexEditor.cs +++ b/UI/Debugger/Controls/HexEditor.cs @@ -551,7 +551,7 @@ private void ScrollIntoView(int byteIndex, bool scrollToTop = false) protected override void OnPointerWheelChanged(PointerWheelEventArgs e) { base.OnPointerWheelChanged(e); - this.TopRow = Math.Min((DataProvider.Length / BytesPerRow) - 1, Math.Max(0, this.TopRow - (int)(e.Delta.Y * 3))); + this.TopRow = Math.Min((DataProvider.Length / BytesPerRow) - 1, Math.Max(0, this.TopRow - (int)(e.GetDeltaY() * 3))); } protected override void OnPointerPressed(PointerPressedEventArgs e) diff --git a/UI/Debugger/Controls/PictureViewer.cs b/UI/Debugger/Controls/PictureViewer.cs index d7776d69..ab0abaa4 100644 --- a/UI/Debugger/Controls/PictureViewer.cs +++ b/UI/Debugger/Controls/PictureViewer.cs @@ -233,9 +233,10 @@ protected override void OnPointerWheelChanged(PointerWheelEventArgs e) { base.OnPointerWheelChanged(e); if(e.KeyModifiers == KeyModifiers.Control) { - if(e.Delta.Y > 0) { + double delta = e.GetDeltaY(); + if(delta > 0) { ZoomIn(); - } else { + } else if(delta < 0) { ZoomOut(); } e.Handled = true; diff --git a/UI/Debugger/Controls/ScrollPictureViewer.axaml.cs b/UI/Debugger/Controls/ScrollPictureViewer.axaml.cs index ef6f6d1c..40e25a87 100644 --- a/UI/Debugger/Controls/ScrollPictureViewer.axaml.cs +++ b/UI/Debugger/Controls/ScrollPictureViewer.axaml.cs @@ -9,6 +9,7 @@ using Avalonia.Media; using Avalonia.Metadata; using Avalonia.Threading; +using Mesen.Utilities; using System; using System.Collections.Generic; @@ -211,9 +212,10 @@ protected override void OnPointerWheelChanged(PointerWheelEventArgs e) { base.OnPointerWheelChanged(e); if(e.KeyModifiers == KeyModifiers.Control) { - if(e.Delta.Y > 0) { + double delta = e.GetDeltaY(); + if(delta > 0) { InnerViewer.ZoomIn(); - } else { + } else if(delta < 0) { InnerViewer.ZoomOut(); } e.Handled = true; diff --git a/UI/Debugger/Utilities/CodeViewerSelectionHandler.cs b/UI/Debugger/Utilities/CodeViewerSelectionHandler.cs index a38f7a69..34ce0f14 100644 --- a/UI/Debugger/Utilities/CodeViewerSelectionHandler.cs +++ b/UI/Debugger/Utilities/CodeViewerSelectionHandler.cs @@ -114,7 +114,7 @@ public void Viewer_CodePointerMoved(DisassemblyViewer sender, CodePointerMovedEv public void Viewer_PointerWheelChanged(object? sender, PointerWheelEventArgs e) { - _model.Scroll((int)(-e.Delta.Y * 3)); + _model.Scroll((int)(-e.GetDeltaY() * 3)); } private void Viewer_KeyDown(object? sender, KeyEventArgs e) diff --git a/UI/Debugger/ViewModels/DisassemblyViewModel.cs b/UI/Debugger/ViewModels/DisassemblyViewModel.cs index 1d441c34..6378a559 100644 --- a/UI/Debugger/ViewModels/DisassemblyViewModel.cs +++ b/UI/Debugger/ViewModels/DisassemblyViewModel.cs @@ -120,6 +120,10 @@ public void SetViewer(DisassemblyViewer? viewer) public void Scroll(int lineNumberOffset) { + if(lineNumberOffset == 0) { + return; + } + SetTopAddress(DataProvider.GetRowAddress(TopAddress, lineNumberOffset)); } diff --git a/UI/Debugger/Windows/PaletteViewerWindow.axaml.cs b/UI/Debugger/Windows/PaletteViewerWindow.axaml.cs index 55049aa3..34a81209 100644 --- a/UI/Debugger/Windows/PaletteViewerWindow.axaml.cs +++ b/UI/Debugger/Windows/PaletteViewerWindow.axaml.cs @@ -47,9 +47,10 @@ public PaletteViewerWindow(CpuType cpuType) private void Window_PointerWheelChanged(object? sender, PointerWheelEventArgs e) { if(e.KeyModifiers == KeyModifiers.Control) { - if(e.Delta.Y > 0) { + double delta = e.GetDeltaY(); + if(delta > 0) { _model.ZoomIn(); - } else { + } else if(delta < 0) { _model.ZoomOut(); } e.Handled = true; diff --git a/UI/Utilities/PointerWheelEventArgsExtensions.cs b/UI/Utilities/PointerWheelEventArgsExtensions.cs new file mode 100644 index 00000000..eacbad02 --- /dev/null +++ b/UI/Utilities/PointerWheelEventArgsExtensions.cs @@ -0,0 +1,27 @@ +using Avalonia.Input; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Mesen.Utilities; + +static class PointerWheelEventArgsExtensions +{ + public static double GetDeltaY(this PointerWheelEventArgs e) + { + if(OperatingSystem.IsWindows() || OperatingSystem.IsMacOS()) { + return e.Delta.Y; + } + + if(Math.Abs(e.Delta.Y) > 8) { + //Avalonia currently seems to have an issue with mouse wheel events on Linux + //Alt-tabbing to another application, scrolling, alt-tabbing back, and then + //trying to scroll will return a large delta value that includes the amount + //of scrolling done in the other application. In this case, return 0. + return 0; + } + return e.Delta.Y; + } +}