From cc23f53da3068463c860b0ab63a11e14d37c9dde Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Mon, 13 Aug 2018 23:26:24 -0700 Subject: [PATCH 1/6] fix --- CHANGELOG.md | 2 ++ src/platform/macos/view.rs | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71eab13d30..34cefee779 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- On macOS, fix `` so applications receive the event. + # Version 0.17.1 (2018-08-05) - On X11, prevent a compilation failure in release mode for versions of Rust greater than or equal to 1.30. diff --git a/src/platform/macos/view.rs b/src/platform/macos/view.rs index 5a4b54d66c..f042e88e76 100644 --- a/src/platform/macos/view.rs +++ b/src/platform/macos/view.rs @@ -11,7 +11,7 @@ use cocoa::base::{id, nil}; use cocoa::appkit::{NSEvent, NSView, NSWindow}; use cocoa::foundation::{NSPoint, NSRect, NSSize, NSString, NSUInteger}; use objc::declare::ClassDecl; -use objc::runtime::{Class, Object, Protocol, Sel, BOOL}; +use objc::runtime::{Class, Object, Protocol, Sel, BOOL, YES}; use {ElementState, Event, KeyboardInput, MouseButton, WindowEvent, WindowId}; use platform::platform::events_loop::{DEVICE_ID, event_mods, Shared, to_virtual_key_code}; @@ -122,6 +122,7 @@ lazy_static! { decl.add_method(sel!(mouseDragged:), mouse_dragged as extern fn(&Object, Sel, id)); decl.add_method(sel!(rightMouseDragged:), right_mouse_dragged as extern fn(&Object, Sel, id)); decl.add_method(sel!(otherMouseDragged:), other_mouse_dragged as extern fn(&Object, Sel, id)); + decl.add_method(sel!(_wantsKeyDownForEvent:), wants_key_down_for_event as extern fn(&Object, Sel, id) -> BOOL); decl.add_ivar::<*mut c_void>("winitState"); decl.add_ivar::("markedText"); let protocol = Protocol::get("NSTextInputClient").unwrap(); @@ -566,3 +567,8 @@ extern fn right_mouse_dragged(this: &Object, _sel: Sel, event: id) { extern fn other_mouse_dragged(this: &Object, _sel: Sel, event: id) { mouse_motion(this, event); } + +// https://github.com/chromium/chromium/blob/a86a8a6bcfa438fa3ac2eba6f02b3ad1f8e0756f/ui/views/cocoa/bridged_content_view.mm#L816 +extern fn wants_key_down_for_event(_this: &Object, _se: Sel, _event: id) -> BOOL { + YES +} From b7351c99c94d04e1e4fb0256de7550476c710568 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Mon, 13 Aug 2018 23:26:36 -0700 Subject: [PATCH 2/6] fix --- CHANGELOG.md | 1 + src/platform/macos/events_loop.rs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34cefee779..c18e38659e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - On macOS, fix `` so applications receive the event. +- On macOS, fix `` so applications receive the event. # Version 0.17.1 (2018-08-05) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index 3c893cdd72..fa4abc04e5 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -314,6 +314,16 @@ impl EventsLoop { is_key_window == cocoa::base::YES }); + + // https://github.com/glfw/glfw/blob/50eccd298a2bbc272b4977bd162d3e4b55f15394/src/cocoa_window.m#L881 + if event_type == appkit::NSKeyUp { + if let Some(key_window) = maybe_key_window() { + if event_mods(ns_event).logo { + msg_send![*key_window.window, sendEvent:ns_event]; + } + } + } + match event_type { appkit::NSFlagsChanged => { let mut events = std::collections::VecDeque::new(); From 6db6e6961dd805a4e743ab33a925fc17bafaf896 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Tue, 14 Aug 2018 22:08:43 -0700 Subject: [PATCH 3/6] move the NSKeyUp special handling into the match statement --- src/platform/macos/events_loop.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index fa4abc04e5..2bfcf9234d 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -314,17 +314,16 @@ impl EventsLoop { is_key_window == cocoa::base::YES }); - + match event_type { // https://github.com/glfw/glfw/blob/50eccd298a2bbc272b4977bd162d3e4b55f15394/src/cocoa_window.m#L881 - if event_type == appkit::NSKeyUp { + appkit::NSKeyUp => { if let Some(key_window) = maybe_key_window() { if event_mods(ns_event).logo { msg_send![*key_window.window, sendEvent:ns_event]; } } - } - - match event_type { + None + }, appkit::NSFlagsChanged => { let mut events = std::collections::VecDeque::new(); From 59179f1bca7c4a8bafe03623f474575ce154e1e7 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Tue, 14 Aug 2018 22:09:25 -0700 Subject: [PATCH 4/6] add special handling for `` --- src/platform/macos/events_loop.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index 2bfcf9234d..aec8f444c9 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -315,15 +315,30 @@ impl EventsLoop { }); match event_type { - // https://github.com/glfw/glfw/blob/50eccd298a2bbc272b4977bd162d3e4b55f15394/src/cocoa_window.m#L881 + // https://github.com/glfw/glfw/blob/50eccd298a2bbc272b4977bd162d3e4b55f15394/src/cocoa_window.m#L881 appkit::NSKeyUp => { - if let Some(key_window) = maybe_key_window() { - if event_mods(ns_event).logo { - msg_send![*key_window.window, sendEvent:ns_event]; + if let Some(key_window) = maybe_key_window() { + if event_mods(ns_event).logo { + msg_send![*key_window.window, sendEvent:ns_event]; + } } - } None }, + // similar to above, but for ``, the keyDown is suppressed instead of the + // KeyUp, and the above trick does not appear to work. + appkit::NSKeyDown => { + let modifiers = event_mods(ns_event); + let keycode = NSEvent::keyCode(ns_event); + if modifiers.logo && keycode == 47 { + modifier_event( + ns_event, + NSEventModifierFlags::NSCommandKeyMask, + false, + ).map(into_event) + } else { + None + } + }, appkit::NSFlagsChanged => { let mut events = std::collections::VecDeque::new(); From 29b6afd5948738a04679050def274ef23e3a4811 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Tue, 14 Aug 2018 22:14:31 -0700 Subject: [PATCH 5/6] formatting --- src/platform/macos/events_loop.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index aec8f444c9..98bd21d12b 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -330,11 +330,8 @@ impl EventsLoop { let modifiers = event_mods(ns_event); let keycode = NSEvent::keyCode(ns_event); if modifiers.logo && keycode == 47 { - modifier_event( - ns_event, - NSEventModifierFlags::NSCommandKeyMask, - false, - ).map(into_event) + modifier_event(ns_event, NSEventModifierFlags::NSCommandKeyMask, false) + .map(into_event) } else { None } From f3b9f74abb0a4a0a24b832ecb727843dd44bfde3 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Wed, 15 Aug 2018 16:07:48 -0700 Subject: [PATCH 6/6] add return type to msg_send! --- src/platform/macos/events_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index 98bd21d12b..edc2923ccf 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -319,7 +319,7 @@ impl EventsLoop { appkit::NSKeyUp => { if let Some(key_window) = maybe_key_window() { if event_mods(ns_event).logo { - msg_send![*key_window.window, sendEvent:ns_event]; + let _: () = msg_send![*key_window.window, sendEvent:ns_event]; } } None