Revert "Fix Window Positioning with Multiple Montiors"

This commit is contained in:
DB P 2024-06-30 18:03:25 +09:00 committed by GitHub
parent 94288b3eba
commit c7b386931a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 68 additions and 194 deletions

View file

@ -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));
}
}

View file

@ -205,10 +205,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
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; }
/// <summary>
/// Custom left position on selected monitor

View file

@ -72,7 +72,11 @@ namespace Flow.Launcher
};
}
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
_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 @@ namespace Flow.Launcher
_settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount));
}
}
FlowMainWindow.SizeToContent = SizeToContent.Height;
_viewModel.MainWindowWidth = Width;
}
@ -177,7 +175,6 @@ namespace Flow.Launcher
private void OnInitialized(object sender, EventArgs e)
{
}
private void OnLoaded(object sender, RoutedEventArgs _)
{
// MouseEventHandler
@ -209,7 +206,6 @@ namespace Flow.Launcher
{
SoundPlay();
}
UpdatePosition();
PreviewReset();
Activate();
@ -221,8 +217,7 @@ namespace Flow.Launcher
_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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
{
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
{
_ = SetForegroundWindow(hwndSource.Handle);
}
contextMenu.Focus();
break;
}
@ -498,10 +454,8 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
return;
if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
{
_settings.WindowPosition = (Left, Top);
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
}
}
@ -715,7 +671,7 @@ namespace Flow.Launcher
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 @@ namespace Flow.Launcher
screen = Screen.AllScreens[0];
break;
}
return screen ?? Screen.AllScreens[0];
}
@ -772,13 +727,6 @@ namespace Flow.Launcher
return left;
}
public double VerticalTop(Screen screen)
{
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
var top = dip1.Y + 10;
return top;
}
/// <summary>
/// Register up and down key
/// todo: any way to put this in xaml ?
@ -814,7 +762,6 @@ namespace Flow.Launcher
_viewModel.LoadContextMenuCommand.Execute(null);
e.Handled = true;
}
break;
case Key.Left:
if (!_viewModel.SelectedIsFromQueryResults() && QueryTextBox.CaretIndex == 0)
@ -822,7 +769,6 @@ namespace Flow.Launcher
_viewModel.EscCommand.Execute(null);
e.Handled = true;
}
break;
case Key.Back:
if (specialKeyState.CtrlPressed)
@ -841,13 +787,12 @@ namespace Flow.Launcher
}
}
}
break;
default:
break;
}
}
private void OnKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Up || e.Key == Key.Down)
@ -863,7 +808,6 @@ namespace Flow.Launcher
e.Handled = true; // Ignore Mouse Hover when press Arrowkeys
}
}
public void PreviewReset()
{
_viewModel.ResetPreview();

View file

@ -112,45 +112,23 @@ public partial class SettingWindow
{
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 @@ public partial class SettingWindow
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;
}

View file

@ -547,20 +547,20 @@ namespace Flow.Launcher.ViewModel
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;
}