|
5 | 5 | // on the dispatcher messaging system and more complex Rust data types. |
6 | 6 | // |
7 | 7 | use crate::helpers::translate_key; |
8 | | -use crate::{EDITOR, EDITOR_HANDLE, EDITOR_HAS_CRASHED, Error}; |
| 8 | +use crate::{EDITOR, EDITOR_HANDLE, EDITOR_HAS_CRASHED, Error, MESSAGE_BUFFER}; |
9 | 9 | use editor::application::Editor; |
10 | 10 | use editor::consts::FILE_SAVE_SUFFIX; |
11 | 11 | use editor::messages::input_mapper::utility_types::input_keyboard::ModifierKeys; |
@@ -157,12 +157,23 @@ impl EditorHandle { |
157 | 157 | #[cfg(not(feature = "native"))] |
158 | 158 | fn dispatch<T: Into<Message>>(&self, message: T) { |
159 | 159 | // Process no further messages after a crash to avoid spamming the console |
| 160 | + |
| 161 | + use crate::MESSAGE_BUFFER; |
160 | 162 | if EDITOR_HAS_CRASHED.load(Ordering::SeqCst) { |
161 | 163 | return; |
162 | 164 | } |
163 | 165 |
|
164 | 166 | // Get the editor, dispatch the message, and store the `FrontendMessage` queue response |
165 | | - let frontend_messages = editor(|editor| editor.handle_message(message.into())); |
| 167 | + let frontend_messages = EDITOR.with(|editor| { |
| 168 | + let mut guard = editor.try_lock(); |
| 169 | + let Ok(Some(editor)) = guard.as_deref_mut() else { |
| 170 | + // Enqueue messages which can't be procssed currently |
| 171 | + MESSAGE_BUFFER.with_borrow_mut(|buffer| buffer.push(message.into())); |
| 172 | + return vec![]; |
| 173 | + }; |
| 174 | + |
| 175 | + editor.handle_message(message) |
| 176 | + }); |
166 | 177 |
|
167 | 178 | // Send each `FrontendMessage` to the JavaScript frontend |
168 | 179 | for message in frontend_messages.into_iter() { |
@@ -240,6 +251,13 @@ impl EditorHandle { |
240 | 251 |
|
241 | 252 | if !EDITOR_HAS_CRASHED.load(Ordering::SeqCst) { |
242 | 253 | handle(|handle| { |
| 254 | + // Process all messages that have been queued up |
| 255 | + let messages = MESSAGE_BUFFER.take(); |
| 256 | + |
| 257 | + for message in messages { |
| 258 | + handle.dispatch(message); |
| 259 | + } |
| 260 | + |
243 | 261 | handle.dispatch(InputPreprocessorMessage::CurrentTime { |
244 | 262 | timestamp: js_sys::Date::now() as u64, |
245 | 263 | }); |
@@ -985,7 +1003,7 @@ fn auto_save_all_documents() { |
985 | 1003 | return; |
986 | 1004 | } |
987 | 1005 |
|
988 | | - editor_and_handle(|_, handle| { |
| 1006 | + handle(|handle| { |
989 | 1007 | handle.dispatch(PortfolioMessage::AutoSaveAllDocuments); |
990 | 1008 | }); |
991 | 1009 | } |
0 commit comments