Merge remote-tracking branch 'origin/main' into haiky
# Conflicts: # crates/maestro-daemon/src/session.rs # crates/maestro-protocol/src/lib.rs # crates/maestro-protocol/src/routes.rs
This commit is contained in:
@@ -76,6 +76,15 @@ pub struct SessionRecord {
|
||||
/// Daemon-local bookkeeping; never rides the wire.
|
||||
#[cfg(feature = "haiku-autoname")]
|
||||
pub naming: bool,
|
||||
/// When a client's pane last became the one showing this session
|
||||
/// (`POST /.../focus`), `None` while unfocused. Daemon-local; never rides
|
||||
/// the wire.
|
||||
pub focused_since: Option<std::time::Instant>,
|
||||
/// Sticky acknowledgement applied by [`crate::activity::apply_focus_suppression`]:
|
||||
/// once the pane has been focused long enough to clear an `AwaitingInput`
|
||||
/// glow, this holds through focus loss until the session does new work.
|
||||
/// Daemon-local; never rides the wire.
|
||||
pub awaiting_suppressed: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
@@ -465,6 +474,8 @@ impl SessionManager {
|
||||
settled: false,
|
||||
#[cfg(feature = "haiku-autoname")]
|
||||
naming: false,
|
||||
focused_since: None,
|
||||
awaiting_suppressed: false,
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -670,6 +681,8 @@ impl SessionManager {
|
||||
settled: false,
|
||||
#[cfg(feature = "haiku-autoname")]
|
||||
naming: false,
|
||||
focused_since: None,
|
||||
awaiting_suppressed: false,
|
||||
},
|
||||
);
|
||||
let _ = self
|
||||
@@ -821,6 +834,17 @@ impl SessionManager {
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Record whether a client's pane is currently showing `id`. Read by the
|
||||
/// activity pass's next tick to decide whether an `AwaitingInput` glow
|
||||
/// has been looked at long enough to clear (`apply_focus_suppression`).
|
||||
/// An unknown session is [`SessionError::NotFound`].
|
||||
pub async fn set_focused(&self, id: Uuid, focused: bool) -> Result<(), SessionError> {
|
||||
let mut sessions = self.inner.sessions.lock().await;
|
||||
let rec = sessions.get_mut(&id).ok_or(SessionError::NotFound(id))?;
|
||||
rec.focused_since = focused.then(std::time::Instant::now);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "haiku-autoname")]
|
||||
@@ -1062,10 +1086,19 @@ async fn run_activity_pass(inner: &Arc<Inner>) {
|
||||
// #105: while a report is in force it supplies the state and
|
||||
// nothing here may overwrite it; only an unreported session is
|
||||
// decided by inference.
|
||||
let activity = match &rec.reported_activity {
|
||||
let raw_activity = match &rec.reported_activity {
|
||||
Some(report) => report.state,
|
||||
None => crate::activity::decide(idle, awaiting),
|
||||
};
|
||||
// A pane looked at long enough clears an `AwaitingInput` glow
|
||||
// (docs/SIDEBAR.md); the acknowledgement is sticky until the
|
||||
// session does new work again.
|
||||
let activity = crate::activity::apply_focus_suppression(
|
||||
raw_activity,
|
||||
rec.focused_since,
|
||||
std::time::Instant::now(),
|
||||
&mut rec.awaiting_suppressed,
|
||||
);
|
||||
let foreground = Some(pane.command.clone());
|
||||
// The pane's live cwd, drives the dir-based session tree; empty means
|
||||
// tmux reported none.
|
||||
|
||||
Reference in New Issue
Block a user