Added the KeyPress and KeyRelease events

This commit is contained in:
David Partouche 2014-10-15 11:49:10 +02:00
parent dad539114d
commit 86e8480550
3 changed files with 180 additions and 11 deletions

View file

@ -128,7 +128,7 @@ pub enum VirtualKeyCode {
Kana,
Kanji,
L,
LCracket,
LBracket,
LControl,
Left,
LMenu,

156
src/osx/event.rs Normal file
View 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,
})
}

View file

@ -15,9 +15,12 @@ use core_foundation::string::CFString;
use core_foundation::bundle::{CFBundleGetBundleWithIdentifier, CFBundleGetFunctionPointerForName};
use std::c_str::CString;
use {MouseInput, Pressed, Released, LeftMouseButton, RightMouseButton, MouseMoved, ReceivedCharacter,
KeyboardInput};
mod event;
pub struct Window {
window: id,
view: id,
context: id,
is_closed: AtomicBool,
@ -92,7 +95,6 @@ impl Window {
}
let window = Window {
window: window,
view: view,
context: context,
is_closed: AtomicBool::new(false),
@ -212,7 +214,6 @@ impl Window {
loop {
unsafe {
use {MouseInput, Pressed, Released, LeftMouseButton, RightMouseButton, MouseMoved, ReceivedCharacter};
let event = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
NSAnyEventMask as u64,
NSDate::distantPast(nil),
@ -232,14 +233,26 @@ impl Window {
events.push(MouseMoved((view_point.x as int, view_point.y as int)));
},
NSKeyDown => {
let received_cstr = CString::new(event.characters().UTF8String(), false);
match received_cstr.as_str() {
Some(received_str) => { events.push(ReceivedCharacter(received_str.char_at(0))); },
None => { },
};
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 => {
println!("Modifiers: {}", event.modifierFlags());
// Need to keep an array of the modified flags
},
NSKeyUp => { },
NSFlagsChanged => { },
NSScrollWheel => { },
NSOtherMouseDown => { },
NSOtherMouseUp => { },