pub struct DiffModeBridge { /* private fields */ }Expand description
Host-side bridge between [DiffSubsystem] session lifecycle
and the per-buffer ActiveModes set. See module docs for
the why.
Implementations§
Source§impl DiffModeBridge
impl DiffModeBridge
pub fn new() -> DiffModeBridge
Sourcepub fn note_session_opened(
&self,
session_key: BufferId,
participants: &[BufferId],
)
pub fn note_session_opened( &self, session_key: BufferId, participants: &[BufferId], )
Record that session_key opened with participants as
the user-visible diff sides. For each participant whose
refcount transitions 0 → 1, queue an Activate change.
Idempotent on re-open of the same session_key
(subsystem register_with_sources is itself idempotent
on session identity).
Sourcepub fn note_session_closed(&self, session_key: BufferId)
pub fn note_session_closed(&self, session_key: BufferId)
Record that session_key closed. For each participant
whose refcount drops to 0, queue a Deactivate change.
No-op on unknown session keys (close-before-open or
double-close from auto-drop racing the user’s
:diffoff).
Sourcepub fn note_session_extended(&self, session_key: BufferId, buf: BufferId)
pub fn note_session_extended(&self, session_key: BufferId, buf: BufferId)
D.8.d (2026-05-31): record that an existing session
gained a new participant buf. Increments the refcount +
appends buf to the session’s participant list so
subsequent Self::note_session_closed decrements
every participant including this one.
Idempotent: re-adding a buffer that’s already a
participant of session_key is a no-op (the refcount
bucket dedupes by session-key, mirroring
Self::note_session_opened).
No-op on unknown session_key — the caller has either
already torn the session down or the bridge was never
notified of the open. Defensive against races between
:diffthis (which goes through the membership API) and
drop_session (which goes through note_session_closed).
Sourcepub fn note_session_shrunk(&self, session_key: BufferId, buf: BufferId)
pub fn note_session_shrunk(&self, session_key: BufferId, buf: BufferId)
D.8.d (2026-05-31): record that a participant buf was
removed from session_key. Decrements the refcount; if
buf no longer participates in any session, queues a
Deactivate change so the dispatch tail flips
ActiveModes.diff-mode off on that buffer. Removes buf
from the session’s participant list so a subsequent
note_session_closed doesn’t double-decrement it.
No-op on unknown session_key or unknown participant.
Sourcepub fn drain_pending(&self) -> Vec<DiffModeChange>
pub fn drain_pending(&self) -> Vec<DiffModeChange>
Drain every pending change. Callers (the dispatch tail)
apply them via the mode registry, which mutates the
per-buffer ActiveModes.
Sourcepub fn refcount(&self, buffer: BufferId) -> usize
pub fn refcount(&self, buffer: BufferId) -> usize
Test-only / introspection: current refcount for
buffer. Returns 0 if no session activated diff-mode on
it.
Sourcepub fn note_conflict_state(
&self,
session_key: BufferId,
participants: &[BufferId],
has_conflicts: bool,
)
pub fn note_conflict_state( &self, session_key: BufferId, participants: &[BufferId], has_conflicts: bool, )
CR.3 (2026-06-24): reconcile diff-conflict-mode activation for
session_key against its latest sign map. has_conflicts comes
from sign_map_has_conflicts; the host calls this each cycle off
the active session’s published sign map. Idempotent on an unchanged
state (no transition → nothing queued), so per-cycle calls are
cheap. On the false → true transition it queues a Conflict
Activate for each participant (refcounted, so a buffer shared by
two conflict sessions stays active until the last clears); on
true → false it queues a Deactivate for each whose conflict
refcount hits zero.
Trait Implementations§
Source§impl Debug for DiffModeBridge
impl Debug for DiffModeBridge
Source§impl Default for DiffModeBridge
impl Default for DiffModeBridge
Source§fn default() -> DiffModeBridge
fn default() -> DiffModeBridge
Auto Trait Implementations§
impl !Freeze for DiffModeBridge
impl RefUnwindSafe for DiffModeBridge
impl Send for DiffModeBridge
impl Sync for DiffModeBridge
impl Unpin for DiffModeBridge
impl UnsafeUnpin for DiffModeBridge
impl UnwindSafe for DiffModeBridge
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more