diff options
| -rw-r--r-- | src/win32/ffi.rs | 4 | ||||
| -rw-r--r-- | src/win32/mod.rs | 52 | 
2 files changed, 43 insertions, 13 deletions
| diff --git a/src/win32/ffi.rs b/src/win32/ffi.rs index 63afef4..5051c46 100644 --- a/src/win32/ffi.rs +++ b/src/win32/ffi.rs @@ -381,6 +381,10 @@ extern "system" {      // http://msdn.microsoft.com/en-us/library/windows/desktop/aa366730(v=vs.85).aspx      pub fn LocalFree(hMem: HLOCAL) -> HLOCAL; +    // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx +    pub fn PeekMessageW(lpMsg: *mut MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, +        wRemoveMsg: UINT) -> BOOL; +      // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644945(v=vs.85).aspx      pub fn PostQuitMessage(nExitCode: libc::c_int); diff --git a/src/win32/mod.rs b/src/win32/mod.rs index a1bda6f..a13aa74 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -198,22 +198,13 @@ impl Window {      // TODO: return iterator      pub fn poll_events(&self) -> Vec<Event> { -        unimplemented!() -    } - -    // TODO: return iterator -    pub fn wait_events(&self) -> Vec<Event> {          use std::mem; -        { +        loop {              let mut msg = unsafe { mem::uninitialized() }; -            if unsafe { ffi::GetMessageW(&mut msg, ptr::mut_null(), 0, 0) } == 0 { -                use std::sync::atomics::Relaxed; -                use Closed; - -                self.should_close.store(true, Relaxed); -                return vec![Closed] +            if unsafe { ffi::PeekMessageW(&mut msg, ptr::mut_null(), 0, 0, 1) } == 0 { +                break              }              unsafe { ffi::TranslateMessage(&msg) }; @@ -227,9 +218,44 @@ impl Window {                  Err(_) => break              }          } +                  events      } +    // TODO: return iterator +    pub fn wait_events(&self) -> Vec<Event> { +        use std::mem; + +        loop { +            { +                let mut msg = unsafe { mem::uninitialized() }; + +                if unsafe { ffi::GetMessageW(&mut msg, ptr::mut_null(), 0, 0) } == 0 { +                    use std::sync::atomics::Relaxed; +                    use Closed; + +                    self.should_close.store(true, Relaxed); +                    return vec![Closed] +                } + +                unsafe { ffi::TranslateMessage(&msg) }; +                unsafe { ffi::DispatchMessageW(&msg) }; +            } + +            let mut events = Vec::new(); +            loop { +                match self.events_receiver.try_recv() { +                    Ok(ev) => events.push(ev), +                    Err(_) => break +                } +            } +             +            if events.len() >= 1 { +                return events +            } +        } +    } +      pub fn make_current(&self) {          unsafe { ffi::wglMakeCurrent(self.hdc, self.context) }      } @@ -276,8 +302,8 @@ extern "stdcall" fn callback(window: ffi::HWND, msg: ffi::UINT,      match msg {          ffi::WM_DESTROY => {              use Closed; -            send_event(window, Closed);              unsafe { ffi::PostQuitMessage(0); } +            send_event(window, Closed);              0          }, | 
