diff options
author | Felix Kaaman <trundmatu@gmail.com> | 2015-09-10 19:36:53 +0200 |
---|---|---|
committer | Felix Kaaman <trundmatu@gmail.com> | 2015-09-10 19:36:53 +0200 |
commit | b029233e548d803dbb511cbf1a44ddcdd9b57c1c (patch) | |
tree | 580add63d543631e0c3bbcc79ae6c91a6325992a | |
parent | 8092fd640938366110627027b3471025abd2c4b9 (diff) | |
download | glutin-b029233e548d803dbb511cbf1a44ddcdd9b57c1c.tar.gz glutin-b029233e548d803dbb511cbf1a44ddcdd9b57c1c.zip |
Add focus and defocus events on cocoa. Fixes #595
-rw-r--r-- | src/api/cocoa/mod.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index 0314dd3..0c8a814 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -44,7 +44,7 @@ use std::sync::Mutex; use std::ascii::AsciiExt; use std::ops::Deref; -use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel, Closed}; +use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel, Closed, Focused}; use events::ElementState::{Pressed, Released}; use events::MouseButton; use events; @@ -105,6 +105,25 @@ impl WindowDelegate { } } + extern fn window_did_become_key(this: &Object, _: Sel, _: id) { + unsafe { + // TODO: center the cursor if the window had mouse grab when it + // lost focus + + let state: *mut libc::c_void = *this.get_ivar("glutinState"); + let state = state as *mut DelegateState; + (*state).pending_events.lock().unwrap().push_back(Focused(true)); + } + } + + extern fn window_did_resign_key(this: &Object, _: Sel, _: id) { + unsafe { + let state: *mut libc::c_void = *this.get_ivar("glutinState"); + let state = state as *mut DelegateState; + (*state).pending_events.lock().unwrap().push_back(Focused(false)); + } + } + static mut delegate_class: *const Class = 0 as *const Class; static INIT: Once = ONCE_INIT; @@ -118,6 +137,11 @@ impl WindowDelegate { window_should_close as extern fn(&Object, Sel, id) -> BOOL); decl.add_method(sel!(windowDidResize:), window_did_resize as extern fn(&Object, Sel, id)); + + decl.add_method(sel!(windowDidBecomeKey:), + window_did_become_key as extern fn(&Object, Sel, id)); + decl.add_method(sel!(windowDidResignKey:), + window_did_resign_key as extern fn(&Object, Sel, id)); // Store internal state as user data decl.add_ivar::<*mut libc::c_void>("glutinState"); |