From c7b386931a63479c73db5445f23edc893477ea22 Mon Sep 17 00:00:00 2001 From: DB P Date: Sun, 30 Jun 2024 18:03:25 +0900 Subject: [PATCH] Revert "Fix Window Positioning with Multiple Montiors" --- .../UserSettings/Point2D.cs | 46 ----- .../UserSettings/Settings.cs | 6 +- Flow.Launcher/MainWindow.xaml.cs | 170 ++++++------------ Flow.Launcher/SettingWindow.xaml.cs | 34 +--- Flow.Launcher/ViewModel/MainViewModel.cs | 6 +- 5 files changed, 68 insertions(+), 194 deletions(-) delete mode 100644 Flow.Launcher.Infrastructure/UserSettings/Point2D.cs diff --git a/Flow.Launcher.Infrastructure/UserSettings/Point2D.cs b/Flow.Launcher.Infrastructure/UserSettings/Point2D.cs deleted file mode 100644 index 4c47ba6c05a..00000000000 --- a/Flow.Launcher.Infrastructure/UserSettings/Point2D.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace Flow.Launcher.Infrastructure.UserSettings; - -public record struct Point2D(double X, double Y) -{ - public static implicit operator Point2D((double X, double Y) point) - { - return new Point2D(point.X, point.Y); - } - - public static Point2D operator +(Point2D point1, Point2D point2) - { - return new Point2D(point1.X + point2.X, point1.Y + point2.Y); - } - - public static Point2D operator -(Point2D point1, Point2D point2) - { - return new Point2D(point1.X - point2.X, point1.Y - point2.Y); - } - - public static Point2D operator *(Point2D point, double scalar) - { - return new Point2D(point.X * scalar, point.Y * scalar); - } - - public static Point2D operator /(Point2D point, double scalar) - { - return new Point2D(point.X / scalar, point.Y / scalar); - } - - public static Point2D operator /(Point2D point1, Point2D point2) - { - return new Point2D(point1.X / point2.X, point1.Y / point2.Y); - } - - public static Point2D operator *(Point2D point1, Point2D point2) - { - return new Point2D(point1.X * point2.X, point1.Y * point2.Y); - } - - public Point2D Clamp(Point2D min, Point2D max) - { - return new Point2D(Math.Clamp(X, min.X, max.X), Math.Clamp(Y, min.Y, max.Y)); - } -} diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 125447d8398..0c7de10fd78 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -205,10 +205,8 @@ public SearchPrecisionScore QuerySearchPrecision public bool AutoUpdates { get; set; } = false; - - public Point2D WindowPosition { get; set; } - public Point2D PreviousScreen { get; set; } - public Point2D PreviousDpi { get; set; } + public double WindowLeft { get; set; } + public double WindowTop { get; set; } /// /// Custom left position on selected monitor diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 4027e7698e6..60048d07076 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -72,7 +72,11 @@ public MainWindow(Settings settings, MainViewModel mainVM) }; } - DispatcherTimer timer = new DispatcherTimer { Interval = new TimeSpan(0, 0, 0, 0, 500), IsEnabled = false }; + DispatcherTimer timer = new DispatcherTimer + { + Interval = new TimeSpan(0, 0, 0, 0, 500), + IsEnabled = false + }; public MainWindow() { @@ -83,7 +87,6 @@ public MainWindow() private const int WM_EXITSIZEMOVE = 0x0232; private int _initialWidth; private int _initialHeight; - private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == WM_ENTERSIZEMOVE) @@ -92,22 +95,18 @@ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref b _initialHeight = (int)Height; handled = true; } - if (msg == WM_EXITSIZEMOVE) { - if (_initialHeight != (int)Height) + if ( _initialHeight != (int)Height) { OnResizeEnd(); } - if (_initialWidth != (int)Width) { FlowMainWindow.SizeToContent = SizeToContent.Height; } - handled = true; } - return IntPtr.Zero; } @@ -132,7 +131,6 @@ private void OnResizeEnd() _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount)); } } - FlowMainWindow.SizeToContent = SizeToContent.Height; _viewModel.MainWindowWidth = Width; } @@ -177,7 +175,6 @@ private async void OnClosing(object sender, CancelEventArgs e) private void OnInitialized(object sender, EventArgs e) { } - private void OnLoaded(object sender, RoutedEventArgs _) { // MouseEventHandler @@ -209,7 +206,6 @@ private void OnLoaded(object sender, RoutedEventArgs _) { SoundPlay(); } - UpdatePosition(); PreviewReset(); Activate(); @@ -221,8 +217,7 @@ private void OnLoaded(object sender, RoutedEventArgs _) _viewModel.LastQuerySelected = true; } - if (_viewModel.ProgressBarVisibility == Visibility.Visible && - isProgressBarStoryboardPaused) + if (_viewModel.ProgressBarVisibility == Visibility.Visible && isProgressBarStoryboardPaused) { _progressBarStoryboard.Begin(ProgressBar, true); isProgressBarStoryboardPaused = false; @@ -263,12 +258,9 @@ private void OnLoaded(object sender, RoutedEventArgs _) MoveQueryTextToEnd(); _viewModel.QueryTextCursorMovedToEnd = false; } - break; case nameof(MainViewModel.GameModeStatus): - _notifyIcon.Icon = _viewModel.GameModeStatus - ? Properties.Resources.gamemode - : Properties.Resources.app; + _notifyIcon.Icon = _viewModel.GameModeStatus ? Properties.Resources.gamemode : Properties.Resources.app; break; } }; @@ -286,8 +278,11 @@ private void OnLoaded(object sender, RoutedEventArgs _) case nameof(Settings.Hotkey): UpdateNotifyIconText(); break; - case nameof(Settings.WindowPosition): - (Left, Top) = _settings.WindowPosition; + case nameof(Settings.WindowLeft): + Left = _settings.WindowLeft; + break; + case nameof(Settings.WindowTop): + Top = _settings.WindowTop; break; } }; @@ -297,24 +292,8 @@ private void InitializePosition() { if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation) { - var previousScreen = _settings.PreviousScreen; - - var previousDpi = _settings.PreviousDpi; - - _settings.PreviousScreen = (SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight); - - var currentDpi = GetDpi(); - - if (previousScreen == default || - previousDpi == default || - (previousScreen != (SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight) || - previousDpi != currentDpi)) - { - AdjustPositionForResolutionChange(); - return; - } - - (Left, Top) = _settings.WindowPosition; + Top = _settings.WindowTop; + Left = _settings.WindowLeft; } else { @@ -327,72 +306,34 @@ private void InitializePosition() break; case SearchWindowAligns.CenterTop: Left = HorizonCenter(screen); - Top = VerticalTop(screen); + Top = 10; break; case SearchWindowAligns.LeftTop: Left = HorizonLeft(screen); - Top = VerticalTop(screen); + Top = 10; break; case SearchWindowAligns.RightTop: Left = HorizonRight(screen); - Top = VerticalTop(screen); + Top = 10; break; case SearchWindowAligns.Custom: - var customLeft = WindowsInteropHelper.TransformPixelsToDIP(this, - screen.WorkingArea.X + _settings.CustomWindowLeft, 0); - var customTop = WindowsInteropHelper.TransformPixelsToDIP(this, 0, - screen.WorkingArea.Y + _settings.CustomWindowTop); - Left = customLeft.X; - Top = customTop.Y; + Left = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X + _settings.CustomWindowLeft, 0).X; + Top = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y + _settings.CustomWindowTop).Y; break; } } - } - - private void AdjustPositionForResolutionChange() - { - Point2D screenBound = (SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight); - - var currentDpi = GetDpi(); - - var previousPosition = _settings.WindowPosition; - var ratio = screenBound / _settings.PreviousScreen; - - var dpiRatio = currentDpi / _settings.PreviousDpi; - - var newPosition = previousPosition * ratio * dpiRatio; - - Point2D minPosition = (SystemParameters.VirtualScreenLeft, SystemParameters.VirtualScreenTop); - - var maxPosition = minPosition + screenBound - (ActualWidth, ActualHeight); - - (Left, Top) = newPosition.Clamp(minPosition, maxPosition); - } - - private Point2D GetDpi() - { - PresentationSource source = PresentationSource.FromVisual(this); - Point2D point = (96, 96); - if (source is { CompositionTarget: not null }) - { - Matrix m = source.CompositionTarget.TransformToDevice; - point.X = 96 * m.M11; - point.Y = 96 * m.M22; - } - - return point; } private void UpdateNotifyIconText() { var menu = contextMenu; - ((MenuItem)menu.Items[0]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + - " (" + _settings.Hotkey + ")"; + ((MenuItem)menu.Items[0]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")"; ((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("GameMode"); ((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("PositionReset"); ((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings"); ((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"); + } private void InitializeNotifyIcon() @@ -404,34 +345,50 @@ private void InitializeNotifyIcon() Visible = !_settings.HideNotifyIcon }; - var openIcon = new FontIcon { Glyph = "\ue71e" }; + var openIcon = new FontIcon + { + Glyph = "\ue71e" + }; var open = new MenuItem { - Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + - _settings.Hotkey + ")", + Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")", Icon = openIcon }; - var gamemodeIcon = new FontIcon { Glyph = "\ue7fc" }; + var gamemodeIcon = new FontIcon + { + Glyph = "\ue7fc" + }; var gamemode = new MenuItem { - Header = InternationalizationManager.Instance.GetTranslation("GameMode"), Icon = gamemodeIcon + Header = InternationalizationManager.Instance.GetTranslation("GameMode"), + Icon = gamemodeIcon + }; + var positionresetIcon = new FontIcon + { + Glyph = "\ue73f" }; - var positionresetIcon = new FontIcon { Glyph = "\ue73f" }; var positionreset = new MenuItem { Header = InternationalizationManager.Instance.GetTranslation("PositionReset"), Icon = positionresetIcon }; - var settingsIcon = new FontIcon { Glyph = "\ue713" }; + var settingsIcon = new FontIcon + { + Glyph = "\ue713" + }; var settings = new MenuItem { Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings"), Icon = settingsIcon }; - var exitIcon = new FontIcon { Glyph = "\ue7e8" }; + var exitIcon = new FontIcon + { + Glyph = "\ue7e8" + }; var exit = new MenuItem { - Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"), Icon = exitIcon + Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"), + Icon = exitIcon }; open.Click += (o, e) => _viewModel.ToggleFlowLauncher(); @@ -464,7 +421,6 @@ private void InitializeNotifyIcon() { _ = SetForegroundWindow(hwndSource.Handle); } - contextMenu.Focus(); break; } @@ -498,10 +454,8 @@ private async void PositionReset() private void InitProgressbarAnimation() { - var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 100, - new Duration(new TimeSpan(0, 0, 0, 0, 1600))); - var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 0, - new Duration(new TimeSpan(0, 0, 0, 0, 1600))); + var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600))); + var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 0, new Duration(new TimeSpan(0, 0, 0, 0, 1600))); Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)")); Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)")); _progressBarStoryboard.Children.Add(da); @@ -603,14 +557,14 @@ public void WindowAnimator() iconsb.Children.Add(IconOpacity); windowsb.Completed += (_, _) => _animating = false; - _settings.WindowPosition = (Left, Top); + _settings.WindowLeft = Left; + _settings.WindowTop = Top; isArrowKeyPressed = false; if (QueryTextBox.Text.Length == 0) { clocksb.Begin(ClockPanel); } - iconsb.Begin(SearchIcon); windowsb.Begin(FlowMainWindow); } @@ -664,7 +618,8 @@ private async void OnContextMenusForSettingsClick(object sender, RoutedEventArgs private async void OnDeactivated(object sender, EventArgs e) { - _settings.WindowPosition = (Left, Top); + _settings.WindowLeft = Left; + _settings.WindowTop = Top; //This condition stops extra hide call when animator is on, // which causes the toggling to occasional hide instead of show. if (_viewModel.MainWindowVisibilityStatus) @@ -695,7 +650,8 @@ private void OnLocationChanged(object sender, EventArgs e) return; if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation) { - _settings.WindowPosition = (Left, Top); + _settings.WindowLeft = Left; + _settings.WindowTop = Top; } } @@ -715,7 +671,7 @@ public void HideStartup() public Screen SelectedScreen() { Screen screen = null; - switch (_settings.SearchWindowScreen) + switch(_settings.SearchWindowScreen) { case SearchWindowScreens.Cursor: screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); @@ -737,7 +693,6 @@ public Screen SelectedScreen() screen = Screen.AllScreens[0]; break; } - return screen ?? Screen.AllScreens[0]; } @@ -772,13 +727,6 @@ public double HorizonLeft(Screen screen) return left; } - public double VerticalTop(Screen screen) - { - var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); - var top = dip1.Y + 10; - return top; - } - /// /// Register up and down key /// todo: any way to put this in xaml ? @@ -814,7 +762,6 @@ private void OnKeyDown(object sender, KeyEventArgs e) _viewModel.LoadContextMenuCommand.Execute(null); e.Handled = true; } - break; case Key.Left: if (!_viewModel.SelectedIsFromQueryResults() && QueryTextBox.CaretIndex == 0) @@ -822,7 +769,6 @@ private void OnKeyDown(object sender, KeyEventArgs e) _viewModel.EscCommand.Execute(null); e.Handled = true; } - break; case Key.Back: if (specialKeyState.CtrlPressed) @@ -841,13 +787,12 @@ private void OnKeyDown(object sender, KeyEventArgs e) } } } - break; default: break; + } } - private void OnKeyUp(object sender, KeyEventArgs e) { if (e.Key == Key.Up || e.Key == Key.Down) @@ -863,7 +808,6 @@ private void MainPreviewMouseMove(object sender, System.Windows.Input.MouseEvent e.Handled = true; // Ignore Mouse Hover when press Arrowkeys } } - public void PreviewReset() { _viewModel.ResetPreview(); diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 99c36322260..de4fd1f9129 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -112,45 +112,23 @@ public void InitializePosition() { if (_settings.SettingWindowTop == null || _settings.SettingWindowLeft == null) { - SetWindowPosition(WindowTop(), WindowLeft()); + Top = WindowTop(); + Left = WindowLeft(); } else { - double left = _settings.SettingWindowLeft.Value; - double top = _settings.SettingWindowTop.Value; - AdjustWindowPosition(ref top, ref left); - SetWindowPosition(top, left); + Top = _settings.SettingWindowTop.Value; + Left = _settings.SettingWindowLeft.Value; } WindowState = _settings.SettingWindowState; } - private void SetWindowPosition(double top, double left) - { - // Ensure window does not exceed screen boundaries - top = Math.Max(top, SystemParameters.VirtualScreenTop); - left = Math.Max(left, SystemParameters.VirtualScreenLeft); - top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight); - left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth); - - Top = top; - Left = left; - } - - private void AdjustWindowPosition(ref double top, ref double left) - { - // Adjust window position if it exceeds screen boundaries - top = Math.Max(top, SystemParameters.VirtualScreenTop); - left = Math.Max(left, SystemParameters.VirtualScreenLeft); - top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight); - left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth); - } - private double WindowLeft() { var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); - var left = (dip2.X - ActualWidth) / 2 + dip1.X; + var left = (dip2.X - this.ActualWidth) / 2 + dip1.X; return left; } @@ -159,7 +137,7 @@ private double WindowTop() var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); - var top = (dip2.Y - ActualHeight) / 2 + dip1.Y; + var top = (dip2.Y - this.ActualHeight) / 2 + dip1.Y - 20; return top; } diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 5756e46aea0..6c17e21f0d2 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -547,20 +547,20 @@ public string QueryText private void IncreaseWidth() { Settings.WindowSize += 100; - Settings.WindowPosition -= (50, 0); + Settings.WindowLeft -= 50; OnPropertyChanged(nameof(MainWindowWidth)); } [RelayCommand] private void DecreaseWidth() { - if (MainWindowWidth - 100 < 400 || Math.Abs(Settings.WindowSize - 400) < 0.01) + if (MainWindowWidth - 100 < 400 || Settings.WindowSize == 400) { Settings.WindowSize = 400; } else { - Settings.WindowPosition += (50, 0); + Settings.WindowLeft += 50; Settings.WindowSize -= 100; }