diff options
Diffstat (limited to 'src/cocoa')
-rw-r--r-- | src/cocoa/mod.rs | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/src/cocoa/mod.rs b/src/cocoa/mod.rs index 6b97964..7125720 100644 --- a/src/cocoa/mod.rs +++ b/src/cocoa/mod.rs @@ -8,6 +8,7 @@ use libc; use Api; use BuilderAttribs; use GlRequest; +use PixelFormat; use native_monitor::NativeMonitorId; use objc::runtime::{Class, Object, Sel, BOOL, YES, NO}; @@ -32,7 +33,7 @@ use std::sync::Mutex; use std::ascii::AsciiExt; use std::ops::Deref; -use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel}; +use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel, Closed}; use events::ElementState::{Pressed, Released}; use events::MouseButton; use events; @@ -56,6 +57,9 @@ struct DelegateState { view: IdRef, window: IdRef, resize_handler: Option<fn(u32, u32)>, + + /// Events that have been retreived with XLib but not dispatched with iterators yet + pending_events: Mutex<VecDeque<Event>>, } struct WindowDelegate { @@ -73,6 +77,8 @@ impl WindowDelegate { let state: *mut libc::c_void = *this.get_ivar("glutinState"); let state = state as *mut DelegateState; (*state).is_closed = true; + + (*state).pending_events.lock().unwrap().push_back(Closed); } YES } @@ -147,9 +153,6 @@ pub struct Window { window: IdRef, context: IdRef, delegate: WindowDelegate, - - /// Events that have been retreived with XLib but not dispatched with iterators yet - pending_events: Mutex<VecDeque<Event>>, } #[cfg(feature = "window")] @@ -183,7 +186,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { type Item = Event; fn next(&mut self) -> Option<Event> { - if let Some(ev) = self.window.pending_events.lock().unwrap().pop_front() { + if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { return Some(ev); } @@ -231,7 +234,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { let vkey = event::vkeycode_to_element(NSEvent::keyCode(event)); events.push_back(KeyboardInput(Pressed, NSEvent::keyCode(event) as u8, vkey)); let event = events.pop_front(); - self.window.pending_events.lock().unwrap().extend(events.into_iter()); + self.window.delegate.state.pending_events.lock().unwrap().extend(events.into_iter()); event }, NSKeyUp => { @@ -261,13 +264,15 @@ impl<'a> Iterator for PollEventsIterator<'a> { events.push_back(alt_modifier.unwrap()); } let event = events.pop_front(); - self.window.pending_events.lock().unwrap().extend(events.into_iter()); + self.window.delegate.state.pending_events.lock().unwrap().extend(events.into_iter()); event }, NSScrollWheel => { Some(MouseWheel(event.scrollingDeltaY() as i32)) }, _ => { None }, }; + + event } } @@ -282,7 +287,7 @@ impl<'a> Iterator for WaitEventsIterator<'a> { fn next(&mut self) -> Option<Event> { loop { - if let Some(ev) = self.window.pending_events.lock().unwrap().pop_front() { + if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { return Some(ev); } @@ -347,6 +352,7 @@ impl Window { view: view.clone(), window: window.clone(), resize_handler: None, + pending_events: Mutex::new(VecDeque::new()), }; let window = Window { @@ -354,8 +360,6 @@ impl Window { window: window, context: context, delegate: WindowDelegate::new(ds), - - pending_events: Mutex::new(VecDeque::new()), }; Ok(window) @@ -616,36 +620,39 @@ impl Window { ::Api::OpenGl } + pub fn get_pixel_format(&self) -> PixelFormat { + unimplemented!(); + } + pub fn set_window_resize_callback(&mut self, callback: Option<fn(u32, u32)>) { self.delegate.state.resize_handler = callback; } pub fn set_cursor(&self, cursor: MouseCursor) { let cursor_name = match cursor { - MouseCursor::Arrow => "arrowCursor", + MouseCursor::Arrow | MouseCursor::Default => "arrowCursor", + MouseCursor::Hand => "pointingHandCursor", + MouseCursor::Grabbing | MouseCursor::Grab => "closedHandCursor", MouseCursor::Text => "IBeamCursor", - MouseCursor::ContextMenu => "contextualMenuCursor", + MouseCursor::VerticalText => "IBeamCursorForVerticalLayout", MouseCursor::Copy => "dragCopyCursor", - MouseCursor::Crosshair => "crosshairCursor", - MouseCursor::Default => "arrowCursor", - MouseCursor::Grabbing => "openHandCursor", - MouseCursor::Hand | MouseCursor::Grab => "pointingHandCursor", - MouseCursor::NoDrop => "operationNotAllowedCursor", - MouseCursor::NotAllowed => "operationNotAllowedCursor", MouseCursor::Alias => "dragLinkCursor", - - - /// Resize cursors - MouseCursor::EResize | MouseCursor::NResize | - MouseCursor::NeResize | MouseCursor::NwResize | - MouseCursor::SResize | MouseCursor::SeResize | - MouseCursor::SwResize | MouseCursor::WResize | - MouseCursor::EwResize | MouseCursor::ColResize | - MouseCursor::NsResize | MouseCursor::RowResize | - MouseCursor::NwseResize | MouseCursor::NeswResize => "arrowCursor", + MouseCursor::NotAllowed | MouseCursor::NoDrop => "operationNotAllowedCursor", + MouseCursor::ContextMenu => "contextualMenuCursor", + MouseCursor::Crosshair => "crosshairCursor", + MouseCursor::EResize => "resizeRightCursor", + MouseCursor::NResize => "resizeUpCursor", + MouseCursor::WResize => "resizeLeftCursor", + MouseCursor::SResize => "resizeDownCursor", + MouseCursor::EwResize | MouseCursor::ColResize => "resizeLeftRightCursor", + MouseCursor::NsResize | MouseCursor::RowResize => "resizeUpDownCursor", /// TODO: Find appropriate OSX cursors - MouseCursor::Cell | MouseCursor::VerticalText | MouseCursor::NoneCursor | + MouseCursor::NeResize | MouseCursor::NwResize | + MouseCursor::SeResize | MouseCursor::SwResize | + MouseCursor::NwseResize | MouseCursor::NeswResize | + + MouseCursor::Cell | MouseCursor::NoneCursor | MouseCursor::Wait | MouseCursor::Progress | MouseCursor::Help | MouseCursor::Move | MouseCursor::AllScroll | MouseCursor::ZoomIn | MouseCursor::ZoomOut => "arrowCursor", @@ -660,7 +667,20 @@ impl Window { } pub fn set_cursor_state(&self, state: CursorState) -> Result<(), String> { - unimplemented!(); + let cls = Class::get("NSCursor").unwrap(); + match state { + CursorState::Normal => { + let _: () = unsafe { msg_send![cls, unhide] }; + Ok(()) + }, + CursorState::Hide => { + let _: () = unsafe { msg_send![cls, hide] }; + Ok(()) + }, + CursorState::Grab => { + Err("Mouse grabbing is unimplemented".to_string()) + } + } } pub fn hidpi_factor(&self) -> f32 { |