@@ -8,6 +8,7 @@ use crate::messages::prelude::*;
88pub struct Dispatcher {
99 message_queues : Vec < VecDeque < Message > > ,
1010 pub responses : Vec < FrontendMessage > ,
11+ pub frontend_update_messages : Vec < Message > ,
1112 pub message_handlers : DispatcherMessageHandlers ,
1213}
1314
@@ -42,19 +43,24 @@ impl DispatcherMessageHandlers {
4243/// The last occurrence of the message in the message queue is sufficient to ensure correct behavior.
4344/// In addition, these messages do not change any state in the backend (aside from caches).
4445const SIDE_EFFECT_FREE_MESSAGES : & [ MessageDiscriminant ] = & [
45- MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: PropertiesPanel (
46- PropertiesPanelMessageDiscriminant :: Refresh ,
47- ) ) ) ,
4846 MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: DocumentStructureChanged ) ) ,
49- MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: Overlays ( OverlaysMessageDiscriminant :: Draw ) ) ) ,
5047 MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: NodeGraph (
5148 NodeGraphMessageDiscriminant :: RunDocumentGraph ,
5249 ) ) ) ,
5350 MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: SubmitActiveGraphRender ) ,
51+ MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: TriggerFontLoad ) ,
52+ ] ;
53+ /// Since we don't need to update the frontend multiple times per frame,
54+ /// we have a set of messages which we will buffer until the next frame is requested.
55+ const FRONTEND_UPDATE_MESSAGES : & [ MessageDiscriminant ] = & [
56+ MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: PropertiesPanel (
57+ PropertiesPanelMessageDiscriminant :: Refresh ,
58+ ) ) ) ,
59+ MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: UpdateDocumentWidgets ) ,
60+ MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: Overlays ( OverlaysMessageDiscriminant :: Draw ) ) ) ,
5461 MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: RenderRulers ) ) ,
5562 MessageDiscriminant :: Portfolio ( PortfolioMessageDiscriminant :: Document ( DocumentMessageDiscriminant :: RenderScrollbars ) ) ,
5663 MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: UpdateDocumentLayerStructure ) ,
57- MessageDiscriminant :: Frontend ( FrontendMessageDiscriminant :: TriggerFontLoad ) ,
5864] ;
5965const DEBUG_MESSAGE_BLOCK_LIST : & [ MessageDiscriminant ] = & [
6066 MessageDiscriminant :: Broadcast ( BroadcastMessageDiscriminant :: TriggerEvent ( EventMessageDiscriminant :: AnimationFrame ) ) ,
@@ -105,6 +111,19 @@ impl Dispatcher {
105111
106112 while let Some ( message) = self . message_queues . last_mut ( ) . and_then ( VecDeque :: pop_front) {
107113 // Skip processing of this message if it will be processed later (at the end of the shallowest level queue)
114+ if FRONTEND_UPDATE_MESSAGES . contains ( & message. to_discriminant ( ) ) {
115+ let already_in_queue = self . message_queues . first ( ) . is_some_and ( |queue| queue. contains ( & message) ) ;
116+ if already_in_queue {
117+ self . cleanup_queues ( false ) ;
118+ continue ;
119+ } else if self . message_queues . len ( ) > 1 {
120+ if !self . frontend_update_messages . contains ( & message) {
121+ self . frontend_update_messages . push ( message) ;
122+ }
123+ self . cleanup_queues ( false ) ;
124+ continue ;
125+ }
126+ }
108127 if SIDE_EFFECT_FREE_MESSAGES . contains ( & message. to_discriminant ( ) ) {
109128 let already_in_queue = self . message_queues . first ( ) . filter ( |queue| queue. contains ( & message) ) . is_some ( ) ;
110129 if already_in_queue {
@@ -128,6 +147,9 @@ impl Dispatcher {
128147 // Process the action by forwarding it to the relevant message handler, or saving the FrontendMessage to be sent to the frontend
129148 match message {
130149 Message :: Animation ( message) => {
150+ if let AnimationMessage :: IncrementFrameCounter = & message {
151+ self . message_queues [ 0 ] . extend ( self . frontend_update_messages . drain ( ..) ) ;
152+ }
131153 self . message_handlers . animation_message_handler . process_message ( message, & mut queue, ( ) ) ;
132154 }
133155 Message :: AppWindow ( message) => {
0 commit comments