From 9ca0fe592242b5e4775087620b779451fc8b485e Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 6 Jul 2024 19:08:03 +0900 Subject: [PATCH] Linux: Fixed scrolling with mouse wheel sometimes scrolling far more than intended --- UI/Debugger/Controls/CodeScrollBar.axaml.cs | 2 +- UI/Debugger/Controls/HexEditor.cs | 2 +- UI/Debugger/Controls/PictureViewer.cs | 5 ++-- .../Controls/ScrollPictureViewer.axaml.cs | 6 +++-- .../Utilities/CodeViewerSelectionHandler.cs | 2 +- .../ViewModels/DisassemblyViewModel.cs | 4 +++ .../Windows/PaletteViewerWindow.axaml.cs | 5 ++-- .../PointerWheelEventArgsExtensions.cs | 27 +++++++++++++++++++ 8 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 UI/Utilities/PointerWheelEventArgsExtensions.cs diff --git a/UI/Debugger/Controls/CodeScrollBar.axaml.cs b/UI/Debugger/Controls/CodeScrollBar.axaml.cs index 6ab79a257..a8b11d0c5 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 07f778288..f2eba3c07 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 d7776d699..ab0abaa40 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 ef6f6d1c3..40e25a876 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 a38f7a699..34ce0f14b 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 1d441c34b..6378a559a 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 55049aa3e..34a81209e 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 000000000..eacbad022 --- /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; + } +}