From ce5d22f580d866374ae4897fc6aa6d331665c919 Mon Sep 17 00:00:00 2001 From: aloucks Date: Sun, 14 Apr 2019 11:48:31 -0400 Subject: [PATCH] Prevent the event loop from pausing when entering modal loop (eventloop-2.0) (#839) * Prevent the event loop from pausing after entering modal loop After clicking the window title bar or border (for a drag or resize), the event loop pauses until the mouse is moved. This change relays the WM_NCLBUTTONDOWN message to the dummy window where it queues a redraw and consumes the message. This effectively jumpstarts the modal loop and it continues to fire draw requests. * Handle WM_NCLBUTTONDOWN in public_window_callback instead of relaying. Relaying the WM_NCLBUTTONDOWN message to the modal window turned out to be unnecessary. --- src/platform_impl/windows/event_loop.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/platform_impl/windows/event_loop.rs b/src/platform_impl/windows/event_loop.rs index a820ba5d219..c5ac492c250 100644 --- a/src/platform_impl/windows/event_loop.rs +++ b/src/platform_impl/windows/event_loop.rs @@ -799,6 +799,20 @@ unsafe extern "system" fn public_window_callback( commctrl::DefSubclassProc(window, msg, wparam, lparam) }, + winuser::WM_NCLBUTTONDOWN => { + // jumpstart the modal loop + winuser::RedrawWindow( + window, + ptr::null(), + ptr::null_mut(), + winuser::RDW_INTERNALPAINT + ); + if wparam == winuser::HTCAPTION as _ { + winuser::PostMessageW(window, winuser::WM_MOUSEMOVE, 0, 0); + } + commctrl::DefSubclassProc(window, msg, wparam, lparam) + }, + winuser::WM_CLOSE => { use event::WindowEvent::CloseRequested; subclass_input.send_event(Event::WindowEvent {