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