From 46d59287242c23ad6a8251e5cdf8089212e6d678 Mon Sep 17 00:00:00 2001 From: Timon Date: Sat, 20 Sep 2025 16:48:47 -0700 Subject: [PATCH] Desktop: Fix window maximize and minimize (#3200) Fix window maximize and minimize state --- desktop/src/app.rs | 13 +++++++++++-- .../wrapper/src/handle_desktop_wrapper_message.rs | 6 +++++- desktop/wrapper/src/intercept_frontend_message.rs | 12 ++++++------ desktop/wrapper/src/messages.rs | 9 +++++---- .../app_window/app_window_message_handler.rs | 14 ++------------ editor/src/messages/frontend/frontend_message.rs | 5 +++-- frontend/src/messages.ts | 5 ++--- frontend/src/state-providers/app-window.ts | 6 +++--- frontend/wasm/src/editor_api.rs | 14 +++++++------- 9 files changed, 44 insertions(+), 40 deletions(-) diff --git a/desktop/src/app.rs b/desktop/src/app.rs index 10b52d48..6d2ce497 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -166,10 +166,15 @@ impl App { graphics_state.set_overlays_scene(scene); } } - DesktopFrontendMessage::UpdateWindowState { maximized, minimized } => { + DesktopFrontendMessage::MinimizeWindow => { if let Some(window) = &self.window { + window.set_minimized(true); + } + } + DesktopFrontendMessage::MaximizeWindow => { + if let Some(window) = &self.window { + let maximized = !window.is_maximized(); window.set_maximized(maximized); - window.set_minimized(minimized); } } DesktopFrontendMessage::DragWindow => { @@ -352,6 +357,10 @@ impl ApplicationHandler for App { WindowEvent::SurfaceResized(size) => { let _ = self.cef_window_size_sender.send(size.into()); self.cef_context.notify_of_resize(); + if let Some(window) = &self.window { + let maximized = window.is_maximized(); + self.app_event_scheduler.schedule(AppEvent::DesktopWrapperMessage(DesktopWrapperMessage::UpdateMaximized { maximized })); + } } WindowEvent::RedrawRequested => { let Some(ref mut graphics_state) = self.graphics_state else { return }; diff --git a/desktop/wrapper/src/handle_desktop_wrapper_message.rs b/desktop/wrapper/src/handle_desktop_wrapper_message.rs index c5cfa32e..a833a5cd 100644 --- a/desktop/wrapper/src/handle_desktop_wrapper_message.rs +++ b/desktop/wrapper/src/handle_desktop_wrapper_message.rs @@ -1,7 +1,7 @@ use graphene_std::Color; use graphene_std::raster::Image; use graphite_editor::messages::app_window::app_window_message_handler::AppWindowPlatform; -use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, PortfolioMessage, PreferencesMessage}; +use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, FrontendMessage, PortfolioMessage, PreferencesMessage}; use crate::messages::Platform; @@ -118,6 +118,10 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess let message = AppWindowMessage::AppWindowUpdatePlatform { platform }; dispatcher.queue_editor_message(message.into()); } + DesktopWrapperMessage::UpdateMaximized { maximized } => { + let message = FrontendMessage::UpdateMaximized { maximized }; + dispatcher.queue_editor_message(message.into()); + } DesktopWrapperMessage::LoadDocument { id, document, diff --git a/desktop/wrapper/src/intercept_frontend_message.rs b/desktop/wrapper/src/intercept_frontend_message.rs index 68eb5493..0d7a0099 100644 --- a/desktop/wrapper/src/intercept_frontend_message.rs +++ b/desktop/wrapper/src/intercept_frontend_message.rs @@ -64,18 +64,18 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD FrontendMessage::TriggerVisitLink { url } => { dispatcher.respond(DesktopFrontendMessage::OpenUrl(url)); } - FrontendMessage::UpdateWindowState { maximized, minimized } => { - dispatcher.respond(DesktopFrontendMessage::UpdateWindowState { maximized, minimized }); - - // Forward this to update the UI - return Some(message); - } FrontendMessage::DragWindow => { dispatcher.respond(DesktopFrontendMessage::DragWindow); } FrontendMessage::CloseWindow => { dispatcher.respond(DesktopFrontendMessage::CloseWindow); } + FrontendMessage::TriggerMinimizeWindow => { + dispatcher.respond(DesktopFrontendMessage::MinimizeWindow); + } + FrontendMessage::TriggerMaximizeWindow => { + dispatcher.respond(DesktopFrontendMessage::MaximizeWindow); + } FrontendMessage::TriggerPersistenceWriteDocument { document_id, document, details } => { dispatcher.respond(DesktopFrontendMessage::PersistenceWriteDocument { id: document_id, diff --git a/desktop/wrapper/src/messages.rs b/desktop/wrapper/src/messages.rs index 8804944e..fd561626 100644 --- a/desktop/wrapper/src/messages.rs +++ b/desktop/wrapper/src/messages.rs @@ -32,10 +32,8 @@ pub enum DesktopFrontendMessage { height: f32, }, UpdateOverlays(vello::Scene), - UpdateWindowState { - maximized: bool, - minimized: bool, - }, + MinimizeWindow, + MaximizeWindow, DragWindow, CloseWindow, PersistenceWriteDocument { @@ -92,6 +90,9 @@ pub enum DesktopWrapperMessage { }, PollNodeGraphEvaluation, UpdatePlatform(Platform), + UpdateMaximized { + maximized: bool, + }, LoadDocument { id: DocumentId, document: Document, 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 ed1ce473..35d3d2b3 100644 --- a/editor/src/messages/app_window/app_window_message_handler.rs +++ b/editor/src/messages/app_window/app_window_message_handler.rs @@ -5,8 +5,6 @@ use graphite_proc_macros::{ExtractField, message_handler_data}; #[derive(Debug, Clone, Default, ExtractField)] pub struct AppWindowMessageHandler { platform: AppWindowPlatform, - maximized: bool, - minimized: bool, } #[message_handler_data] @@ -14,18 +12,10 @@ impl MessageHandler for AppWindowMessageHandler { fn process_message(&mut self, message: AppWindowMessage, responses: &mut std::collections::VecDeque, _: ()) { match message { AppWindowMessage::AppWindowMaximize => { - self.maximized = !self.maximized; - responses.add(FrontendMessage::UpdateWindowState { - maximized: self.maximized, - minimized: self.minimized, - }); + responses.add(FrontendMessage::TriggerMaximizeWindow); } AppWindowMessage::AppWindowMinimize => { - self.minimized = !self.minimized; - responses.add(FrontendMessage::UpdateWindowState { - maximized: self.maximized, - minimized: self.minimized, - }); + responses.add(FrontendMessage::TriggerMinimizeWindow); } AppWindowMessage::AppWindowUpdatePlatform { platform } => { self.platform = platform; diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index 5a1d3249..91257670 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -120,6 +120,8 @@ pub enum FrontendMessage { TriggerVisitLink { url: String, }, + TriggerMinimizeWindow, + TriggerMaximizeWindow, // Update prefix: give the frontend a new value or state for it to use UpdateActiveDocument { @@ -339,9 +341,8 @@ pub enum FrontendMessage { UpdatePlatform { platform: AppWindowPlatform, }, - UpdateWindowState { + UpdateMaximized { maximized: bool, - minimized: bool, }, DragWindow, CloseWindow, diff --git a/frontend/src/messages.ts b/frontend/src/messages.ts index a3b0031d..aff6380c 100644 --- a/frontend/src/messages.ts +++ b/frontend/src/messages.ts @@ -302,9 +302,8 @@ export class UpdatePlatform extends JsMessage { readonly platform!: AppWindowPlatform; } -export class UpdateWindowState extends JsMessage { +export class UpdateMaximized extends JsMessage { readonly maximized!: boolean; - readonly minimized!: boolean; } export class CloseWindow extends JsMessage {} @@ -1694,7 +1693,7 @@ export const messageMakers: Record = { UpdateLayersPanelControlBarLeftLayout, UpdateLayersPanelControlBarRightLayout, UpdateLayerWidths, - UpdateWindowState, + UpdateMaximized, UpdateMenuBarLayout, UpdateMouseCursor, UpdateNodeGraphControlBarLayout, diff --git a/frontend/src/state-providers/app-window.ts b/frontend/src/state-providers/app-window.ts index 353eb0ee..9f83ca1c 100644 --- a/frontend/src/state-providers/app-window.ts +++ b/frontend/src/state-providers/app-window.ts @@ -1,7 +1,7 @@ import { writable } from "svelte/store"; import { type Editor } from "@graphite/editor"; -import { type AppWindowPlatform, UpdatePlatform, UpdateViewportHolePunch, UpdateWindowState } from "@graphite/messages"; +import { type AppWindowPlatform, UpdatePlatform, UpdateViewportHolePunch, UpdateMaximized as UpdateMaximized } from "@graphite/messages"; export function createAppWindowState(editor: Editor) { const { subscribe, update } = writable({ @@ -17,9 +17,9 @@ export function createAppWindowState(editor: Editor) { return state; }); }); - editor.subscriptions.subscribeJsMessage(UpdateWindowState, (updateWindowState) => { + editor.subscriptions.subscribeJsMessage(UpdateMaximized, (updateMaximized) => { update((state) => { - state.maximized = updateWindowState.maximized; + state.maximized = updateMaximized.maximized; return state; }); }); diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index c05c09f1..24a76910 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -307,13 +307,6 @@ impl EditorHandle { } } - /// Minimizes the application window to the taskbar or dock - #[wasm_bindgen(js_name = appWindowMinimize)] - pub fn app_window_minimize(&self) { - let message = AppWindowMessage::AppWindowMinimize; - self.dispatch(message); - } - #[wasm_bindgen(js_name = addPrimaryImport)] pub fn add_primary_import(&self) { self.dispatch(DocumentMessage::AddTransaction); @@ -338,6 +331,13 @@ impl EditorHandle { self.dispatch(NodeGraphMessage::AddSecondaryExport); } + /// Minimizes the application window to the taskbar or dock + #[wasm_bindgen(js_name = appWindowMinimize)] + pub fn app_window_minimize(&self) { + let message = AppWindowMessage::AppWindowMinimize; + self.dispatch(message); + } + /// Toggles minimizing or restoring down the application window #[wasm_bindgen(js_name = appWindowMaximize)] pub fn app_window_maximize(&self) {