Merge pull request #86 from tomaka/fix-win32

Fix win32
This commit is contained in:
tomaka 2016-11-05 14:01:02 +01:00 committed by GitHub
commit 97da37ef04
2 changed files with 25 additions and 5 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "winit" name = "winit"
version = "0.5.4" version = "0.5.5"
authors = ["The winit contributors, Pierre Krieger <pierre.krieger1708@gmail.com>"] authors = ["The winit contributors, Pierre Krieger <pierre.krieger1708@gmail.com>"]
description = "Cross-platform window creation library." description = "Cross-platform window creation library."
keywords = ["windowing"] keywords = ["windowing"]

View file

@ -126,16 +126,30 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT,
winapi::WM_MOUSEMOVE => { winapi::WM_MOUSEMOVE => {
use events::Event::{MouseEntered, MouseMoved}; use events::Event::{MouseEntered, MouseMoved};
CONTEXT_STASH.with(|context_stash| { let mouse_outside_window = CONTEXT_STASH.with(|context_stash| {
let mut context_stash = context_stash.borrow_mut(); let mut context_stash = context_stash.borrow_mut();
if let Some(context_stash) = context_stash.as_mut() { if let Some(context_stash) = context_stash.as_mut() {
if !context_stash.mouse_in_window { if !context_stash.mouse_in_window {
send_event(window, MouseEntered);
context_stash.mouse_in_window = true; context_stash.mouse_in_window = true;
return true;
} }
} }
false
}); });
if mouse_outside_window {
send_event(window, MouseEntered);
// Calling TrackMouseEvent in order to receive mouse leave events.
user32::TrackMouseEvent(&mut winapi::TRACKMOUSEEVENT {
cbSize: mem::size_of::<winapi::TRACKMOUSEEVENT>() as winapi::DWORD,
dwFlags: winapi::TME_LEAVE,
hwndTrack: window,
dwHoverTime: winapi::HOVER_DEFAULT,
});
}
let x = winapi::GET_X_LPARAM(lparam) as i32; let x = winapi::GET_X_LPARAM(lparam) as i32;
let y = winapi::GET_Y_LPARAM(lparam) as i32; let y = winapi::GET_Y_LPARAM(lparam) as i32;
@ -146,16 +160,22 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT,
winapi::WM_MOUSELEAVE => { winapi::WM_MOUSELEAVE => {
use events::Event::MouseLeft; use events::Event::MouseLeft;
CONTEXT_STASH.with(|context_stash| { let mouse_in_window = CONTEXT_STASH.with(|context_stash| {
let mut context_stash = context_stash.borrow_mut(); let mut context_stash = context_stash.borrow_mut();
if let Some(context_stash) = context_stash.as_mut() { if let Some(context_stash) = context_stash.as_mut() {
if context_stash.mouse_in_window { if context_stash.mouse_in_window {
send_event(window, MouseLeft);
context_stash.mouse_in_window = false; context_stash.mouse_in_window = false;
return true;
} }
} }
false
}); });
if mouse_in_window {
send_event(window, MouseLeft);
}
0 0
}, },