@@ -243,6 +243,7 @@ impl From<Position> for PositionWrapper {
243243#[ derive( Debug , Clone , Default ) ]
244244pub struct WindowBuilderWrapper {
245245 inner : WryWindowBuilder ,
246+ center : bool ,
246247 #[ cfg( feature = "menu" ) ]
247248 menu_items : HashMap < u32 , WryCustomMenuItem > ,
248249}
@@ -295,6 +296,11 @@ impl WindowBuilder for WindowBuilderWrapper {
295296 self
296297 }
297298
299+ fn center ( mut self ) -> Self {
300+ self . center = true ;
301+ self
302+ }
303+
298304 fn position ( mut self , x : f64 , y : f64 ) -> Self {
299305 self . inner = self . inner . with_position ( WryLogicalPosition :: new ( x, y) ) ;
300306 self
@@ -453,6 +459,7 @@ enum WindowMessage {
453459 #[ cfg( windows) ]
454460 Hwnd ( Sender < Hwnd > ) ,
455461 // Setters
462+ Center ( Sender < Result < ( ) > > ) ,
456463 SetResizable ( bool ) ,
457464 SetTitle ( String ) ,
458465 Maximize ,
@@ -638,6 +645,10 @@ impl Dispatch for WryDispatcher {
638645
639646 // Setters
640647
648+ fn center ( & self ) -> Result < ( ) > {
649+ dispatcher_getter ! ( self , WindowMessage :: Center )
650+ }
651+
641652 fn print ( & self ) -> Result < ( ) > {
642653 self
643654 . context
@@ -1278,6 +1289,9 @@ fn handle_event_loop(
12781289 tx. send ( Hwnd ( window. hwnd ( ) ) ) . unwrap ( )
12791290 }
12801291 // Setters
1292+ WindowMessage :: Center ( tx) => {
1293+ tx. send ( center_window ( window) ) . unwrap ( ) ;
1294+ }
12811295 WindowMessage :: SetResizable ( resizable) => window. set_resizable ( resizable) ,
12821296 WindowMessage :: SetTitle ( title) => window. set_title ( & title) ,
12831297 WindowMessage :: Maximize => window. set_maximized ( true ) ,
@@ -1409,6 +1423,19 @@ fn handle_event_loop(
14091423 }
14101424}
14111425
1426+ fn center_window ( window : & Window ) -> Result < ( ) > {
1427+ if let Some ( monitor) = window. current_monitor ( ) {
1428+ let screen_size = monitor. size ( ) ;
1429+ let window_size = window. inner_size ( ) ;
1430+ let x = ( screen_size. width - window_size. width ) / 2 ;
1431+ let y = ( screen_size. height - window_size. height ) / 2 ;
1432+ window. set_outer_position ( WryPhysicalPosition :: new ( x, y) ) ;
1433+ Ok ( ( ) )
1434+ } else {
1435+ Err ( Error :: FailedToGetMonitor )
1436+ }
1437+ }
1438+
14121439fn create_webview < P : Params < Runtime = Wry > > (
14131440 event_loop : & EventLoopWindowTarget < Message > ,
14141441 context : DispatcherContext ,
@@ -1428,6 +1455,9 @@ fn create_webview<P: Params<Runtime = Wry>>(
14281455 #[ cfg( feature = "menu" ) ]
14291456 let menu_items = window_builder. menu_items ;
14301457 let window = window_builder. inner . build ( event_loop) . unwrap ( ) ;
1458+ if window_builder. center {
1459+ let _ = center_window ( & window) ;
1460+ }
14311461 let mut webview_builder = WebViewBuilder :: new ( window)
14321462 . map_err ( |e| Error :: CreateWebview ( Box :: new ( e) ) ) ?
14331463 . with_url ( & url)
0 commit comments