mirror of
https://github.com/rust-windowing/winit.git
synced 2026-09-02 06:40:06 -04:00
Attempt to update api_transition to addition of EventsLoopProxy
This commit is contained in:
@@ -10,6 +10,11 @@ macro_rules! gen_api_transition {
|
|||||||
pub struct EventsLoop {
|
pub struct EventsLoop {
|
||||||
windows: ::std::sync::Mutex<Vec<::std::sync::Arc<Window>>>,
|
windows: ::std::sync::Mutex<Vec<::std::sync::Arc<Window>>>,
|
||||||
interrupted: ::std::sync::atomic::AtomicBool,
|
interrupted: ::std::sync::atomic::AtomicBool,
|
||||||
|
awakened: ::std::sync::Arc<::std::sync::atomic::AtomicBool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct EventsLoopProxy {
|
||||||
|
awakened: ::std::sync::Weak<::std::sync::atomic::AtomicBool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventsLoop {
|
impl EventsLoop {
|
||||||
@@ -17,6 +22,7 @@ macro_rules! gen_api_transition {
|
|||||||
EventsLoop {
|
EventsLoop {
|
||||||
windows: ::std::sync::Mutex::new(vec![]),
|
windows: ::std::sync::Mutex::new(vec![]),
|
||||||
interrupted: ::std::sync::atomic::AtomicBool::new(false),
|
interrupted: ::std::sync::atomic::AtomicBool::new(false),
|
||||||
|
awakened: ::std::sync::Arc::new(::std::sync::atomic::AtomicBool::new(false)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,6 +33,11 @@ macro_rules! gen_api_transition {
|
|||||||
pub fn poll_events<F>(&self, mut callback: F)
|
pub fn poll_events<F>(&self, mut callback: F)
|
||||||
where F: FnMut(::Event)
|
where F: FnMut(::Event)
|
||||||
{
|
{
|
||||||
|
if self.awakened.load(::std::sync::atomic::Ordering::Relaxed) {
|
||||||
|
self.awakened.store(false, ::std::sync::atomic::Ordering::Relaxed);
|
||||||
|
callback(::Event::Awakened);
|
||||||
|
}
|
||||||
|
|
||||||
let mut windows = self.windows.lock().unwrap();
|
let mut windows = self.windows.lock().unwrap();
|
||||||
for window in windows.iter() {
|
for window in windows.iter() {
|
||||||
for event in window.poll_events() {
|
for event in window.poll_events() {
|
||||||
@@ -42,6 +53,7 @@ macro_rules! gen_api_transition {
|
|||||||
where F: FnMut(::Event)
|
where F: FnMut(::Event)
|
||||||
{
|
{
|
||||||
self.interrupted.store(false, ::std::sync::atomic::Ordering::Relaxed);
|
self.interrupted.store(false, ::std::sync::atomic::Ordering::Relaxed);
|
||||||
|
self.awakened.store(false, ::std::sync::atomic::Ordering::Relaxed);
|
||||||
|
|
||||||
// Yeah that's a very bad implementation.
|
// Yeah that's a very bad implementation.
|
||||||
loop {
|
loop {
|
||||||
@@ -52,6 +64,24 @@ macro_rules! gen_api_transition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_proxy(&self) -> EventsLoopProxy {
|
||||||
|
EventsLoopProxy {
|
||||||
|
awakened: ::std::sync::Arc::downgrade(&self.awakened),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EventsLoopProxy {
|
||||||
|
pub fn wakeup(&self) -> Result<(), ::EventsLoopClosed> {
|
||||||
|
match self.awakened.upgrade() {
|
||||||
|
None => Err(::EventsLoopClosed),
|
||||||
|
Some(awakened) => {
|
||||||
|
awakened.store(true, ::std::sync::atomic::Ordering::Relaxed);
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
|||||||
Reference in New Issue
Block a user