Emit event threaded
This commit is contained in:
@@ -2,6 +2,7 @@ use std::sync::Arc;
|
||||
|
||||
use osui::prelude::*;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct KeyPress;
|
||||
|
||||
impl Event for KeyPress {
|
||||
@@ -18,7 +19,7 @@ fn main() {
|
||||
let cx = cx.clone();
|
||||
move || loop {
|
||||
crossterm::event::read().unwrap();
|
||||
cx.event(&KeyPress);
|
||||
cx.emit_event_threaded(&KeyPress);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+18
-2
@@ -63,10 +63,26 @@ impl Context {
|
||||
)));
|
||||
}
|
||||
|
||||
pub fn event<E: Event + 'static>(self: &Arc<Context>, event: &E) {
|
||||
pub fn emit_event<E: Event + 'static>(self: &Arc<Context>, event: &E) {
|
||||
if let Some(v) = self.event_handlers.lock().unwrap().get(&TypeId::of::<E>()) {
|
||||
for i in v {
|
||||
(i.lock().unwrap())(&self.clone(), event);
|
||||
(i.lock().unwrap())(self, event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn emit_event_threaded<E: Event + Send + Sync + Clone + 'static>(
|
||||
self: &Arc<Context>,
|
||||
event: &E,
|
||||
) {
|
||||
if let Some(v) = self.event_handlers.lock().unwrap().get(&TypeId::of::<E>()) {
|
||||
for i in v {
|
||||
let i = i.clone();
|
||||
let event = event.clone();
|
||||
let s = self.clone();
|
||||
std::thread::spawn(move || {
|
||||
(i.lock().unwrap())(&s, &event);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user