aboutsummaryrefslogtreecommitdiff
path: root/src/app/runtime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/runtime.rs')
-rw-r--r--src/app/runtime.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/app/runtime.rs b/src/app/runtime.rs
index 83ca2ea6..88081743 100644
--- a/src/app/runtime.rs
+++ b/src/app/runtime.rs
@@ -62,7 +62,8 @@ impl App {
msg: crate::api::ApiRequestMessage,
) -> bool {
let previous_mode = self.state.mode;
- let mut changed = crate::api::request_changes_ui(&msg.request);
+ let mut changed = self.expire_due_metadata(Instant::now());
+ changed |= crate::api::request_changes_ui(&msg.request);
let skip_default_workspace = matches!(
&msg.request.method,
crate::api::schema::Method::ServerStop(_)
@@ -288,18 +289,7 @@ impl App {
self.start_background_session_save();
}
- if let Some(deadline) = self
- .agent_metadata_deadline
- .filter(|deadline| now >= *deadline)
- {
- let previous_toast = self.state.toast.clone();
- for update in self.state.expire_agent_metadata_at(deadline, now) {
- self.refresh_new_herdr_toast_context_for_update(&update, &previous_toast);
- self.emit_pane_state_update(&update);
- }
- self.sync_agent_metadata_deadline();
- changed = true;
- }
+ changed |= self.expire_due_metadata(now);
if geometry_dirty || resized {
self.pending_agent_resume_deadline = None;
@@ -337,6 +327,33 @@ impl App {
self.agent_metadata_deadline = self.state.next_agent_metadata_expiry();
}
+ pub(crate) fn expire_due_metadata(&mut self, now: Instant) -> bool {
+ let Some(deadline) = self
+ .agent_metadata_deadline
+ .filter(|deadline| now >= *deadline)
+ else {
+ return false;
+ };
+ self.expire_metadata_at(deadline, now);
+ true
+ }
+
+ pub(crate) fn expire_metadata_at(&mut self, deadline: Instant, now: Instant) {
+ let previous_toast = self.state.toast.clone();
+ for update in self.state.expire_agent_metadata_at(deadline, now) {
+ self.refresh_new_herdr_toast_context_for_update(&update, &previous_toast);
+ self.emit_pane_state_update(&update);
+ }
+ let (panes, workspaces) = self.state.expire_metadata_tokens(now);
+ for (ws_idx, pane_id) in panes {
+ self.emit_pane_updated(ws_idx, pane_id);
+ }
+ for ws_idx in workspaces {
+ self.emit_workspace_token_updated(ws_idx);
+ }
+ self.sync_agent_metadata_deadline();
+ }
+
pub(crate) fn sync_animation_timer(&mut self, now: Instant) {
self.sync_animation_timer_with_interval(now, ANIMATION_INTERVAL);
}