mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Refactor multi monitor support
This commit is contained in:
parent
975ea3c1b8
commit
a337c8a326
2 changed files with 62 additions and 47 deletions
|
|
@ -195,8 +195,17 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
|||
|
||||
public double WindowLeft { get; set; }
|
||||
public double WindowTop { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Custom left position on selected monitor
|
||||
/// </summary>
|
||||
public double CustomWindowLeft { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Custom top position on selected monitor
|
||||
/// </summary>
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue