25
25
using ModernWpf . Controls ;
26
26
using Key = System . Windows . Input . Key ;
27
27
using System . Media ;
28
+ using System . Linq ;
28
29
29
30
namespace Flow . Launcher
30
31
{
@@ -200,29 +201,39 @@ private void OnLoaded(object sender, RoutedEventArgs _)
200
201
201
202
private void InitializePosition ( )
202
203
{
203
- switch ( _settings . SearchWindowPosition )
204
+ if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
204
205
{
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
+ }
225
235
}
236
+
226
237
}
227
238
228
239
private void UpdateNotifyIconText ( )
@@ -339,8 +350,9 @@ private async void PositionReset()
339
350
{
340
351
_viewModel . Show ( ) ;
341
352
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 ) ;
344
356
}
345
357
346
358
private void InitProgressbarAnimation ( )
@@ -502,7 +514,7 @@ private void OnLocationChanged(object sender, EventArgs e)
502
514
{
503
515
if ( _animating )
504
516
return ;
505
- if ( _settings . SearchWindowPosition == SearchWindowPositions . RememberLastLaunchLocation )
517
+ if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
506
518
{
507
519
_settings . WindowLeft = Left ;
508
520
_settings . WindowTop = Top ;
@@ -522,30 +534,62 @@ public void HideStartup()
522
534
}
523
535
}
524
536
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 )
526
566
{
527
- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
528
567
var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X , 0 ) ;
529
568
var dip2 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . Width , 0 ) ;
530
569
var left = ( dip2 . X - ActualWidth ) / 2 + dip1 . X ;
531
570
return left ;
532
571
}
533
572
534
- public double VerticalCenter ( )
573
+ public double VerticalCenter ( Screen screen )
535
574
{
536
- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
537
575
var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
538
576
var dip2 = WindowsInteropHelper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Height ) ;
539
577
var top = ( dip2 . Y - QueryTextBox . ActualHeight ) / 4 + dip1 . Y ;
540
578
return top ;
541
579
}
542
580
543
- public double HorizonRight ( )
581
+ public double HorizonRight ( Screen screen )
544
582
{
545
- var screen = Screen . FromPoint ( System . Windows . Forms . Cursor . Position ) ;
546
583
var dip1 = WindowsInteropHelper . TransformPixelsToDIP ( this , screen . WorkingArea . X , 0 ) ;
547
584
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 ;
549
593
return left ;
550
594
}
551
595
0 commit comments