Rebuilt from the exact zed-industries/zed @ 8c74db00c4053d6c0a9037863d7bd048658da4ca tree (previous orphan was based on a stale/wrong fetch). Same 3-file patch: - serial.rs: add SerialKind::KeyboardEnter - client.rs: store wl_keyboard.enter serial; add latest_serial_of() - window.rs: activate() uses keyboard-enter serial (Mutter focus gate) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
68 lines
1.7 KiB
Rust
68 lines
1.7 KiB
Rust
use crate::{Edit, Patch};
|
|
use parking_lot::Mutex;
|
|
use std::{
|
|
mem,
|
|
sync::{Arc, Weak},
|
|
};
|
|
|
|
#[derive(Default)]
|
|
pub struct Topic<T>(Mutex<Vec<Weak<Mutex<Patch<T>>>>>);
|
|
|
|
pub struct Subscription<T>(Arc<Mutex<Patch<T>>>);
|
|
|
|
impl<T: Default, TDelta> Topic<T>
|
|
where
|
|
T: 'static
|
|
+ Copy
|
|
+ Ord
|
|
+ std::ops::Sub<T, Output = TDelta>
|
|
+ std::ops::Add<TDelta, Output = T>
|
|
+ std::ops::AddAssign<TDelta>
|
|
+ Default,
|
|
TDelta: Ord + Copy,
|
|
{
|
|
pub fn subscribe(&mut self) -> Subscription<T> {
|
|
let subscription = Subscription(Default::default());
|
|
self.0.get_mut().push(Arc::downgrade(&subscription.0));
|
|
subscription
|
|
}
|
|
|
|
pub fn publish(&self, edits: impl Clone + IntoIterator<Item = Edit<T>>) {
|
|
publish(&mut self.0.lock(), edits);
|
|
}
|
|
|
|
pub fn publish_mut(&mut self, edits: impl Clone + IntoIterator<Item = Edit<T>>) {
|
|
publish(self.0.get_mut(), edits);
|
|
}
|
|
}
|
|
|
|
impl<T: Default> Subscription<T> {
|
|
pub fn consume(&self) -> Patch<T> {
|
|
mem::take(&mut *self.0.lock())
|
|
}
|
|
}
|
|
|
|
fn publish<T, TDelta>(
|
|
subscriptions: &mut Vec<Weak<Mutex<Patch<T>>>>,
|
|
edits: impl Clone + IntoIterator<Item = Edit<T>>,
|
|
) where
|
|
T: 'static
|
|
+ Copy
|
|
+ Ord
|
|
+ std::ops::Sub<T, Output = TDelta>
|
|
+ std::ops::Add<TDelta, Output = T>
|
|
+ std::ops::AddAssign<TDelta>
|
|
+ Default,
|
|
TDelta: Ord + Copy,
|
|
{
|
|
subscriptions.retain(|subscription| {
|
|
if let Some(subscription) = subscription.upgrade() {
|
|
let mut patch = subscription.lock();
|
|
*patch = patch.compose(edits.clone());
|
|
true
|
|
} else {
|
|
false
|
|
}
|
|
});
|
|
}
|