From d97fe835b5ef8727a91d062abc247978df3706f7 Mon Sep 17 00:00:00 2001 From: Timon Date: Fri, 8 May 2026 15:00:20 +0000 Subject: [PATCH] Desktop: Focus app window when loading a document (#4124) --- desktop/src/app.rs | 5 +++++ desktop/src/window.rs | 5 +++++ desktop/wrapper/src/intercept_frontend_message.rs | 3 +++ desktop/wrapper/src/messages.rs | 1 + editor/src/messages/app_window/app_window_message.rs | 1 + editor/src/messages/app_window/app_window_message_handler.rs | 4 ++++ editor/src/messages/frontend/frontend_message.rs | 2 ++ editor/src/messages/portfolio/portfolio_message_handler.rs | 2 ++ 8 files changed, 23 insertions(+) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 2c69c4b3..6becdf27 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -368,6 +368,11 @@ impl App { window.start_drag(); } } + DesktopFrontendMessage::WindowFocus => { + if let Some(window) = &self.window { + window.focus(); + } + } DesktopFrontendMessage::WindowHide => { if let Some(window) = &self.window { window.hide(); diff --git a/desktop/src/window.rs b/desktop/src/window.rs index a9b48e38..dcb5d514 100644 --- a/desktop/src/window.rs +++ b/desktop/src/window.rs @@ -140,6 +140,11 @@ impl Window { let _ = self.winit_window.drag_window(); } + pub(crate) fn focus(&self) { + self.winit_window.set_minimized(false); + self.winit_window.focus_window(); + } + pub(crate) fn hide(&self) { self.native_handle.hide(); } diff --git a/desktop/wrapper/src/intercept_frontend_message.rs b/desktop/wrapper/src/intercept_frontend_message.rs index 2774532f..2504746f 100644 --- a/desktop/wrapper/src/intercept_frontend_message.rs +++ b/desktop/wrapper/src/intercept_frontend_message.rs @@ -139,6 +139,9 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD FrontendMessage::WindowDrag => { dispatcher.respond(DesktopFrontendMessage::WindowDrag); } + FrontendMessage::WindowFocus => { + dispatcher.respond(DesktopFrontendMessage::WindowFocus); + } FrontendMessage::WindowHide => { dispatcher.respond(DesktopFrontendMessage::WindowHide); } diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 5d4cbced..a571eb49 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -72,6 +72,7 @@ pub enum DesktopFrontendMessage { WindowMaximize, WindowFullscreen, WindowDrag, + WindowFocus, WindowHide, WindowHideOthers, WindowShowAll, diff --git a/editor/src/messages/app_window/app_window_message.rs b/editor/src/messages/app_window/app_window_message.rs index 2acf297f..1a68fdc9 100644 --- a/editor/src/messages/app_window/app_window_message.rs +++ b/editor/src/messages/app_window/app_window_message.rs @@ -11,6 +11,7 @@ pub enum AppWindowMessage { Maximize, Fullscreen, Drag, + Focus, Hide, HideOthers, ShowAll, diff --git a/editor/src/messages/app_window/app_window_message_handler.rs b/editor/src/messages/app_window/app_window_message_handler.rs index 3c4d4ad6..0477bed6 100644 --- a/editor/src/messages/app_window/app_window_message_handler.rs +++ b/editor/src/messages/app_window/app_window_message_handler.rs @@ -36,6 +36,10 @@ impl MessageHandler for AppWindowMessageHandler { #[cfg(not(target_family = "wasm"))] responses.add(FrontendMessage::WindowDrag); } + AppWindowMessage::Focus => { + #[cfg(not(target_family = "wasm"))] + responses.add(FrontendMessage::WindowFocus); + } AppWindowMessage::Hide => { #[cfg(not(target_family = "wasm"))] responses.add(FrontendMessage::WindowHide); diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index fee0c5ec..0e68146d 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -362,6 +362,8 @@ pub enum FrontendMessage { #[cfg(not(target_family = "wasm"))] WindowHide, #[cfg(not(target_family = "wasm"))] + WindowFocus, + #[cfg(not(target_family = "wasm"))] WindowHideOthers, #[cfg(not(target_family = "wasm"))] WindowShowAll, diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 90c8b506..269961e4 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -819,6 +819,8 @@ impl MessageHandler> for Portfolio // Load the document into the portfolio so it opens in the editor self.load_document(document, document_id, responses); + + responses.add(AppWindowMessage::Focus); } PortfolioMessage::OpenImage { name, image } => { // `NewDocumentWithName`'s handler routes empty/None-equivalent names through `resolve_document_name` which assigns the next available "Untitled Document {N}".