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:
commit
d216d6b052
16 changed files with 165 additions and 103 deletions
|
|
@ -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 },
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue