diff --git a/.changes/core-center-window.md b/.changes/core-center-window.md new file mode 100644 index 000000000..f6993db82 --- /dev/null +++ b/.changes/core-center-window.md @@ -0,0 +1,6 @@ +--- +'tauri': 'patch:enhance' +'tauri-runtime-wry': 'patch' +--- + +Enhance centering a newly created window, it will no longer jump to center after being visible. diff --git a/core/tauri-runtime-wry/src/lib.rs b/core/tauri-runtime-wry/src/lib.rs index 3278228cb..8d0862022 100644 --- a/core/tauri-runtime-wry/src/lib.rs +++ b/core/tauri-runtime-wry/src/lib.rs @@ -2541,7 +2541,14 @@ fn handle_user_message( } // Setters WindowMessage::Center => { - let _ = center_window(&window, inner_size(&window, &webviews, has_children)); + if let Some(monitor) = window.current_monitor() { + let window_size = inner_size(&window, &webviews, has_children); + let screen_size = monitor.size(); + let monitor_pos = monitor.position(); + let x = (screen_size.width as i32 - window_size.width as i32) / 2 + monitor_pos.x; + let y = (screen_size.height as i32 - window_size.height as i32) / 2 + monitor_pos.y; + window.set_outer_position(TaoPhysicalPosition::new(x, y)); + } } WindowMessage::RequestUserAttention(request_type) => { window.request_user_attention(request_type.map(|r| r.0)); @@ -3143,22 +3150,6 @@ fn on_window_close(window_id: WindowId, windows: Rc) -> Result<()> { - if let Some(monitor) = window.current_monitor() { - let screen_size = monitor.size(); - let monitor_pos = monitor.position(); - let x = (screen_size.width as i32 - window_size.width as i32) / 2; - let y = (screen_size.height as i32 - window_size.height as i32) / 2; - window.set_outer_position(TaoPhysicalPosition::new( - monitor_pos.x + x, - monitor_pos.y + y, - )); - Ok(()) - } else { - Err(Error::FailedToGetMonitor) - } -} - fn parse_proxy_url(url: &Url) -> Result { let host = url.host().map(|h| h.to_string()).unwrap_or_default(); let port = url.port().map(|p| p.to_string()).unwrap_or_default(); @@ -3213,6 +3204,45 @@ fn create_window( } } + #[cfg(desktop)] + if window_builder.center { + let monitor = if let Some(window_position) = &window_builder.inner.window.position { + event_loop.available_monitors().find(|m| { + let monitor_pos = m.position(); + let monitor_size = m.size(); + + let window_position = window_position.to_logical(m.scale_factor()); + + monitor_pos.x <= window_position.x + && window_position.x <= monitor_pos.x + monitor_size.width as i32 + && monitor_pos.y <= window_position.y + && window_position.y <= monitor_pos.y + monitor_size.height as i32 + }) + } else { + event_loop.primary_monitor() + }; + + if let Some(monitor) = monitor { + let desired_size = window_builder + .inner + .window + .inner_size + .unwrap_or_else(|| TaoPhysicalSize::new(800, 600).into()); + let window_size = window_builder + .inner + .window + .inner_size_constraints + .clamp(desired_size, monitor.scale_factor()) + .to_logical::(monitor.scale_factor()); + let screen_size = monitor.size(); + let monitor_pos = monitor.position(); + let x = (screen_size.width as i32 - window_size.width) / 2 + monitor_pos.x; + let y = (screen_size.height as i32 - window_size.height) / 2 + monitor_pos.y; + + window_builder = window_builder.position(x as f64, y as f64); + } + } + let window = window_builder.inner.build(event_loop).unwrap(); #[cfg(feature = "tracing")] @@ -3232,10 +3262,6 @@ fn create_window( context.window_id_map.insert(window.id(), window_id); - if window_builder.center { - let _ = center_window(&window, window.inner_size()); - } - if let Some(handler) = after_window_creation { let raw = RawWindow { #[cfg(windows)]