From 1e615b59a6e9685ec283b290eb337faab888f262 Mon Sep 17 00:00:00 2001 From: Tomaka17 Date: Sun, 27 Jul 2014 19:58:27 +0200 Subject: Better events handling for win32 --- src/win32/ffi.rs | 3 +++ src/win32/mod.rs | 39 ++++++++------------------------------- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/win32/ffi.rs b/src/win32/ffi.rs index 0b47de8..96f09d4 100644 --- a/src/win32/ffi.rs +++ b/src/win32/ffi.rs @@ -564,6 +564,9 @@ extern "system" { // http://msdn.microsoft.com/en-us/library/dd145167(v=vs.85).aspx pub fn UpdateWindow(hWnd: HWND) -> BOOL; + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644956(v=vs.85).aspx + pub fn WaitMessage() -> BOOL; + // http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379(v=vs.85).aspx pub fn wglCreateContext(hdc: HDC) -> HGLRC; diff --git a/src/win32/mod.rs b/src/win32/mod.rs index 959e141..be6014e 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -204,7 +204,7 @@ impl Window { loop { let mut msg = unsafe { mem::uninitialized() }; - if unsafe { ffi::PeekMessageW(&mut msg, ptr::mut_null(), 0, 0, 1) } == 0 { + if unsafe { ffi::PeekMessageW(&mut msg, ptr::mut_null(), 0, 0, 0x1) } == 0 { break } @@ -219,38 +219,21 @@ impl Window { Err(_) => break } } + + if events.iter().find(|e| match e { &&::Closed => true, _ => false }).is_some() { + use std::sync::atomics::Relaxed; + self.should_close.store(true, Relaxed); + } events } // TODO: return iterator pub fn wait_events(&self) -> Vec { - 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::WaitMessage() }; - 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 - } - } - + let events = self.poll_events(); if events.len() >= 1 { return events } @@ -316,12 +299,6 @@ extern "stdcall" fn callback(window: ffi::HWND, msg: ffi::UINT, 0 }, - ffi::WM_PAINT => { - /*use NeedRefresh; - send_event(window, NeedRefresh);*/ - 0 - }, - ffi::WM_CHAR => { use std::mem; use events::ReceivedCharacter; -- cgit v1.2.3