Skip to content

Commit 9e85d2e

Browse files
authored
Merge branch 'dev' into topmost
2 parents b636f25 + 54c949b commit 9e85d2e

File tree

10 files changed

+444
-61
lines changed

10 files changed

+444
-61
lines changed

Flow.Launcher.Infrastructure/Storage/JsonStorage.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ public JsonStorage(string filePath)
4545
FilesFolders.ValidateDirectory(DirectoryPath);
4646
}
4747

48+
public bool Exists()
49+
{
50+
return File.Exists(FilePath);
51+
}
52+
53+
public void Delete()
54+
{
55+
foreach (var path in new[] { FilePath, BackupFilePath, TempFilePath })
56+
{
57+
if (File.Exists(path))
58+
{
59+
File.Delete(path);
60+
}
61+
}
62+
}
63+
4864
public async Task<T> LoadAsync()
4965
{
5066
if (Data != null)

Flow.Launcher.Infrastructure/UserSettings/Settings.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ public SearchPrecisionScore QuerySearchPrecision
299299

300300
public double WindowLeft { get; set; }
301301
public double WindowTop { get; set; }
302+
public double PreviousScreenWidth { get; set; }
303+
public double PreviousScreenHeight { get; set; }
304+
public double PreviousDpiX { get; set; }
305+
public double PreviousDpiY { get; set; }
302306

303307
/// <summary>
304308
/// Custom left position on selected monitor

Flow.Launcher/MainWindow.xaml.cs

Lines changed: 86 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public MainWindow()
9191

9292
InitSoundEffects();
9393
DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste);
94-
94+
ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged;
9595
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
9696
}
9797

@@ -101,6 +101,11 @@ public MainWindow()
101101

102102
#pragma warning disable VSTHRD100 // Avoid async void methods
103103

104+
private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
105+
{
106+
_theme.RefreshFrameAsync();
107+
}
108+
104109
private void OnSourceInitialized(object sender, EventArgs e)
105110
{
106111
var handle = Win32Helper.GetWindowHandle(this, true);
@@ -716,8 +721,26 @@ void InitializePositionInner()
716721
{
717722
if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
718723
{
719-
Top = _settings.WindowTop;
724+
var previousScreenWidth = _settings.PreviousScreenWidth;
725+
var previousScreenHeight = _settings.PreviousScreenHeight;
726+
GetDpi(out var previousDpiX, out var previousDpiY);
727+
728+
_settings.PreviousScreenWidth = SystemParameters.VirtualScreenWidth;
729+
_settings.PreviousScreenHeight = SystemParameters.VirtualScreenHeight;
730+
GetDpi(out var currentDpiX, out var currentDpiY);
731+
732+
if (previousScreenWidth != 0 && previousScreenHeight != 0 &&
733+
previousDpiX != 0 && previousDpiY != 0 &&
734+
(previousScreenWidth != SystemParameters.VirtualScreenWidth ||
735+
previousScreenHeight != SystemParameters.VirtualScreenHeight ||
736+
previousDpiX != currentDpiX || previousDpiY != currentDpiY))
737+
{
738+
AdjustPositionForResolutionChange();
739+
return;
740+
}
741+
720742
Left = _settings.WindowLeft;
743+
Top = _settings.WindowTop;
721744
}
722745
else
723746
{
@@ -730,27 +753,73 @@ void InitializePositionInner()
730753
break;
731754
case SearchWindowAligns.CenterTop:
732755
Left = HorizonCenter(screen);
733-
Top = 10;
756+
Top = VerticalTop(screen);
734757
break;
735758
case SearchWindowAligns.LeftTop:
736759
Left = HorizonLeft(screen);
737-
Top = 10;
760+
Top = VerticalTop(screen);
738761
break;
739762
case SearchWindowAligns.RightTop:
740763
Left = HorizonRight(screen);
741-
Top = 10;
764+
Top = VerticalTop(screen);
742765
break;
743766
case SearchWindowAligns.Custom:
744-
Left = Win32Helper.TransformPixelsToDIP(this,
745-
screen.WorkingArea.X + _settings.CustomWindowLeft, 0).X;
746-
Top = Win32Helper.TransformPixelsToDIP(this, 0,
747-
screen.WorkingArea.Y + _settings.CustomWindowTop).Y;
767+
var customLeft = Win32Helper.TransformPixelsToDIP(this,
768+
screen.WorkingArea.X + _settings.CustomWindowLeft, 0);
769+
var customTop = Win32Helper.TransformPixelsToDIP(this, 0,
770+
screen.WorkingArea.Y + _settings.CustomWindowTop);
771+
Left = customLeft.X;
772+
Top = customTop.Y;
748773
break;
749774
}
750775
}
751776
}
752777
}
753778

