From 712b27086f0205d1ce0cb41cfde80c2e16d5ce0b Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Sat, 5 Nov 2016 13:44:23 +0100 Subject: [PATCH] Fix win32 panicking all the time and make events work --- src/platform/windows/callback.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/platform/windows/callback.rs b/src/platform/windows/callback.rs index 26e1e95e..00296a6a 100644 --- a/src/platform/windows/callback.rs +++ b/src/platform/windows/callback.rs @@ -126,16 +126,30 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT, winapi::WM_MOUSEMOVE => { 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(); if let Some(context_stash) = context_stash.as_mut() { if !context_stash.mouse_in_window { - send_event(window, MouseEntered); 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::() as winapi::DWORD, + dwFlags: winapi::TME_LEAVE, + hwndTrack: window, + dwHoverTime: winapi::HOVER_DEFAULT, + }); + } + let x = winapi::GET_X_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 => { 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(); if let Some(context_stash) = context_stash.as_mut() { if context_stash.mouse_in_window { - send_event(window, MouseLeft); context_stash.mouse_in_window = false; + return true; } } + + false }); + if mouse_in_window { + send_event(window, MouseLeft); + } + 0 },