2222using Flow . Launcher . Infrastructure . UserSettings ;
2323using Flow . Launcher . Plugin . SharedCommands ;
2424using Flow . Launcher . ViewModel ;
25+ using Microsoft . Win32 ;
2526using ModernWpf . Controls ;
2627using DataObject = System . Windows . DataObject ;
2728using Key = System . Windows . Input . Key ;
@@ -88,6 +89,8 @@ public MainWindow()
8889
8990 InitSoundEffects ( ) ;
9091 DataObject . AddPastingHandler ( QueryTextBox , QueryTextBox_OnPaste ) ;
92+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged ;
93+ SystemEvents . PowerModeChanged += SystemEvents_PowerModeChanged ;
9194 }
9295
9396 #endregion
@@ -96,6 +99,11 @@ public MainWindow()
9699
97100#pragma warning disable VSTHRD100 // Avoid async void methods
98101
102+ private void ThemeManager_ActualApplicationThemeChanged ( ModernWpf . ThemeManager sender , object args )
103+ {
104+ _theme . RefreshFrameAsync ( ) ;
105+ }
106+
99107 private void OnSourceInitialized ( object sender , EventArgs e )
100108 {
101109 var handle = Win32Helper . GetWindowHandle ( this , true ) ;
@@ -541,16 +549,29 @@ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref b
541549
542550 #region Window Sound Effects
543551
552+ private void SystemEvents_PowerModeChanged ( object sender , PowerModeChangedEventArgs e )
553+ {
554+ // Fix for sound not playing after sleep / hibernate
555+ // https://stackoverflow.com/questions/64805186/mediaplayer-doesnt-play-after-computer-sleeps
556+ if ( e . Mode == PowerModes . Resume )
557+ {
558+ InitSoundEffects ( ) ;
559+ }
560+ }
561+
544562 private void InitSoundEffects ( )
545563 {
546564 if ( _settings . WMPInstalled )
547565 {
566+ animationSoundWMP ? . Close ( ) ;
548567 animationSoundWMP = new MediaPlayer ( ) ;
549568 animationSoundWMP . Open ( new Uri ( AppContext . BaseDirectory + "Resources\\ open.wav" ) ) ;
550569 }
551570 else
552571 {
572+ animationSoundWPF ? . Dispose ( ) ;
553573 animationSoundWPF = new SoundPlayer ( AppContext . BaseDirectory + "Resources\\ open.wav" ) ;
574+ animationSoundWPF . Load ( ) ;
554575 }
555576 }
556577
@@ -696,8 +717,26 @@ void InitializePositionInner()
696717 {
697718 if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
698719 {
699- Top = _settings . WindowTop ;
720+ var previousScreenWidth = _settings . PreviousScreenWidth ;
721+ var previousScreenHeight = _settings . PreviousScreenHeight ;
722+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
723+
724+ _settings . PreviousScreenWidth = SystemParameters . VirtualScreenWidth ;
725+ _settings . PreviousScreenHeight = SystemParameters . VirtualScreenHeight ;
726+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
727+
728+ if ( previousScreenWidth != 0 && previousScreenHeight != 0 &&
729+ previousDpiX != 0 && previousDpiY != 0 &&
730+ ( previousScreenWidth != SystemParameters . VirtualScreenWidth ||
731+ previousScreenHeight != SystemParameters . VirtualScreenHeight ||
732+ previousDpiX != currentDpiX || previousDpiY != currentDpiY ) )
733+ {
734+ AdjustPositionForResolutionChange ( ) ;
735+ return ;
736+ }
737+
700738 Left = _settings . WindowLeft ;
739+ Top = _settings . WindowTop ;
701740 }
702741 else
703742 {
@@ -710,27 +749,73 @@ void InitializePositionInner()
710749 break ;
711750 case SearchWindowAligns . CenterTop :
712751 Left = HorizonCenter ( screen ) ;
713- Top = 10 ;
752+ Top = VerticalTop ( screen ) ;
714753 break ;
715754 case SearchWindowAligns . LeftTop :
716755 Left = HorizonLeft ( screen ) ;
717- Top = 10 ;
756+ Top = VerticalTop ( screen ) ;
718757 break ;
719758 case SearchWindowAligns . RightTop :
720759 Left = HorizonRight ( screen ) ;
721- Top = 10 ;
760+ Top = VerticalTop ( screen ) ;
722761 break ;
723762 case SearchWindowAligns . Custom :
724- Left = Win32Helper . TransformPixelsToDIP ( this ,
725- screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) . X ;
726- Top = Win32Helper . TransformPixelsToDIP ( this , 0 ,
727- screen . WorkingArea . Y + _settings . CustomWindowTop ) . Y ;
763+ var customLeft = Win32Helper . TransformPixelsToDIP ( this ,
764+ screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) ;
765+ var customTop = Win32Helper . TransformPixelsToDIP ( this , 0 ,
766+ screen . WorkingArea . Y + _settings . CustomWindowTop ) ;
767+ Left = customLeft . X ;
768+ Top = customTop . Y ;
728769 break ;
729770 }
730771 }
731772 }
732773 }
733774
775+ private void AdjustPositionForResolutionChange ( )
776+ {
777+ var screenWidth = SystemParameters . VirtualScreenWidth ;
778+ var screenHeight = SystemParameters . VirtualScreenHeight ;
779+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
780+
781+ var previousLeft = _settings . WindowLeft ;
782+ var previousTop = _settings . WindowTop ;
783+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
784+
785+ var widthRatio = screenWidth / _settings . PreviousScreenWidth ;
786+ var heightRatio = screenHeight / _settings . PreviousScreenHeight ;
787+ var dpiXRatio = currentDpiX / previousDpiX ;
788+ var dpiYRatio = currentDpiY / previousDpiY ;
789+
790+ var newLeft = previousLeft * widthRatio * dpiXRatio ;
791+ var newTop = previousTop * heightRatio * dpiYRatio ;
792+
793+ var screenLeft = SystemParameters . VirtualScreenLeft ;
794+ var screenTop = SystemParameters . VirtualScreenTop ;
795+
796+ var maxX = screenLeft + screenWidth - ActualWidth ;
797+ var maxY = screenTop + screenHeight - ActualHeight ;
798+
799+ Left = Math . Max ( screenLeft , Math . Min ( newLeft , maxX ) ) ;
800+ Top = Math . Max ( screenTop , Math . Min ( newTop , maxY ) ) ;
801+ }
802+
803+ private void GetDpi ( out double dpiX , out double dpiY )
804+ {
805+ var source = PresentationSource . FromVisual ( this ) ;
806+ if ( source != null && source . CompositionTarget != null )
807+ {
808+ var matrix = source . CompositionTarget . TransformToDevice ;
809+ dpiX = 96 * matrix . M11 ;
810+ dpiY = 96 * matrix . M22 ;
811+ }
812+ else
813+ {
814+ dpiX = 96 ;
815+ dpiY = 96 ;
816+ }
817+ }
818+
734819 private Screen SelectedScreen ( )
735820 {
736821 Screen screen ;
@@ -791,6 +876,13 @@ private double HorizonLeft(Screen screen)
791876 return left ;
792877 }
793878
879+ public double VerticalTop ( Screen screen )
880+ {
881+ var dip1 = Win32Helper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
882+ var top = dip1 . Y + 10 ;
883+ return top ;
884+ }
885+
794886 #endregion
795887
796888 #region Window Animation
@@ -817,7 +909,7 @@ private void InitProgressbarAnimation()
817909 {
818910 Name = progressBarAnimationName , Storyboard = progressBarStoryBoard
819911 } ;
820-
912+
821913 var stopStoryboard = new StopStoryboard ( )
822914 {
823915 BeginStoryboardName = progressBarAnimationName
@@ -838,7 +930,7 @@ private void InitProgressbarAnimation()
838930 progressStyle . Triggers . Add ( trigger ) ;
839931
840932 ProgressBar . Style = progressStyle ;
841-
933+
842934 _viewModel . ProgressBarVisibility = Visibility . Hidden ;
843935 }
844936
@@ -886,7 +978,7 @@ private void WindowAnimation()
886978 Duration = TimeSpan . FromMilliseconds ( animationLength ) ,
887979 FillBehavior = FillBehavior . HoldEnd
888980 } ;
889-
981+
890982 var rightMargin = GetThicknessFromStyle ( ClockPanel . Style , new Thickness ( 0 , 0 , DefaultRightMargin , 0 ) ) . Right ;
891983
892984 var thicknessAnimation = new ThicknessAnimation
@@ -914,10 +1006,10 @@ private void WindowAnimation()
9141006 clocksb . Children . Add ( ClockOpacity ) ;
9151007 iconsb . Children . Add ( IconMotion ) ;
9161008 iconsb . Children . Add ( IconOpacity ) ;
917-
1009+
9181010 _settings . WindowLeft = Left ;
9191011 _isArrowKeyPressed = false ;
920-
1012+
9211013 clocksb . Begin ( ClockPanel ) ;
9221014 iconsb . Begin ( SearchIcon ) ;
9231015 }
@@ -1089,7 +1181,7 @@ private void QueryTextBox_OnPreviewDragOver(object sender, DragEventArgs e)
10891181 {
10901182 e . Handled = true ;
10911183 }
1092-
1184+
10931185 #endregion
10941186
10951187 #region Placeholder
@@ -1141,7 +1233,7 @@ private void SetupResizeMode()
11411233 }
11421234
11431235 #endregion
1144-
1236+
11451237 #region Search Delay
11461238
11471239 private void QueryTextBox_TextChanged1 ( object sender , TextChangedEventArgs e )
@@ -1163,6 +1255,10 @@ protected virtual void Dispose(bool disposing)
11631255 {
11641256 _hwndSource ? . Dispose ( ) ;
11651257 _notifyIcon ? . Dispose ( ) ;
1258+ animationSoundWMP ? . Close ( ) ;
1259+ animationSoundWPF ? . Dispose ( ) ;
1260+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged ;
1261+ SystemEvents . PowerModeChanged -= SystemEvents_PowerModeChanged ;
11661262 }
11671263
11681264 _disposed = true ;
0 commit comments