|
|
@@ -342,11 +342,8 @@ pub enum GraphicsMethod {
|
|
|
pub type GraphicsEventPublisherPtr = Arc<GraphicsEventPublisher>;
|
|
|
|
|
|
pub struct GraphicsEventPublisher {
|
|
|
- lock_key_down: SyncMutex<Option<SubscriptionId>>,
|
|
|
- key_down: PublisherPtr<(KeyCode, KeyMods, bool)>,
|
|
|
-
|
|
|
- lock_key_up: SyncMutex<Option<SubscriptionId>>,
|
|
|
- key_up: PublisherPtr<(KeyCode, KeyMods)>,
|
|
|
+ lock_resize: SyncMutex<Option<SubscriptionId>>,
|
|
|
+ resize: PublisherPtr<(f32, f32)>,
|
|
|
|
|
|
lock_mouse_move: SyncMutex<Option<SubscriptionId>>,
|
|
|
mouse_move: PublisherPtr<(f32, f32)>,
|
|
|
@@ -360,21 +357,24 @@ pub struct GraphicsEventPublisher {
|
|
|
lock_mouse_btn_up: SyncMutex<Option<SubscriptionId>>,
|
|
|
mouse_btn_up: PublisherPtr<(MouseButton, f32, f32)>,
|
|
|
|
|
|
- lock_resize: SyncMutex<Option<SubscriptionId>>,
|
|
|
- resize: PublisherPtr<(f32, f32)>,
|
|
|
-
|
|
|
lock_char: SyncMutex<Option<SubscriptionId>>,
|
|
|
chr: PublisherPtr<(char, KeyMods, bool)>,
|
|
|
+
|
|
|
+ lock_key_down: SyncMutex<Option<SubscriptionId>>,
|
|
|
+ key_down: PublisherPtr<(KeyCode, KeyMods, bool)>,
|
|
|
+
|
|
|
+ lock_key_up: SyncMutex<Option<SubscriptionId>>,
|
|
|
+ key_up: PublisherPtr<(KeyCode, KeyMods)>,
|
|
|
+
|
|
|
+ lock_touch: SyncMutex<Option<SubscriptionId>>,
|
|
|
+ touch: PublisherPtr<(TouchPhase, u64, f32, f32)>,
|
|
|
}
|
|
|
|
|
|
impl GraphicsEventPublisher {
|
|
|
pub fn new() -> Arc<Self> {
|
|
|
Arc::new(Self {
|
|
|
- lock_key_down: SyncMutex::new(None),
|
|
|
- key_down: Publisher::new(),
|
|
|
-
|
|
|
- lock_key_up: SyncMutex::new(None),
|
|
|
- key_up: Publisher::new(),
|
|
|
+ lock_resize: SyncMutex::new(None),
|
|
|
+ resize: Publisher::new(),
|
|
|
|
|
|
lock_mouse_move: SyncMutex::new(None),
|
|
|
mouse_move: Publisher::new(),
|
|
|
@@ -388,26 +388,25 @@ impl GraphicsEventPublisher {
|
|
|
lock_mouse_btn_up: SyncMutex::new(None),
|
|
|
mouse_btn_up: Publisher::new(),
|
|
|
|
|
|
- lock_resize: SyncMutex::new(None),
|
|
|
- resize: Publisher::new(),
|
|
|
-
|
|
|
lock_char: SyncMutex::new(None),
|
|
|
chr: Publisher::new(),
|
|
|
- })
|
|
|
- }
|
|
|
|
|
|
- fn lock_key_down(&self, sub_id: SubscriptionId) {
|
|
|
- *self.lock_key_down.lock().unwrap() = Some(sub_id);
|
|
|
- }
|
|
|
- fn unlock_key_down(&self) {
|
|
|
- *self.lock_key_down.lock().unwrap() = None;
|
|
|
+ lock_key_down: SyncMutex::new(None),
|
|
|
+ key_down: Publisher::new(),
|
|
|
+
|
|
|
+ lock_key_up: SyncMutex::new(None),
|
|
|
+ key_up: Publisher::new(),
|
|
|
+
|
|
|
+ lock_touch: SyncMutex::new(None),
|
|
|
+ touch: Publisher::new(),
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
- fn lock_key_up(&self, sub_id: SubscriptionId) {
|
|
|
- *self.lock_key_up.lock().unwrap() = Some(sub_id);
|
|
|
+ fn lock_resize(&self, sub_id: SubscriptionId) {
|
|
|
+ *self.lock_resize.lock().unwrap() = Some(sub_id);
|
|
|
}
|
|
|
- fn unlock_key_up(&self) {
|
|
|
- *self.lock_key_up.lock().unwrap() = None;
|
|
|
+ fn unlock_resize(&self) {
|
|
|
+ *self.lock_resize.lock().unwrap() = None;
|
|
|
}
|
|
|
|
|
|
fn lock_mouse_move(&self, sub_id: SubscriptionId) {
|
|
|
@@ -438,13 +437,6 @@ impl GraphicsEventPublisher {
|
|
|
*self.lock_mouse_btn_up.lock().unwrap() = None;
|
|
|
}
|
|
|
|
|
|
- fn lock_resize(&self, sub_id: SubscriptionId) {
|
|
|
- *self.lock_resize.lock().unwrap() = Some(sub_id);
|
|
|
- }
|
|
|
- fn unlock_resize(&self) {
|
|
|
- *self.lock_resize.lock().unwrap() = None;
|
|
|
- }
|
|
|
-
|
|
|
fn lock_char(&self, sub_id: SubscriptionId) {
|
|
|
*self.lock_char.lock().unwrap() = Some(sub_id);
|
|
|
}
|
|
|
@@ -452,24 +444,35 @@ impl GraphicsEventPublisher {
|
|
|
*self.lock_char.lock().unwrap() = None;
|
|
|
}
|
|
|
|
|
|
- fn notify_key_down(&self, key: KeyCode, mods: KeyMods, repeat: bool) {
|
|
|
- let ev = (key, mods, repeat);
|
|
|
+ fn lock_key_down(&self, sub_id: SubscriptionId) {
|
|
|
+ *self.lock_key_down.lock().unwrap() = Some(sub_id);
|
|
|
+ }
|
|
|
+ fn unlock_key_down(&self) {
|
|
|
+ *self.lock_key_down.lock().unwrap() = None;
|
|
|
+ }
|
|
|
|
|
|
- let locked = self.lock_key_down.lock().unwrap().clone();
|
|
|
- if let Some(locked) = locked {
|
|
|
- self.key_down.notify_with_include(ev, &[locked]);
|
|
|
- } else {
|
|
|
- self.key_down.notify(ev);
|
|
|
- }
|
|
|
+ fn lock_key_up(&self, sub_id: SubscriptionId) {
|
|
|
+ *self.lock_key_up.lock().unwrap() = Some(sub_id);
|
|
|
+ }
|
|
|
+ fn unlock_key_up(&self) {
|
|
|
+ *self.lock_key_up.lock().unwrap() = None;
|
|
|
}
|
|
|
- fn notify_key_up(&self, key: KeyCode, mods: KeyMods) {
|
|
|
- let ev = (key, mods);
|
|
|
|
|
|
- let locked = self.lock_key_up.lock().unwrap().clone();
|
|
|
+ fn lock_touch(&self, sub_id: SubscriptionId) {
|
|
|
+ *self.lock_touch.lock().unwrap() = Some(sub_id);
|
|
|
+ }
|
|
|
+ fn unlock_touch(&self) {
|
|
|
+ *self.lock_touch.lock().unwrap() = None;
|
|
|
+ }
|
|
|
+
|
|
|
+ fn notify_resize(&self, w: f32, h: f32) {
|
|
|
+ let ev = (w, h);
|
|
|
+
|
|
|
+ let locked = self.lock_resize.lock().unwrap().clone();
|
|
|
if let Some(locked) = locked {
|
|
|
- self.key_up.notify_with_include(ev, &[locked]);
|
|
|
+ self.resize.notify_with_include(ev, &[locked]);
|
|
|
} else {
|
|
|
- self.key_up.notify(ev);
|
|
|
+ self.resize.notify(ev);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -483,7 +486,6 @@ impl GraphicsEventPublisher {
|
|
|
self.mouse_move.notify(ev);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
fn notify_mouse_wheel(&self, x: f32, y: f32) {
|
|
|
let ev = (x, y);
|
|
|
|
|
|
@@ -494,7 +496,6 @@ impl GraphicsEventPublisher {
|
|
|
self.mouse_wheel.notify(ev);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
fn notify_mouse_btn_down(&self, button: MouseButton, x: f32, y: f32) {
|
|
|
let ev = (button, x, y);
|
|
|
|
|
|
@@ -505,7 +506,6 @@ impl GraphicsEventPublisher {
|
|
|
self.mouse_btn_down.notify(ev);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
fn notify_mouse_btn_up(&self, button: MouseButton, x: f32, y: f32) {
|
|
|
let ev = (button, x, y);
|
|
|
|
|
|
@@ -517,16 +517,6 @@ impl GraphicsEventPublisher {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- fn notify_resize(&self, w: f32, h: f32) {
|
|
|
- let ev = (w, h);
|
|
|
-
|
|
|
- let locked = self.lock_resize.lock().unwrap().clone();
|
|
|
- if let Some(locked) = locked {
|
|
|
- self.resize.notify_with_include(ev, &[locked]);
|
|
|
- } else {
|
|
|
- self.resize.notify(ev);
|
|
|
- }
|
|
|
- }
|
|
|
fn notify_char(&self, chr: char, mods: KeyMods, repeat: bool) {
|
|
|
let ev = (chr, mods, repeat);
|
|
|
|
|
|
@@ -538,11 +528,40 @@ impl GraphicsEventPublisher {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- pub fn subscribe_key_down(&self) -> Subscription<(KeyCode, KeyMods, bool)> {
|
|
|
- self.key_down.clone().subscribe()
|
|
|
+ fn notify_key_down(&self, key: KeyCode, mods: KeyMods, repeat: bool) {
|
|
|
+ let ev = (key, mods, repeat);
|
|
|
+
|
|
|
+ let locked = self.lock_key_down.lock().unwrap().clone();
|
|
|
+ if let Some(locked) = locked {
|
|
|
+ self.key_down.notify_with_include(ev, &[locked]);
|
|
|
+ } else {
|
|
|
+ self.key_down.notify(ev);
|
|
|
+ }
|
|
|
}
|
|
|
- pub fn subscribe_key_up(&self) -> Subscription<(KeyCode, KeyMods)> {
|
|
|
- self.key_up.clone().subscribe()
|
|
|
+ fn notify_key_up(&self, key: KeyCode, mods: KeyMods) {
|
|
|
+ let ev = (key, mods);
|
|
|
+
|
|
|
+ let locked = self.lock_key_up.lock().unwrap().clone();
|
|
|
+ if let Some(locked) = locked {
|
|
|
+ self.key_up.notify_with_include(ev, &[locked]);
|
|
|
+ } else {
|
|
|
+ self.key_up.notify(ev);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fn notify_touch(&self, phase: TouchPhase, id: u64, x: f32, y: f32) {
|
|
|
+ let ev = (phase, id, x, y);
|
|
|
+
|
|
|
+ let locked = self.lock_touch.lock().unwrap().clone();
|
|
|
+ if let Some(locked) = locked {
|
|
|
+ self.touch.notify_with_include(ev, &[locked]);
|
|
|
+ } else {
|
|
|
+ self.touch.notify(ev);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn subscribe_resize(&self) -> Subscription<(f32, f32)> {
|
|
|
+ self.resize.clone().subscribe()
|
|
|
}
|
|
|
pub fn subscribe_mouse_move(&self) -> Subscription<(f32, f32)> {
|
|
|
self.mouse_move.clone().subscribe()
|
|
|
@@ -556,12 +575,18 @@ impl GraphicsEventPublisher {
|
|
|
pub fn subscribe_mouse_btn_up(&self) -> Subscription<(MouseButton, f32, f32)> {
|
|
|
self.mouse_btn_up.clone().subscribe()
|
|
|
}
|
|
|
- pub fn subscribe_resize(&self) -> Subscription<(f32, f32)> {
|
|
|
- self.resize.clone().subscribe()
|
|
|
- }
|
|
|
pub fn subscribe_char(&self) -> Subscription<(char, KeyMods, bool)> {
|
|
|
self.chr.clone().subscribe()
|
|
|
}
|
|
|
+ pub fn subscribe_key_down(&self) -> Subscription<(KeyCode, KeyMods, bool)> {
|
|
|
+ self.key_down.clone().subscribe()
|
|
|
+ }
|
|
|
+ pub fn subscribe_key_up(&self) -> Subscription<(KeyCode, KeyMods)> {
|
|
|
+ self.key_up.clone().subscribe()
|
|
|
+ }
|
|
|
+ pub fn subscribe_touch(&self) -> Subscription<(TouchPhase, u64, f32, f32)> {
|
|
|
+ self.touch.clone().subscribe()
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
struct Stage {
|
|
|
@@ -795,8 +820,9 @@ impl EventHandler for Stage {
|
|
|
self.event_pub.notify_key_up(keycode, mods);
|
|
|
}
|
|
|
|
|
|
+ /// The id corresponds to multi-touch. Multiple touch events have different ids.
|
|
|
fn touch_event(&mut self, phase: TouchPhase, id: u64, x: f32, y: f32) {
|
|
|
- debug!(target: "gfx", "touch_event({:?}, {}, {}, {})", phase, id, x, y);
|
|
|
+ self.event_pub.notify_touch(phase, id, x, y);
|
|
|
}
|
|
|
|
|
|
fn quit_requested_event(&mut self) {
|