diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index d7b29aa46..824c75cef 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -195,8 +195,17 @@ namespace Flow.Launcher.Infrastructure.UserSettings public double WindowLeft { get; set; } public double WindowTop { get; set; } + + /// + /// Custom left position on selected monitor + /// public double CustomWindowLeft { get; set; } = 0; + + /// + /// Custom top position on selected monitor + /// public double CustomWindowTop { get; set; } = 0; + public int MaxResultsToShow { get; set; } = 5; public int ActivateTimes { get; set; } @@ -229,9 +238,15 @@ namespace Flow.Launcher.Infrastructure.UserSettings } public bool LeaveCmdOpen { get; set; } public bool HideWhenDeactivated { get; set; } = true; - + + [JsonConverter(typeof(JsonStringEnumConverter))] public SearchWindowScreens SearchWindowScreen { get; set; } = SearchWindowScreens.RememberLastLaunchLocation; + + [JsonConverter(typeof(JsonStringEnumConverter))] public SearchWindowAligns SearchWindowAlign { get; set; } = SearchWindowAligns.Center; + + public string CustomScreenDeviceName { get; set; } = string.Empty; + public bool IgnoreHotkeysOnFullscreen { get; set; } public HttpProxy Proxy { get; set; } = new HttpProxy(); @@ -257,19 +272,22 @@ namespace Flow.Launcher.Infrastructure.UserSettings Light, Dark } + public enum SearchWindowScreens { RememberLastLaunchLocation, - MouseScreen, - PrimaryScreen, - SecondaryScreen, - CustomPosition + Cursor, + Focus, + Primary, + Custom } + public enum SearchWindowAligns { Center, CenterTop, LeftTop, - RightTop + RightTop, + Custom } } diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index a2d0eedfe..d59247729 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -24,9 +24,8 @@ using System.Windows.Threading; using System.Windows.Data; using ModernWpf.Controls; using Key = System.Windows.Input.Key; -using System.Threading; using System.Media; - +using System.Linq; namespace Flow.Launcher { @@ -207,31 +206,31 @@ namespace Flow.Launcher Top = _settings.WindowTop; Left = _settings.WindowLeft; } - else if (_settings.SearchWindowScreen == SearchWindowScreens.CustomPosition) - { - Top = _settings.CustomWindowTop; - Left = _settings.CustomWindowLeft; - } else { + var screen = SelectedScreen(); switch (_settings.SearchWindowAlign) { case SearchWindowAligns.Center: - Left = HorizonCenter(); - Top = VerticalCenter(); + Left = HorizonCenter(screen); + Top = VerticalCenter(screen); break; case SearchWindowAligns.CenterTop: - Left = HorizonCenter(); + Left = HorizonCenter(screen); Top = 10; break; case SearchWindowAligns.LeftTop: - Left = HorizonLeft(); + Left = HorizonLeft(screen); Top = 10; break; case SearchWindowAligns.RightTop: - Left = HorizonRight(); + Left = HorizonRight(screen); Top = 10; break; + case SearchWindowAligns.Custom: + Left = screen.WorkingArea.Left + _settings.CustomWindowLeft; + Top = screen.WorkingArea.Top + _settings.CustomWindowTop; + break; } } @@ -351,8 +350,9 @@ namespace Flow.Launcher { _viewModel.Show(); await Task.Delay(300); // If don't give a time, Positioning will be weird. - Left = HorizonCenter(); - Top = VerticalCenter(); + var screen = SelectedScreen(); + Left = HorizonCenter(screen); + Top = VerticalCenter(screen); } private void InitProgressbarAnimation() @@ -536,59 +536,56 @@ namespace Flow.Launcher public Screen SelectedScreen() { - if (_settings.SearchWindowScreen == SearchWindowScreens.MouseScreen) + Screen screen = null; + switch(_settings.SearchWindowScreen) { - var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - return screen; - } - else if (_settings.SearchWindowScreen == SearchWindowScreens.PrimaryScreen) - { - var screen = Screen.PrimaryScreen; - return screen; - } - else if (_settings.SearchWindowScreen == SearchWindowScreens.SecondaryScreen) - { - var screen = Screen.AllScreens[1]; - return screen; - } - else - { - var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - return screen; + case SearchWindowScreens.Cursor: + screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); + break; + case SearchWindowScreens.Primary: + screen = Screen.PrimaryScreen; + break; + case SearchWindowScreens.Focus: + IntPtr foregroundWindowHandle = WindowsInteropHelper.GetForegroundWindow(); + screen = Screen.FromHandle(foregroundWindowHandle); + break; + case SearchWindowScreens.Custom: + screen = Screen.AllScreens.FirstOrDefault(s => s.DeviceName == _settings.CustomScreenDeviceName); + break; + default: + screen = Screen.AllScreens[0]; + break; } + return screen ?? Screen.AllScreens[0]; } - public double HorizonCenter() + + public double HorizonCenter(Screen screen) { - var screen = SelectedScreen(); 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; return left; } - public double VerticalCenter() + public double VerticalCenter(Screen screen) { - var screen = SelectedScreen(); var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); var top = (dip2.Y - QueryTextBox.ActualHeight) / 4 + dip1.Y; return top; } - public double HorizonRight() + public double HorizonRight(Screen screen) { - var screen = SelectedScreen(); var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); var left = (dip1.X + dip2.X - ActualWidth) - 10; return left; } - public double HorizonLeft() + public double HorizonLeft(Screen screen) { - var screen = SelectedScreen(); var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); - var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); var left = dip1.X + 10; return left; }