aboutsummaryrefslogtreecommitdiffstats
path: root/src/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'src/cocoa')
-rw-r--r--src/cocoa/mod.rs80
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 {