logiguard fork v2: patched GPUI on verified 8c74db0 tree
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>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user