From f79f21641a31da3e4039d41be89047cdcc6028f7 Mon Sep 17 00:00:00 2001 From: Kristofer Rye Date: Wed, 22 Jan 2020 09:25:27 -0600 Subject: [PATCH] macos: Fire a ModifiersChanged event on window_did_resign_key From debugging, I determined that macOS' emission of a flagsChanged around window switching is inconsistent. It is fair to assume, I think, that when the user switches windows, they do not expect their former modifiers state to remain effective; so I think it's best to clear that state by sending a ModifiersChanged(ModifiersState::empty()). Signed-off-by: Kristofer Rye --- src/platform_impl/macos/view.rs | 2 ++ src/platform_impl/macos/window_delegate.rs | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform_impl/macos/view.rs b/src/platform_impl/macos/view.rs index 789398e37..b6cbcc6fd 100644 --- a/src/platform_impl/macos/view.rs +++ b/src/platform_impl/macos/view.rs @@ -762,6 +762,8 @@ extern "C" fn flags_changed(this: &Object, _sel: Sel, event: id) { })); } + trace!("Queueing event with modifiers {:?}", state.modifiers); + AppState::queue_event(EventWrapper::StaticEvent(Event::WindowEvent { // TODO Maybe memoize get_window_id if it's safe to reuse? window_id: WindowId(get_window_id(state.ns_window)), diff --git a/src/platform_impl/macos/window_delegate.rs b/src/platform_impl/macos/window_delegate.rs index 776689378..f5c03b47a 100644 --- a/src/platform_impl/macos/window_delegate.rs +++ b/src/platform_impl/macos/window_delegate.rs @@ -16,7 +16,7 @@ use objc::{ use crate::{ dpi::LogicalSize, - event::{Event, WindowEvent}, + event::{Event, ModifiersState, WindowEvent}, platform_impl::platform::{ app_state::AppState, event::{EventProxy, EventWrapper}, @@ -319,6 +319,7 @@ extern "C" fn window_did_become_key(this: &Object, _: Sel, _: id) { extern "C" fn window_did_resign_key(this: &Object, _: Sel, _: id) { trace!("Triggered `windowDidResignKey:`"); with_state(this, |state| { + state.emit_event(WindowEvent::ModifiersChanged(ModifiersState::empty())); state.emit_event(WindowEvent::Focused(false)); }); trace!("Completed `windowDidResignKey:`");