2525using ModernWpf . Controls ;
2626using Key = System . Windows . Input . Key ;
2727using System . Media ;
28+ using System . Linq ;
2829
2930namespace Flow . Launcher
3031{
@@ -200,29 +201,39 @@ private void OnLoaded(object sender, RoutedEventArgs _)
200201
201202 private void InitializePosition ( )
202203 {
203- switch ( _settings . SearchWindowPosition )
204+ if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
204205 {
205- case SearchWindowPositions . RememberLastLaunchLocation :
206- Top = _settings . WindowTop ;
207- Left = _settings . WindowLeft ;
208- break ;
209- case SearchWindowPositions . MouseScreenCenter :
210- Left = HorizonCenter ( ) ;
211- Top = VerticalCenter ( ) ;
212- break ;
213- case SearchWindowPositions . MouseScreenCenterTop :
214- Left = HorizonCenter ( ) ;
215- Top = 10 ;
216- break ;
217- case SearchWindowPositions . MouseScreenLeftTop :
218- Left = 10 ;
219- Top = 10 ;
220- break ;
221- case SearchWindowPositions . MouseScreenRightTop :
222- Left = HorizonRight ( ) ;
223- Top = 10 ;
224- break ;
206+ Top = _settings . WindowTop ;
207+ Left = _settings . WindowLeft ;
208+ }
209+ else
210+ {
211+ var screen = SelectedScreen ( ) ;
212+ switch ( _settings . SearchWindowAlign )
213+ {
214+ case SearchWindowAligns . Center :
215+ Left = HorizonCenter ( screen ) ;
216+ Top = VerticalCenter ( screen ) ;
217+ break ;
218+ case SearchWindowAligns . CenterTop :
219+ Left = HorizonCenter ( screen ) ;
220+ Top = 10 ;
221+ break ;
222+ case SearchWindowAligns . LeftTop :
223+ Left = HorizonLeft ( screen ) ;
224+ Top = 10 ;
225+ break ;
226+ case SearchWindowAligns . RightTop :
227+ Left = HorizonRight ( screen ) ;
228+ Top = 10 ;
229+ break ;
230+ case SearchWindowAligns . Custom :
231+ Left = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) . X ;
232+ Top = WindowsInteropHelper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y + _settings . CustomWindowTop ) . Y ;
233+ break ;
234+ }
225235 }
236+
226237 }
227238
228239 private void UpdateNotifyIconText ( )
@@ -339,8 +350,9 @@ private async void PositionReset()
339350 {
340351 _viewModel . Show ( ) ;
341352 await Task . Delay ( 300 ) ; // If don't give a time, Positioning will be weird.
342- Left = HorizonCenter ( ) ;
343- Top = VerticalCenter ( ) ;
353+ var screen = SelectedScreen ( ) ;
354+ Left = HorizonCenter ( screen ) ;
355+ Top = VerticalCenter ( screen ) ;
344356 }
345357
346358 private void InitProgressbarAnimation ( )
@@ -502,7 +514,7 @@ private void OnLocationChanged(object sender, EventArgs e)
502514 {
503515 if ( _animating )
504516 return ;
505- if ( _settings . SearchWindowPosition == SearchWindowPositions . RememberLastLaunchLocation )
517+ if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
506518 {
507519 _settings . WindowLeft = Left ;
508520 _settings . WindowTop = Top ;
@@ -522,30 +534,62 @@ public void HideStartup()
522534 }
523535 }
524536
525- public double HorizonCenter ( )
537+ public Screen SelectedScreen ( )
538+ {
539+ Screen screen = null ;
540+ switch ( _settings . SearchWindowScreen )
541+ {
542+ case SearchWindowScreens . Cursor :
543+ screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
544+ break ;
545+ case SearchWindowScreens . Primary :
546+ screen = Screen . PrimaryScreen ;
547+ break ;
548+ case SearchWindowScreens . Focus :
549+ IntPtr foregroundWindowHandle = WindowsInteropHelper . GetForegroundWindow ( ) ;
550+ screen = Screen . FromHandle ( foregroundWindowHandle ) ;
551+ break ;
552+ case SearchWindowScreens . Custom :
553+ if ( _settings . CustomScreenNumber <= Screen . AllScreens . Length )
554+ screen = Screen . AllScreens [ _settings . CustomScreenNumber - 1 ] ;
555+ else
556+ screen = Screen . AllScreens [ 0 ] ;
557+ break ;
558+ default :
559+ screen = Screen . AllScreens [ 0 ] ;
560+ break ;
561+ }
562+ return screen ?? Screen . AllScreens [ 0 ] ;
563+ }
564+
565+ public double HorizonCenter ( Screen screen )
526566 {
527- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
528567 var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X , 0 ) ;
529568 var dip2 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . Width , 0 ) ;
530569 var left = ( dip2 . X - ActualWidth ) / 2 + dip1 . X ;
531570 return left ;
532571 }
533572
534- public double VerticalCenter ( )
573+ public double VerticalCenter ( Screen screen )
535574 {
536- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
537575 var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
538576 var dip2 = WindowsInteropHelper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Height ) ;
539577 var top = ( dip2 . Y - QueryTextBox . ActualHeight ) / 4 + dip1 . Y ;
540578 return top ;
541579 }
542580
543- public double HorizonRight ( )
581+ public double HorizonRight ( Screen screen )
544582 {
545- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
546583 var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X , 0 ) ;
547584 var dip2 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . Width , 0 ) ;
548- var left = ( dip2 . X - ActualWidth ) - 10 ;
585+ var left = ( dip1 . X + dip2 . X - ActualWidth ) - 10 ;
586+ return left ;
587+ }
588+
589+ public double HorizonLeft ( Screen screen )
590+ {
591+ var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X , 0 ) ;
592+ var left = dip1 . X + 10 ;
549593 return left ;
550594 }
551595
0 commit comments