Merge remote-tracking branch 'glutin/master' into merge-glutin

Conflicts:
	Cargo.toml
	build.rs
	src/api/caca/mod.rs
	src/api/cocoa/mod.rs
	src/api/egl/ffi.rs
	src/api/egl/mod.rs
	src/api/glx/mod.rs
	src/api/osmesa/mod.rs
This commit is contained in:
Pierre Krieger 2016-03-26 17:55:03 +01:00
commit d216d6b052
16 changed files with 165 additions and 103 deletions

View file

@ -33,10 +33,10 @@ use std::sync::Mutex;
use std::ascii::AsciiExt;
use std::ops::Deref;
use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel, Closed, Focused};
use events::ElementState::{Pressed, Released};
use events::MouseButton;
use events;
use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput};
use events::Event::{MouseWheel, Closed, Focused, TouchpadPressure};
use events::{self, MouseButton, TouchPhase};
pub use self::monitor::{MonitorId, get_available_monitors, get_primary_monitor};
@ -65,11 +65,12 @@ struct WindowDelegate {
impl WindowDelegate {
/// Get the delegate class, initiailizing it neccessary
fn class() -> *const Class {
use std::os::raw::c_void;
use std::sync::{Once, ONCE_INIT};
extern fn window_should_close(this: &Object, _: Sel, _: id) -> BOOL {
unsafe {
let state: *mut libc::c_void = *this.get_ivar("glutinState");
let state: *mut c_void = *this.get_ivar("glutinState");
let state = state as *mut DelegateState;
(*state).pending_events.lock().unwrap().push_back(Closed);
}
@ -78,7 +79,7 @@ impl WindowDelegate {
extern fn window_did_resize(this: &Object, _: Sel, _: id) {
unsafe {
let state: *mut libc::c_void = *this.get_ivar("glutinState");
let state: *mut c_void = *this.get_ivar("glutinState");
let state = &mut *(state as *mut DelegateState);
// need to notify context before (?) event
@ -98,7 +99,7 @@ impl WindowDelegate {
// 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: *mut c_void = *this.get_ivar("glutinState");
let state = state as *mut DelegateState;
(*state).pending_events.lock().unwrap().push_back(Focused(true));
}
@ -106,7 +107,7 @@ impl WindowDelegate {
extern fn window_did_resign_key(this: &Object, _: Sel, _: id) {
unsafe {
let state: *mut libc::c_void = *this.get_ivar("glutinState");
let state: *mut c_void = *this.get_ivar("glutinState");
let state = state as *mut DelegateState;
(*state).pending_events.lock().unwrap().push_back(Focused(false));
}
@ -118,7 +119,7 @@ impl WindowDelegate {
INIT.call_once(|| unsafe {
// Create new NSWindowDelegate
let superclass = Class::get("NSObject").unwrap();
let mut decl = ClassDecl::new(superclass, "GlutinWindowDelegate").unwrap();
let mut decl = ClassDecl::new("GlutinWindowDelegate", superclass).unwrap();
// Add callback methods
decl.add_method(sel!(windowShouldClose:),
@ -132,7 +133,7 @@ impl WindowDelegate {
window_did_resign_key as extern fn(&Object, Sel, id));
// Store internal state as user data
decl.add_ivar::<*mut libc::c_void>("glutinState");
decl.add_ivar::<*mut c_void>("glutinState");
delegate_class = decl.register();
});
@ -149,7 +150,7 @@ impl WindowDelegate {
unsafe {
let delegate = IdRef::new(msg_send![WindowDelegate::class(), new]);
(&mut **delegate).set_ivar("glutinState", state_ptr as *mut libc::c_void);
(&mut **delegate).set_ivar("glutinState", state_ptr as *mut ::std::os::raw::c_void);
let _: () = msg_send![*state.window, setDelegate:*delegate];
WindowDelegate { state: state, _this: delegate }
@ -189,7 +190,7 @@ impl WindowProxy {
NSEvent::otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
nil, NSApplicationDefined, NSPoint::new(0.0, 0.0), NSEventModifierFlags::empty(),
0.0, 0, nil, NSApplicationActivatedEventType, 0, 0);
NSApp().postEvent_atStart_(event, YES);
NSApp().postEvent_atStart_(event, NO);
pool.drain();
}
}
@ -209,12 +210,16 @@ impl<'a> Iterator for PollEventsIterator<'a> {
let event: Option<Event>;
unsafe {
let pool = NSAutoreleasePool::new(nil);
let nsevent = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
NSAnyEventMask.bits(),
NSAnyEventMask.bits() | NSEventMaskPressure.bits(),
NSDate::distantPast(nil),
NSDefaultRunLoopMode,
YES);
event = NSEventToEvent(self.window, nsevent);
let _: () = msg_send![pool, release];
}
event
}
@ -234,12 +239,16 @@ impl<'a> Iterator for WaitEventsIterator<'a> {
let event: Option<Event>;
unsafe {
let pool = NSAutoreleasePool::new(nil);
let nsevent = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(
NSAnyEventMask.bits(),
NSAnyEventMask.bits() | NSEventMaskPressure.bits(),
NSDate::distantFuture(nil),
NSDefaultRunLoopMode,
YES);
event = NSEventToEvent(self.window, nsevent);
let _: () = msg_send![pool, release];
}
if event.is_none() {
@ -357,7 +366,9 @@ impl Window {
let masks = if screen.is_some() || attrs.transparent {
// Fullscreen or transparent window
NSBorderlessWindowMask as NSUInteger
NSBorderlessWindowMask as NSUInteger |
NSResizableWindowMask as NSUInteger |
NSTitledWindowMask as NSUInteger
} else if attrs.decorations {
// Classic opaque window with titlebar
NSClosableWindowMask as NSUInteger |
@ -557,8 +568,8 @@ impl Window {
let sel = Sel::register(cursor_name);
let cls = Class::get("NSCursor").unwrap();
unsafe {
use objc::MessageArguments;
let cursor: id = ().send(cls as *const _ as id, sel);
use objc::Message;
let cursor: id = cls.send_message(sel, ()).unwrap();
let _: () = msg_send![cursor, set];
}
}
@ -654,7 +665,7 @@ impl Clone for IdRef {
unsafe fn NSEventToEvent(window: &Window, nsevent: id) -> Option<Event> {
if nsevent == nil { return None; }
let event_type = msg_send![nsevent, type];
let event_type = nsevent.eventType();
NSApp().sendEvent_(if let NSKeyDown = event_type { nil } else { nsevent });
match event_type {
@ -735,7 +746,15 @@ unsafe fn NSEventToEvent(window: &Window, nsevent: id) -> Option<Event> {
LineDelta(scale_factor * nsevent.scrollingDeltaX() as f32,
scale_factor * nsevent.scrollingDeltaY() as f32)
};
Some(MouseWheel(delta))
let phase = match nsevent.phase() {
NSEventPhaseMayBegin | NSEventPhaseBegan => TouchPhase::Started,
NSEventPhaseEnded => TouchPhase::Ended,
_ => TouchPhase::Moved,
};
Some(MouseWheel(delta, phase))
},
NSEventTypePressure => {
Some(TouchpadPressure(nsevent.pressure(), nsevent.stage()))
},
_ => { None },
}