Queue messages in the frontend when they can't be processed (#3005)
This commit is contained in:
parent
23eb5998db
commit
309a64340b
|
|
@ -5,7 +5,7 @@
|
||||||
// on the dispatcher messaging system and more complex Rust data types.
|
// on the dispatcher messaging system and more complex Rust data types.
|
||||||
//
|
//
|
||||||
use crate::helpers::translate_key;
|
use crate::helpers::translate_key;
|
||||||
use crate::{EDITOR, EDITOR_HANDLE, EDITOR_HAS_CRASHED, Error};
|
use crate::{EDITOR, EDITOR_HANDLE, EDITOR_HAS_CRASHED, Error, MESSAGE_BUFFER};
|
||||||
use editor::application::Editor;
|
use editor::application::Editor;
|
||||||
use editor::consts::FILE_SAVE_SUFFIX;
|
use editor::consts::FILE_SAVE_SUFFIX;
|
||||||
use editor::messages::input_mapper::utility_types::input_keyboard::ModifierKeys;
|
use editor::messages::input_mapper::utility_types::input_keyboard::ModifierKeys;
|
||||||
|
|
@ -157,12 +157,23 @@ impl EditorHandle {
|
||||||
#[cfg(not(feature = "native"))]
|
#[cfg(not(feature = "native"))]
|
||||||
fn dispatch<T: Into<Message>>(&self, message: T) {
|
fn dispatch<T: Into<Message>>(&self, message: T) {
|
||||||
// Process no further messages after a crash to avoid spamming the console
|
// Process no further messages after a crash to avoid spamming the console
|
||||||
|
|
||||||
|
use crate::MESSAGE_BUFFER;
|
||||||
if EDITOR_HAS_CRASHED.load(Ordering::SeqCst) {
|
if EDITOR_HAS_CRASHED.load(Ordering::SeqCst) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the editor, dispatch the message, and store the `FrontendMessage` queue response
|
// Get the editor, dispatch the message, and store the `FrontendMessage` queue response
|
||||||
let frontend_messages = editor(|editor| editor.handle_message(message.into()));
|
let frontend_messages = EDITOR.with(|editor| {
|
||||||
|
let mut guard = editor.try_lock();
|
||||||
|
let Ok(Some(editor)) = guard.as_deref_mut() else {
|
||||||
|
// Enqueue messages which can't be procssed currently
|
||||||
|
MESSAGE_BUFFER.with_borrow_mut(|buffer| buffer.push(message.into()));
|
||||||
|
return vec![];
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.handle_message(message)
|
||||||
|
});
|
||||||
|
|
||||||
// Send each `FrontendMessage` to the JavaScript frontend
|
// Send each `FrontendMessage` to the JavaScript frontend
|
||||||
for message in frontend_messages.into_iter() {
|
for message in frontend_messages.into_iter() {
|
||||||
|
|
@ -240,6 +251,13 @@ impl EditorHandle {
|
||||||
|
|
||||||
if !EDITOR_HAS_CRASHED.load(Ordering::SeqCst) {
|
if !EDITOR_HAS_CRASHED.load(Ordering::SeqCst) {
|
||||||
handle(|handle| {
|
handle(|handle| {
|
||||||
|
// Process all messages that have been queued up
|
||||||
|
let messages = MESSAGE_BUFFER.take();
|
||||||
|
|
||||||
|
for message in messages {
|
||||||
|
handle.dispatch(message);
|
||||||
|
}
|
||||||
|
|
||||||
handle.dispatch(InputPreprocessorMessage::CurrentTime {
|
handle.dispatch(InputPreprocessorMessage::CurrentTime {
|
||||||
timestamp: js_sys::Date::now() as u64,
|
timestamp: js_sys::Date::now() as u64,
|
||||||
});
|
});
|
||||||
|
|
@ -985,7 +1003,7 @@ fn auto_save_all_documents() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
editor_and_handle(|_, handle| {
|
handle(|handle| {
|
||||||
handle.dispatch(PortfolioMessage::AutoSaveAllDocuments);
|
handle.dispatch(PortfolioMessage::AutoSaveAllDocuments);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ pub static LOGGER: WasmLog = WasmLog;
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
pub static EDITOR: Mutex<Option<editor::application::Editor>> = const { Mutex::new(None) };
|
pub static EDITOR: Mutex<Option<editor::application::Editor>> = const { Mutex::new(None) };
|
||||||
|
pub static MESSAGE_BUFFER: std::cell::RefCell<Vec<Message>> = const { std::cell::RefCell::new(Vec::new()) };
|
||||||
pub static EDITOR_HANDLE: Mutex<Option<editor_api::EditorHandle>> = const { Mutex::new(None) };
|
pub static EDITOR_HANDLE: Mutex<Option<editor_api::EditorHandle>> = const { Mutex::new(None) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue