mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-24 06:11:30 +11:00
625 macos modifiers (#629)
* fix <C-Tab> * fix <CMD-{key}> * move the NSKeyUp special handling into the match statement * add special handling for `<Cmd-.>` * formatting * add return type to msg_send!
This commit is contained in:
parent
b2b740fed7
commit
1c795c3f1c
|
@ -1,5 +1,8 @@
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
|
- On macOS, fix `<C-Tab>` so applications receive the event.
|
||||||
|
- On macOS, fix `<Cmd-{key}>` so applications receive the event.
|
||||||
|
|
||||||
# Version 0.17.1 (2018-08-05)
|
# 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.
|
- On X11, prevent a compilation failure in release mode for versions of Rust greater than or equal to 1.30.
|
||||||
|
|
|
@ -315,6 +315,27 @@ impl EventsLoop {
|
||||||
});
|
});
|
||||||
|
|
||||||
match event_type {
|
match event_type {
|
||||||
|
// 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 {
|
||||||
|
let _: () = msg_send![*key_window.window, sendEvent:ns_event];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
},
|
||||||
|
// similar to above, but for `<Cmd-.>`, 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 => {
|
appkit::NSFlagsChanged => {
|
||||||
let mut events = std::collections::VecDeque::new();
|
let mut events = std::collections::VecDeque::new();
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use cocoa::base::{id, nil};
|
||||||
use cocoa::appkit::{NSEvent, NSView, NSWindow};
|
use cocoa::appkit::{NSEvent, NSView, NSWindow};
|
||||||
use cocoa::foundation::{NSPoint, NSRect, NSSize, NSString, NSUInteger};
|
use cocoa::foundation::{NSPoint, NSRect, NSSize, NSString, NSUInteger};
|
||||||
use objc::declare::ClassDecl;
|
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 {ElementState, Event, KeyboardInput, MouseButton, WindowEvent, WindowId};
|
||||||
use platform::platform::events_loop::{DEVICE_ID, event_mods, Shared, to_virtual_key_code};
|
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!(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!(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!(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::<*mut c_void>("winitState");
|
||||||
decl.add_ivar::<id>("markedText");
|
decl.add_ivar::<id>("markedText");
|
||||||
let protocol = Protocol::get("NSTextInputClient").unwrap();
|
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) {
|
extern fn other_mouse_dragged(this: &Object, _sel: Sel, event: id) {
|
||||||
mouse_motion(this, event);
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue