22
22
using Flow . Launcher . Infrastructure . UserSettings ;
23
23
using Flow . Launcher . Plugin . SharedCommands ;
24
24
using Flow . Launcher . ViewModel ;
25
+ using Microsoft . Win32 ;
25
26
using ModernWpf . Controls ;
26
27
using DataObject = System . Windows . DataObject ;
27
28
using Key = System . Windows . Input . Key ;
@@ -88,6 +89,8 @@ public MainWindow()
88
89
89
90
InitSoundEffects ( ) ;
90
91
DataObject . AddPastingHandler ( QueryTextBox , QueryTextBox_OnPaste ) ;
92
+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged ;
93
+ SystemEvents . PowerModeChanged += SystemEvents_PowerModeChanged ;
91
94
}
92
95
93
96
#endregion
@@ -96,6 +99,11 @@ public MainWindow()
96
99
97
100
#pragma warning disable VSTHRD100 // Avoid async void methods
98
101
102
+ private void ThemeManager_ActualApplicationThemeChanged ( ModernWpf . ThemeManager sender , object args )
103
+ {
104
+ _theme . RefreshFrameAsync ( ) ;
105
+ }
106
+
99
107
private void OnSourceInitialized ( object sender , EventArgs e )
100
108
{
101
109
var handle = Win32Helper . GetWindowHandle ( this , true ) ;
@@ -541,16 +549,29 @@ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref b
541
549
542
550
#region Window Sound Effects
543
551
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
+
544
562
private void InitSoundEffects ( )
545
563
{
546
564
if ( _settings . WMPInstalled )
547
565
{
566
+ animationSoundWMP ? . Close ( ) ;
548
567
animationSoundWMP = new MediaPlayer ( ) ;
549
568
animationSoundWMP . Open ( new Uri ( AppContext . BaseDirectory + "Resources\\ open.wav" ) ) ;
550
569
}
551
570
else
552
571
{
572
+ animationSoundWPF ? . Dispose ( ) ;
553
573
animationSoundWPF = new SoundPlayer ( AppContext . BaseDirectory + "Resources\\ open.wav" ) ;
574
+ animationSoundWPF . Load ( ) ;
554
575
}
555
576
}
556
577
@@ -696,8 +717,26 @@ void InitializePositionInner()
696
717
{
697
718
if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
698
719
{
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
+
700
738
Left = _settings . WindowLeft ;
739
+ Top = _settings . WindowTop ;
701
740
}
702
741
else
703
742
{
@@ -710,27 +749,73 @@ void InitializePositionInner()
710
749
break ;
711
750
case SearchWindowAligns . CenterTop :
712
751
Left = HorizonCenter ( screen ) ;
713
- Top = 10 ;
752
+ Top = VerticalTop ( screen ) ;
714
753
break ;
715
754
case SearchWindowAligns . LeftTop :
716
755
Left = HorizonLeft ( screen ) ;
717
- Top = 10 ;
756
+ Top = VerticalTop ( screen ) ;
718
757
break ;
719
758
case SearchWindowAligns . RightTop :
720
759
Left = HorizonRight ( screen ) ;
721
- Top = 10 ;
760
+ Top = VerticalTop ( screen ) ;
722
761
break ;
723
762
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 ;
728
769
break ;
729
770
}
730
771
}
731
772
}
732
773
}
733
774
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
+
734
819
private Screen SelectedScreen ( )
735
820
{
736
821
Screen screen ;
@@ -791,6 +876,13 @@ private double HorizonLeft(Screen screen)
791
876
return left ;
792
877
}
793
878
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
+
794
886
#endregion
795
887
796
888
#region Window Animation
@@ -817,7 +909,7 @@ private void InitProgressbarAnimation()
817
909
{
818
910
Name = progressBarAnimationName , Storyboard = progressBarStoryBoard
819
911
} ;
820
-
912
+
821
913
var stopStoryboard = new StopStoryboard ( )
822
914
{
823
915
BeginStoryboardName = progressBarAnimationName
@@ -838,7 +930,7 @@ private void InitProgressbarAnimation()
838
930
progressStyle . Triggers . Add ( trigger ) ;
839
931
840
932
ProgressBar . Style = progressStyle ;
841
-
933
+
842
934
_viewModel . ProgressBarVisibility = Visibility . Hidden ;
843
935
}
844
936
@@ -886,7 +978,7 @@ private void WindowAnimation()
886
978
Duration = TimeSpan . FromMilliseconds ( animationLength ) ,
887
979
FillBehavior = FillBehavior . HoldEnd
888
980
} ;
889
-
981
+
890
982
var rightMargin = GetThicknessFromStyle ( ClockPanel . Style , new Thickness ( 0 , 0 , DefaultRightMargin , 0 ) ) . Right ;
891
983
892
984
var thicknessAnimation = new ThicknessAnimation
@@ -914,10 +1006,10 @@ private void WindowAnimation()
914
1006
clocksb . Children . Add ( ClockOpacity ) ;
915
1007
iconsb . Children . Add ( IconMotion ) ;
916
1008
iconsb . Children . Add ( IconOpacity ) ;
917
-
1009
+
918
1010
_settings . WindowLeft = Left ;
919
1011
_isArrowKeyPressed = false ;
920
-
1012
+
921
1013
clocksb . Begin ( ClockPanel ) ;
922
1014
iconsb . Begin ( SearchIcon ) ;
923
1015
}
@@ -1089,7 +1181,7 @@ private void QueryTextBox_OnPreviewDragOver(object sender, DragEventArgs e)
1089
1181
{
1090
1182
e . Handled = true ;
1091
1183
}
1092
-
1184
+
1093
1185
#endregion
1094
1186
1095
1187
#region Placeholder
@@ -1141,7 +1233,7 @@ private void SetupResizeMode()
1141
1233
}
1142
1234
1143
1235
#endregion
1144
-
1236
+
1145
1237
#region Search Delay
1146
1238
1147
1239
private void QueryTextBox_TextChanged1 ( object sender , TextChangedEventArgs e )
@@ -1163,6 +1255,10 @@ protected virtual void Dispose(bool disposing)
1163
1255
{
1164
1256
_hwndSource ? . Dispose ( ) ;
1165
1257
_notifyIcon ? . Dispose ( ) ;
1258
+ animationSoundWMP ? . Close ( ) ;
1259
+ animationSoundWPF ? . Dispose ( ) ;
1260
+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged ;
1261
+ SystemEvents . PowerModeChanged -= SystemEvents_PowerModeChanged ;
1166
1262
}
1167
1263
1168
1264
_disposed = true ;
0 commit comments