Skip to content

Commit 48ac24d

Browse files
Desktop: Fix frontend message response dispatch (#3247)
* One annoying debugging session later Discovered that the editor handles frontend messages differently from other messages. It requires all frontend messages to be fully processed before dispatching any resulting messages. In the web frontend, this behavior happened implicitly because message dispatch is queued at the current end of the JavaScript execution queue. For the desktop frontend, I added a vector to collect all responses until the entire batch of frontend messages is handled, and then dispatch them afterwards. * Fix double click travel
1 parent bfba632 commit 48ac24d

File tree

4 files changed

+24
-15
lines changed

4 files changed

+24
-15
lines changed

desktop/src/app.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl App {
8282
}
8383
}
8484

85-
fn handle_desktop_frontend_message(&mut self, message: DesktopFrontendMessage) {
85+
fn handle_desktop_frontend_message(&mut self, message: DesktopFrontendMessage, responses: &mut Vec<DesktopWrapperMessage>) {
8686
match message {
8787
DesktopFrontendMessage::ToWeb(messages) => {
8888
let Some(bytes) = serialize_frontend_messages(messages) else {
@@ -205,7 +205,7 @@ impl App {
205205
to_front: false,
206206
select_after_open: true,
207207
};
208-
self.dispatch_desktop_wrapper_message(message);
208+
responses.push(message);
209209
}
210210
}
211211
DesktopFrontendMessage::PersistenceLoadRemainingDocuments => {
@@ -216,7 +216,7 @@ impl App {
216216
to_front: true,
217217
select_after_open: false,
218218
};
219-
self.dispatch_desktop_wrapper_message(message);
219+
responses.push(message);
220220
}
221221
for (id, document) in self.persistent_data.documents_after_current() {
222222
let message = DesktopWrapperMessage::LoadDocument {
@@ -225,11 +225,11 @@ impl App {
225225
to_front: false,
226226
select_after_open: false,
227227
};
228-
self.dispatch_desktop_wrapper_message(message);
228+
responses.push(message);
229229
}
230230
if let Some(id) = self.persistent_data.current_document_id() {
231231
let message = DesktopWrapperMessage::SelectDocument { id };
232-
self.dispatch_desktop_wrapper_message(message);
232+
responses.push(message);
233233
}
234234
}
235235
DesktopFrontendMessage::PersistenceWritePreferences { preferences } => {
@@ -238,14 +238,18 @@ impl App {
238238
DesktopFrontendMessage::PersistenceLoadPreferences => {
239239
let preferences = self.persistent_data.load_preferences();
240240
let message = DesktopWrapperMessage::LoadPreferences { preferences };
241-
self.dispatch_desktop_wrapper_message(message);
241+
responses.push(message);
242242
}
243243
}
244244
}
245245

246246
fn handle_desktop_frontend_messages(&mut self, messages: Vec<DesktopFrontendMessage>) {
247+
let mut responses = Vec::new();
247248
for message in messages {
248-
self.handle_desktop_frontend_message(message);
249+
self.handle_desktop_frontend_message(message, &mut responses);
250+
}
251+
for message in responses {
252+
self.dispatch_desktop_wrapper_message(message);
249253
}
250254
}
251255

desktop/src/cef/input.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ impl ClickTracker {
246246
return ClickCount::Single;
247247
};
248248

249-
let previous = record.time;
249+
let prev_time = record.time;
250+
let prev_position = record.position;
250251

251252
let now = Instant::now();
252253
record.time = now;
@@ -270,10 +271,10 @@ impl ClickTracker {
270271
_ => {}
271272
}
272273

273-
let dx = position.x.abs_diff(record.position.x);
274-
let dy = position.y.abs_diff(record.position.y);
274+
let dx = position.x.abs_diff(prev_position.x);
275+
let dy = position.y.abs_diff(prev_position.y);
275276
let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL;
276-
let within_time = now.saturating_duration_since(previous) <= MULTICLICK_TIMEOUT;
277+
let within_time = now.saturating_duration_since(prev_time) <= MULTICLICK_TIMEOUT;
277278

278279
let count = if within_time && within_dist { ClickCount::Double } else { ClickCount::Single };
279280

desktop/wrapper/src/message_dispatcher.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ impl<'a> DesktopWrapperMessageDispatcher<'a> {
7171
frontend_messages.extend(current_frontend_messages);
7272
}
7373

74-
self.respond(DesktopFrontendMessage::ToWeb(frontend_messages));
74+
if !frontend_messages.is_empty() {
75+
self.respond(DesktopFrontendMessage::ToWeb(frontend_messages));
76+
}
7577
}
7678
}

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,12 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
136136

137137
// Messages
138138
PortfolioMessage::Init => {
139-
// Load persistent data from the browser database
140-
responses.add(FrontendMessage::TriggerLoadFirstAutoSaveDocument);
139+
// Tell frontend to load persistent preferences
141140
responses.add(FrontendMessage::TriggerLoadPreferences);
142141

142+
// Tell frontend to load the current document
143+
responses.add(FrontendMessage::TriggerLoadFirstAutoSaveDocument);
144+
143145
// Display the menu bar at the top of the window
144146
responses.add(MenuBarMessage::SendLayout);
145147

@@ -149,7 +151,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
149151
node_types: document_node_definitions::collect_node_types(),
150152
});
151153

152-
// Finish loading persistent data from the browser database
154+
// Tell frontend to finish loading persistent documents
153155
responses.add(FrontendMessage::TriggerLoadRestAutoSaveDocuments);
154156
}
155157
PortfolioMessage::DocumentPassMessage { document_id, message } => {

0 commit comments

Comments
 (0)