aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/win32/ffi.rs4
-rw-r--r--src/win32/mod.rs52
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
},