779+
private void AdjustPositionForResolutionChange()
780+
{
781+
var screenWidth = SystemParameters.VirtualScreenWidth;
782+
var screenHeight = SystemParameters.VirtualScreenHeight;
783+
GetDpi(out var currentDpiX, out var currentDpiY);
784+
785+
var previousLeft = _settings.WindowLeft;
786+
var previousTop = _settings.WindowTop;
787+
GetDpi(out var previousDpiX, out var previousDpiY);
788+
789+
var widthRatio = screenWidth / _settings.PreviousScreenWidth;
790+
var heightRatio = screenHeight / _settings.PreviousScreenHeight;
791+
var dpiXRatio = currentDpiX / previousDpiX;
792+
var dpiYRatio = currentDpiY / previousDpiY;
793+
794+
var newLeft = previousLeft * widthRatio * dpiXRatio;
795+
var newTop = previousTop * heightRatio * dpiYRatio;
796+
797+
var screenLeft = SystemParameters.VirtualScreenLeft;
798+
var screenTop = SystemParameters.VirtualScreenTop;
799+
800+
var maxX = screenLeft + screenWidth - ActualWidth;
801+
var maxY = screenTop + screenHeight - ActualHeight;
802+
803+
Left = Math.Max(screenLeft, Math.Min(newLeft, maxX));
804+
Top = Math.Max(screenTop, Math.Min(newTop, maxY));
805+
}
806+
807+
private void GetDpi(out double dpiX, out double dpiY)
808+
{
809+
var source = PresentationSource.FromVisual(this);
810+
if (source != null && source.CompositionTarget != null)
811+
{
812+
var matrix = source.CompositionTarget.TransformToDevice;
813+
dpiX = 96 * matrix.M11;
814+
dpiY = 96 * matrix.M22;
815+
}
816+
else
817+
{
818+
dpiX = 96;
819+
dpiY = 96;
820+
}
821+
}
822+
754823
private Screen SelectedScreen()
755824
{
756825
Screen screen;
@@ -811,6 +880,13 @@ private double HorizonLeft(Screen screen)
811880
return left;
812881
}
813882

883+
public double VerticalTop(Screen screen)
884+
{
885+
var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
886+
var top = dip1.Y + 10;
887+
return top;
888+
}
889+
814890
#endregion
815891

816892
#region Window Animation
@@ -1185,6 +1261,7 @@ protected virtual void Dispose(bool disposing)
11851261
_notifyIcon?.Dispose();
11861262
animationSoundWMP?.Close();
11871263
animationSoundWPF?.Dispose();
1264+
ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
11881265
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
11891266
}
11901267

Flow.Launcher/SettingWindow.xaml.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,40 @@ public void UpdatePositionAndState()
137137

138138
if (previousTop == null || previousLeft == null || !IsPositionValid(previousTop.Value, previousLeft.Value))
139139
{
140-
Top = WindowTop();
141-
Left = WindowLeft();
140+
SetWindowPosition(WindowTop(), WindowLeft());
142141
}
143142
else
144143
{
145-
Top = previousTop.Value;
146-
Left = previousLeft.Value;
144+
var left = _settings.SettingWindowLeft.Value;
145+
var top = _settings.SettingWindowTop.Value;
146+
AdjustWindowPosition(ref top, ref left);
147+
SetWindowPosition(top, left);
147148
}
148149

149150
WindowState = _settings.SettingWindowState;
150151
}
151152

153+
private void SetWindowPosition(double top, double left)
154+
{
155+
// Ensure window does not exceed screen boundaries
156+
top = Math.Max(top, SystemParameters.VirtualScreenTop);
157+
left = Math.Max(left, SystemParameters.VirtualScreenLeft);
158+
top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight);
159+
left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth);
160+
161+
Top = top;
162+
Left = left;
163+
}
164+
165+
private void AdjustWindowPosition(ref double top, ref double left)
166+
{
167+
// Adjust window position if it exceeds screen boundaries
168+
top = Math.Max(top, SystemParameters.VirtualScreenTop);
169+
left = Math.Max(left, SystemParameters.VirtualScreenLeft);
170+
top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight);
171+
left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth);
172+
}
173+
152174
private static bool IsPositionValid(double top, double left)
153175
{
154176
foreach (var screen in Screen.AllScreens)

0 commit comments

Comments
 (0)