mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-02-24 00:37:43 +11:00
commit
d8ca679a6e
3 changed files with 243 additions and 9 deletions
|
@ -128,7 +128,8 @@ pub enum VirtualKeyCode {
|
||||||
Kana,
|
Kana,
|
||||||
Kanji,
|
Kanji,
|
||||||
L,
|
L,
|
||||||
LCracket,
|
LAlt,
|
||||||
|
LBracket,
|
||||||
LControl,
|
LControl,
|
||||||
Left,
|
Left,
|
||||||
LMenu,
|
LMenu,
|
||||||
|
@ -171,6 +172,7 @@ pub enum VirtualKeyCode {
|
||||||
Prevtrack,
|
Prevtrack,
|
||||||
Q,
|
Q,
|
||||||
R,
|
R,
|
||||||
|
RAlt,
|
||||||
RBracket,
|
RBracket,
|
||||||
RControl,
|
RControl,
|
||||||
Return,
|
Return,
|
||||||
|
|
156
src/osx/event.rs
Normal file
156
src/osx/event.rs
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
use events;
|
||||||
|
use events::KeyModifiers;
|
||||||
|
use cocoa::base::NSUInteger;
|
||||||
|
use cocoa::appkit;
|
||||||
|
|
||||||
|
pub fn modifierflag_to_element(flag: NSUInteger) -> KeyModifiers {
|
||||||
|
let mut modifiers = KeyModifiers::empty();
|
||||||
|
if flag & appkit::NSShiftKeyMask as u64 == appkit::NSShiftKeyMask as u64 {
|
||||||
|
modifiers = modifiers | events::LEFT_SHIFT_MODIFIER;
|
||||||
|
}
|
||||||
|
if flag & appkit::NSControlKeyMask as u64 == appkit::NSControlKeyMask as u64 {
|
||||||
|
modifiers = modifiers | events::LEFT_CONTROL_MODIFIER;
|
||||||
|
}
|
||||||
|
if flag & appkit::NSAlternateKeyMask as u64 == appkit::NSAlternateKeyMask as u64 {
|
||||||
|
modifiers = modifiers | events::LEFT_ALT_MODIFIER;
|
||||||
|
}
|
||||||
|
if flag & appkit::NSNumericPadKeyMask as u64 == appkit::NSNumericPadKeyMask as u64 {
|
||||||
|
modifiers = modifiers | events::NUM_LOCK_MODIFIER;
|
||||||
|
}
|
||||||
|
modifiers
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn vkeycode_to_element(code: u16) -> Option<events::VirtualKeyCode> {
|
||||||
|
Some(match code {
|
||||||
|
0x00 => events::A,
|
||||||
|
0x01 => events::S,
|
||||||
|
0x02 => events::D,
|
||||||
|
0x03 => events::F,
|
||||||
|
0x04 => events::H,
|
||||||
|
0x05 => events::G,
|
||||||
|
0x06 => events::Z,
|
||||||
|
0x07 => events::X,
|
||||||
|
0x08 => events::C,
|
||||||
|
0x09 => events::V,
|
||||||
|
//0x0a => World 1,
|
||||||
|
0x0b => events::B,
|
||||||
|
0x0c => events::Q,
|
||||||
|
0x0d => events::W,
|
||||||
|
0x0e => events::E,
|
||||||
|
0x0f => events::R,
|
||||||
|
0x10 => events::Y,
|
||||||
|
0x11 => events::T,
|
||||||
|
0x12 => events::Key1,
|
||||||
|
0x13 => events::Key2,
|
||||||
|
0x14 => events::Key3,
|
||||||
|
0x15 => events::Key4,
|
||||||
|
0x16 => events::Key6,
|
||||||
|
0x17 => events::Key5,
|
||||||
|
0x18 => events::Equals,
|
||||||
|
0x19 => events::Key9,
|
||||||
|
0x1a => events::Key7,
|
||||||
|
0x1b => events::Minus,
|
||||||
|
0x1c => events::Key8,
|
||||||
|
0x1d => events::Key0,
|
||||||
|
0x1e => events::RBracket,
|
||||||
|
0x1f => events::O,
|
||||||
|
0x20 => events::U,
|
||||||
|
0x21 => events::LBracket,
|
||||||
|
0x22 => events::I,
|
||||||
|
0x23 => events::P,
|
||||||
|
0x24 => events::Return,
|
||||||
|
0x25 => events::L,
|
||||||
|
0x26 => events::J,
|
||||||
|
0x27 => events::Apostrophe,
|
||||||
|
0x28 => events::K,
|
||||||
|
0x29 => events::Semicolon,
|
||||||
|
0x2a => events::Backslash,
|
||||||
|
0x2b => events::Comma,
|
||||||
|
0x2c => events::Slash,
|
||||||
|
0x2d => events::N,
|
||||||
|
0x2e => events::M,
|
||||||
|
0x2f => events::Period,
|
||||||
|
0x30 => events::Tab,
|
||||||
|
0x31 => events::Space,
|
||||||
|
0x32 => events::Grave,
|
||||||
|
0x33 => events::Back,
|
||||||
|
//0x34 => unkown,
|
||||||
|
0x35 => events::Escape,
|
||||||
|
0x36 => events::RWin,
|
||||||
|
0x37 => events::LWin,
|
||||||
|
0x38 => events::LShift,
|
||||||
|
//0x39 => Caps lock,
|
||||||
|
//0x3a => Left alt,
|
||||||
|
0x3b => events::LControl,
|
||||||
|
0x3c => events::RShift,
|
||||||
|
//0x3d => Right alt,
|
||||||
|
0x3e => events::RControl,
|
||||||
|
//0x3f => Fn key,
|
||||||
|
//0x40 => F17 Key,
|
||||||
|
0x41 => events::Decimal,
|
||||||
|
//0x42 -> unkown,
|
||||||
|
0x43 => events::Multiply,
|
||||||
|
//0x44 => unkown,
|
||||||
|
0x45 => events::Add,
|
||||||
|
//0x46 => unkown,
|
||||||
|
0x47 => events::Numlock,
|
||||||
|
//0x48 => KeypadClear,
|
||||||
|
0x49 => events::VolumeUp,
|
||||||
|
0x4a => events::VolumeDown,
|
||||||
|
0x4b => events::Divide,
|
||||||
|
0x4c => events::NumpadEnter,
|
||||||
|
//0x4d => unkown,
|
||||||
|
0x4e => events::Subtract,
|
||||||
|
//0x4f => F18 key,
|
||||||
|
//0x50 => F19 Key,
|
||||||
|
0x51 => events::NumpadEquals,
|
||||||
|
0x52 => events::Numpad0,
|
||||||
|
0x53 => events::Numpad1,
|
||||||
|
0x54 => events::Numpad2,
|
||||||
|
0x55 => events::Numpad3,
|
||||||
|
0x56 => events::Numpad4,
|
||||||
|
0x57 => events::Numpad5,
|
||||||
|
0x58 => events::Numpad6,
|
||||||
|
0x59 => events::Numpad7,
|
||||||
|
//0x5a => F20 Key,
|
||||||
|
0x5b => events::Numpad8,
|
||||||
|
0x5c => events::Numpad9,
|
||||||
|
//0x5d => unkown,
|
||||||
|
//0x5e => unkown,
|
||||||
|
//0x5f => unkown,
|
||||||
|
0x60 => events::F5,
|
||||||
|
0x61 => events::F6,
|
||||||
|
0x62 => events::F7,
|
||||||
|
0x63 => events::F3,
|
||||||
|
0x64 => events::F8,
|
||||||
|
0x65 => events::F9,
|
||||||
|
//0x66 => unkown,
|
||||||
|
0x67 => events::F11,
|
||||||
|
//0x68 => unkown,
|
||||||
|
0x69 => events::F13,
|
||||||
|
//0x6a => F16 Key,
|
||||||
|
0x6b => events::F14,
|
||||||
|
//0x6c => unkown,
|
||||||
|
0x6d => events::F10,
|
||||||
|
//0x6e => unkown,
|
||||||
|
0x6f => events::F12,
|
||||||
|
//0x70 => unkown,
|
||||||
|
0x71 => events::F15,
|
||||||
|
0x72 => events::Insert,
|
||||||
|
0x73 => events::Home,
|
||||||
|
0x74 => events::PageUp,
|
||||||
|
0x75 => events::Delete,
|
||||||
|
0x76 => events::F4,
|
||||||
|
0x77 => events::End,
|
||||||
|
0x78 => events::F2,
|
||||||
|
0x79 => events::PageDown,
|
||||||
|
0x7a => events::F1,
|
||||||
|
0x7b => events::Left,
|
||||||
|
0x7c => events::Right,
|
||||||
|
0x7d => events::Down,
|
||||||
|
0x7e => events::Up,
|
||||||
|
//0x7f => unkown,
|
||||||
|
|
||||||
|
_ => return None,
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
use Event;
|
use Event;
|
||||||
|
use std::sync::atomic::AtomicBool;
|
||||||
|
|
||||||
#[cfg(feature = "window")]
|
#[cfg(feature = "window")]
|
||||||
use WindowBuilder;
|
use WindowBuilder;
|
||||||
|
@ -7,14 +8,30 @@ use WindowBuilder;
|
||||||
use HeadlessRendererBuilder;
|
use HeadlessRendererBuilder;
|
||||||
|
|
||||||
use cocoa::base::{id, NSUInteger, nil};
|
use cocoa::base::{id, NSUInteger, nil};
|
||||||
|
use cocoa::appkit;
|
||||||
use cocoa::appkit::*;
|
use cocoa::appkit::*;
|
||||||
|
|
||||||
use core_foundation::base::TCFType;
|
use core_foundation::base::TCFType;
|
||||||
use core_foundation::string::CFString;
|
use core_foundation::string::CFString;
|
||||||
use core_foundation::bundle::{CFBundleGetBundleWithIdentifier, CFBundleGetFunctionPointerForName};
|
use core_foundation::bundle::{CFBundleGetBundleWithIdentifier, CFBundleGetFunctionPointerForName};
|
||||||
|
|
||||||
|
use std::c_str::CString;
|
||||||
|
use {MouseInput, Pressed, Released, LeftMouseButton, RightMouseButton, MouseMoved, ReceivedCharacter,
|
||||||
|
KeyboardInput, KeyModifiers};
|
||||||
|
|
||||||
|
use events;
|
||||||
|
|
||||||
|
mod event;
|
||||||
|
|
||||||
|
static mut shift_pressed: bool = false;
|
||||||
|
static mut ctrl_pressed: bool = false;
|
||||||
|
static mut win_pressed: bool = false;
|
||||||
|
static mut alt_pressed: bool = false;
|
||||||
|
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
|
view: id,
|
||||||
context: id,
|
context: id,
|
||||||
|
is_closed: AtomicBool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct HeadlessContext(Window);
|
pub struct HeadlessContext(Window);
|
||||||
|
@ -86,7 +103,9 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
let window = Window {
|
let window = Window {
|
||||||
|
view: view,
|
||||||
context: context,
|
context: context,
|
||||||
|
is_closed: AtomicBool::new(false),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(window)
|
Ok(window)
|
||||||
|
@ -123,6 +142,7 @@ impl Window {
|
||||||
let title = NSString::alloc(nil).init_str(title);
|
let title = NSString::alloc(nil).init_str(title);
|
||||||
window.setTitle_(title);
|
window.setTitle_(title);
|
||||||
window.center();
|
window.center();
|
||||||
|
window.setAcceptsMouseMovedEvents_(true);
|
||||||
Some(window)
|
Some(window)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,8 +189,8 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_closed(&self) -> bool {
|
pub fn is_closed(&self) -> bool {
|
||||||
// TODO: remove fake implementation
|
use std::sync::atomic::Relaxed;
|
||||||
false
|
self.is_closed.load(Relaxed)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_title(&self, _title: &str) {
|
pub fn set_title(&self, _title: &str) {
|
||||||
|
@ -202,23 +222,63 @@ impl Window {
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
unsafe {
|
unsafe {
|
||||||
use {MouseInput, Pressed, Released, LeftMouseButton, RightMouseButton};
|
|
||||||
let event = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
|
let event = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
|
||||||
NSAnyEventMask as u64,
|
NSAnyEventMask as u64,
|
||||||
NSDate::distantPast(nil),
|
NSDate::distantPast(nil),
|
||||||
NSDefaultRunLoopMode,
|
NSDefaultRunLoopMode,
|
||||||
true);
|
true);
|
||||||
if event == nil { break; }
|
if event == nil { break; }
|
||||||
|
NSApp().sendEvent_(event);
|
||||||
|
|
||||||
match event.get_type() {
|
match event.get_type() {
|
||||||
NSLeftMouseDown => { events.push(MouseInput(Pressed, LeftMouseButton)); },
|
NSLeftMouseDown => { events.push(MouseInput(Pressed, LeftMouseButton)); },
|
||||||
NSLeftMouseUp => { events.push(MouseInput(Released, LeftMouseButton)); },
|
NSLeftMouseUp => { events.push(MouseInput(Released, LeftMouseButton)); },
|
||||||
NSRightMouseDown => { events.push(MouseInput(Pressed, RightMouseButton)); },
|
NSRightMouseDown => { events.push(MouseInput(Pressed, RightMouseButton)); },
|
||||||
NSRightMouseUp => { events.push(MouseInput(Released, RightMouseButton)); },
|
NSRightMouseUp => { events.push(MouseInput(Released, RightMouseButton)); },
|
||||||
NSMouseMoved => { },
|
NSMouseMoved => {
|
||||||
NSKeyDown => { },
|
let window_point = event.locationInWindow();
|
||||||
NSKeyUp => { },
|
let view_point = self.view.convertPoint_fromView_(window_point, nil);
|
||||||
NSFlagsChanged => { },
|
events.push(MouseMoved((view_point.x as int, view_point.y as int)));
|
||||||
|
},
|
||||||
|
NSKeyDown => {
|
||||||
|
let received_str = CString::new(event.characters().UTF8String(), false);
|
||||||
|
for received_char in received_str.as_str().unwrap().chars() {
|
||||||
|
if received_char.is_ascii() {
|
||||||
|
events.push(ReceivedCharacter(received_char));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let vkey = event::vkeycode_to_element(event.keycode());
|
||||||
|
let modifiers = event::modifierflag_to_element(event.modifierFlags());
|
||||||
|
events.push(KeyboardInput(Pressed, event.keycode() as u8, vkey, modifiers));
|
||||||
|
},
|
||||||
|
NSKeyUp => {
|
||||||
|
let vkey = event::vkeycode_to_element(event.keycode());
|
||||||
|
let modifiers = event::modifierflag_to_element(event.modifierFlags());
|
||||||
|
events.push(KeyboardInput(Released, event.keycode() as u8, vkey, modifiers));
|
||||||
|
},
|
||||||
|
NSFlagsChanged => {
|
||||||
|
let shift_modifier = Window::modifier_event(event, appkit::NSShiftKeyMask as u64, events::LShift, shift_pressed);
|
||||||
|
if shift_modifier.is_some() {
|
||||||
|
shift_pressed = !shift_pressed;
|
||||||
|
events.push(shift_modifier.unwrap());
|
||||||
|
}
|
||||||
|
let ctrl_modifier = Window::modifier_event(event, appkit::NSControlKeyMask as u64, events::LControl, ctrl_pressed);
|
||||||
|
if ctrl_modifier.is_some() {
|
||||||
|
ctrl_pressed = !ctrl_pressed;
|
||||||
|
events.push(ctrl_modifier.unwrap());
|
||||||
|
}
|
||||||
|
let win_modifier = Window::modifier_event(event, appkit::NSCommandKeyMask as u64, events::LWin, win_pressed);
|
||||||
|
if win_modifier.is_some() {
|
||||||
|
win_pressed = !win_pressed;
|
||||||
|
events.push(win_modifier.unwrap());
|
||||||
|
}
|
||||||
|
let alt_modifier = Window::modifier_event(event, appkit::NSAlternateKeyMask as u64, events::LAlt, alt_pressed);
|
||||||
|
if alt_modifier.is_some() {
|
||||||
|
alt_pressed = !alt_pressed;
|
||||||
|
events.push(alt_modifier.unwrap());
|
||||||
|
}
|
||||||
|
},
|
||||||
NSScrollWheel => { },
|
NSScrollWheel => { },
|
||||||
NSOtherMouseDown => { },
|
NSOtherMouseDown => { },
|
||||||
NSOtherMouseUp => { },
|
NSOtherMouseUp => { },
|
||||||
|
@ -230,14 +290,30 @@ impl Window {
|
||||||
events
|
events
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe fn modifier_event(event: id, keymask: u64, key: events::VirtualKeyCode, key_pressed: bool) -> Option<Event> {
|
||||||
|
if !key_pressed && Window::modifier_key_pressed(event, keymask) {
|
||||||
|
return Some(KeyboardInput(Pressed, event.keycode() as u8, Some(key), KeyModifiers::empty()));
|
||||||
|
}
|
||||||
|
else if key_pressed && !Window::modifier_key_pressed(event, keymask) {
|
||||||
|
return Some(KeyboardInput(Released, event.keycode() as u8, Some(key), KeyModifiers::empty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn modifier_key_pressed(event: id, modifier: u64) -> bool {
|
||||||
|
event.modifierFlags() & modifier != 0
|
||||||
|
}
|
||||||
|
|
||||||
pub fn wait_events(&self) -> Vec<Event> {
|
pub fn wait_events(&self) -> Vec<Event> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let event = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
|
let event = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
|
||||||
NSAnyEventMask as u64,
|
NSAnyEventMask as u64,
|
||||||
NSDate::distantFuture(nil),
|
NSDate::distantFuture(nil),
|
||||||
NSDefaultRunLoopMode,
|
NSDefaultRunLoopMode,
|
||||||
true);
|
false);
|
||||||
NSApp().sendEvent_(event);
|
NSApp().sendEvent_(event);
|
||||||
|
|
||||||
self.poll_events()
|
self.poll_events()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue