diff --git a/Cargo.toml b/Cargo.toml index 3ae64b54..32c83a75 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,10 +26,10 @@ image = { version = "0.19", optional = true } version = "0.2" [target.'cfg(target_os = "ios")'.dependencies] -objc = "0.2" +objc = "0.2.3" [target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2" +objc = "0.2.3" cocoa = "0.15" core-foundation = "0.6" core-graphics = "0.14" diff --git a/src/platform/ios/ffi.rs b/src/platform/ios/ffi.rs index d3f0a8a8..bde3ee49 100644 --- a/src/platform/ios/ffi.rs +++ b/src/platform/ios/ffi.rs @@ -4,7 +4,7 @@ use std::ffi::CString; use std::mem; use std::os::raw::*; -use objc::runtime::{Class, Object}; +use objc::runtime::Object; pub type id = *mut Object; pub const nil: id = 0 as id; @@ -78,7 +78,7 @@ extern { pub trait NSString: Sized { unsafe fn alloc(_: Self) -> id { - msg_send![class("NSString"), alloc] + msg_send![class!(NSString), alloc] } unsafe fn initWithUTF8String_(self, c_string: *const c_char) -> id; @@ -105,10 +105,3 @@ impl NSString for id { msg_send![self, UTF8String] } } - -#[inline] -pub fn class(name: &str) -> *mut Class { - unsafe { - mem::transmute(Class::get(name)) - } -} diff --git a/src/platform/ios/mod.rs b/src/platform/ios/mod.rs index ef65dcef..8be759c0 100644 --- a/src/platform/ios/mod.rs +++ b/src/platform/ios/mod.rs @@ -170,7 +170,7 @@ impl fmt::Debug for MonitorId { impl MonitorId { #[inline] pub fn get_uiscreen(&self) -> id { - let class = Class::get("UIScreen").expect("Failed to get class `UIScreen`"); + let class = class!(UIScreen); unsafe { msg_send![class, mainScreen] } } @@ -209,7 +209,7 @@ impl EventsLoop { pub fn new() -> EventsLoop { unsafe { if setjmp(mem::transmute(&mut JMPBUF)) != 0 { - let app_class = Class::get("UIApplication").expect("Failed to get class `UIApplication`"); + let app_class = class!(UIApplication); let app: id = msg_send![app_class, sharedApplication]; let delegate: id = msg_send![app, delegate]; let state: *mut c_void = *(&*delegate).get_ivar("winitState"); @@ -469,10 +469,10 @@ impl Window { fn create_delegate_class() { extern fn did_finish_launching(this: &mut Object, _: Sel, _: id, _: id) -> BOOL { - let screen_class = Class::get("UIScreen").expect("Failed to get class `UIScreen`"); - let window_class = Class::get("UIWindow").expect("Failed to get class `UIWindow`"); - let controller_class = Class::get("MainViewController").expect("Failed to get class `MainViewController`"); - let view_class = Class::get("MainView").expect("Failed to get class `MainView`"); + let screen_class = class!(UIScreen); + let window_class = class!(UIWindow); + let controller_class = class!(MainViewController); + let view_class = class!(MainView); unsafe { let main_screen: id = msg_send![screen_class, mainScreen]; let bounds: CGRect = msg_send![main_screen, bounds]; @@ -595,7 +595,7 @@ fn create_delegate_class() { } } - let ui_responder = Class::get("UIResponder").expect("Failed to get class `UIResponder`"); + let ui_responder = class!(UIResponder); let mut decl = ClassDecl::new("AppDelegate", ui_responder).expect("Failed to declare class `AppDelegate`"); unsafe { @@ -642,7 +642,7 @@ fn create_delegate_class() { // TODO: winit shouldn't contain GL-specfiic code pub fn create_view_class() { - let superclass = Class::get("UIViewController").expect("Failed to get class `UIViewController`"); + let superclass = class!(UIViewController); let decl = ClassDecl::new("MainViewController", superclass).expect("Failed to declare class `MainViewController`"); decl.register(); @@ -663,10 +663,10 @@ pub fn create_view_class() { } extern fn layer_class(_: &Class, _: Sel) -> *const Class { - unsafe { mem::transmute(Class::get("CAEAGLLayer").expect("Failed to get class `CAEAGLLayer`")) } + class!(CAEAGLLayer) } - let superclass = Class::get("GLKView").expect("Failed to get class `GLKView`"); + let superclass = class!(GLKView); let mut decl = ClassDecl::new("MainView", superclass).expect("Failed to declare class `MainView`"); unsafe { decl.add_method(sel!(initForGl:), init_for_gl as extern fn(&Object, Sel, *const c_void) -> id); diff --git a/src/platform/macos/events_loop.rs b/src/platform/macos/events_loop.rs index c47ffa88..e9f03ea0 100644 --- a/src/platform/macos/events_loop.rs +++ b/src/platform/macos/events_loop.rs @@ -180,7 +180,7 @@ impl EventsLoop { where F: FnMut(Event), { unsafe { - if !msg_send![cocoa::base::class("NSThread"), isMainThread] { + if !msg_send![class!(NSThread), isMainThread] { panic!("Events can only be polled from the main thread on macOS"); } } @@ -221,7 +221,7 @@ impl EventsLoop { where F: FnMut(Event) -> ControlFlow { unsafe { - if !msg_send![cocoa::base::class("NSThread"), isMainThread] { + if !msg_send![class!(NSThread), isMainThread] { panic!("Events can only be polled from the main thread on macOS"); } } diff --git a/src/platform/macos/ffi.rs b/src/platform/macos/ffi.rs index c3f14ca7..ef6eb7d6 100644 --- a/src/platform/macos/ffi.rs +++ b/src/platform/macos/ffi.rs @@ -35,7 +35,7 @@ unsafe impl objc::Encode for NSRange { pub trait NSMutableAttributedString: Sized { unsafe fn alloc(_: Self) -> id { - msg_send![class("NSMutableAttributedString"), alloc] + msg_send![class!(NSMutableAttributedString), alloc] } unsafe fn init(self) -> id; // *mut NSMutableAttributedString diff --git a/src/platform/macos/util.rs b/src/platform/macos/util.rs index be99c055..a9d8be06 100644 --- a/src/platform/macos/util.rs +++ b/src/platform/macos/util.rs @@ -26,13 +26,13 @@ pub unsafe fn set_style_mask(window: id, view: id, mask: NSWindowStyleMask) { } pub unsafe fn create_input_context(view: id) -> IdRef { - let input_context: id = msg_send![class("NSTextInputContext"), alloc]; + let input_context: id = msg_send![class!(NSTextInputContext), alloc]; let input_context: id = msg_send![input_context, initWithClient:view]; IdRef::new(input_context) } #[allow(dead_code)] pub unsafe fn open_emoji_picker() { - let app: id = msg_send![class("NSApplication"), sharedApplication]; + let app: id = msg_send![class!(NSApplication), sharedApplication]; let _: () = msg_send![app, orderFrontCharacterPalette:nil]; } diff --git a/src/platform/macos/view.rs b/src/platform/macos/view.rs index d47d8d8e..9fd23969 100644 --- a/src/platform/macos/view.rs +++ b/src/platform/macos/view.rs @@ -64,7 +64,7 @@ unsafe impl Sync for ViewClass {} lazy_static! { static ref VIEW_CLASS: ViewClass = unsafe { - let superclass = Class::get("NSView").unwrap(); + let superclass = class!(NSView); let mut decl = ClassDecl::new("WinitView", superclass).unwrap(); decl.add_method(sel!(dealloc), dealloc as extern fn(&Object, Sel)); decl.add_method( @@ -191,7 +191,7 @@ extern fn set_marked_text( let marked_text_ref: &mut id = this.get_mut_ivar("markedText"); let _: () = msg_send![(*marked_text_ref), release]; let marked_text = NSMutableAttributedString::alloc(nil); - let has_attr = msg_send![string, isKindOfClass:class("NSAttributedString")]; + let has_attr = msg_send![string, isKindOfClass:class!(NSAttributedString)]; if has_attr { marked_text.initWithAttributedString(string); } else { @@ -214,7 +214,7 @@ extern fn unmark_text(this: &Object, _sel: Sel) { extern fn valid_attributes_for_marked_text(_this: &Object, _sel: Sel) -> id { //println!("validAttributesForMarkedText"); - unsafe { msg_send![class("NSArray"), array] } + unsafe { msg_send![class!(NSArray), array] } } extern fn attributed_substring_for_proposed_range( @@ -265,7 +265,7 @@ extern fn insert_text(this: &Object, _sel: Sel, string: id, _replacement_range: let state_ptr: *mut c_void = *this.get_ivar("winitState"); let state = &mut *(state_ptr as *mut ViewState); - let has_attr = msg_send![string, isKindOfClass:class("NSAttributedString")]; + let has_attr = msg_send![string, isKindOfClass:class!(NSAttributedString)]; let characters = if has_attr { // This is a *mut NSAttributedString msg_send![string, string] @@ -282,7 +282,7 @@ extern fn insert_text(this: &Object, _sel: Sel, string: id, _replacement_range: state.last_insert = Some(string.to_owned()); // We don't need this now, but it's here if that changes. - //let event: id = msg_send![class("NSApp"), currentEvent]; + //let event: id = msg_send![class!(NSApp), currentEvent]; let mut events = VecDeque::with_capacity(characters.len()); for character in string.chars() { @@ -400,7 +400,7 @@ extern fn key_down(this: &Object, _sel: Sel, event: id) { // Some keys (and only *some*, with no known reason) don't trigger `insertText`, while others do... // So, we don't give repeats the opportunity to trigger that, since otherwise our hack will cause some // keys to generate twice as many characters. - let array: id = msg_send![class("NSArray"), arrayWithObject:event]; + let array: id = msg_send![class!(NSArray), arrayWithObject:event]; let (): _ = msg_send![this, interpretKeyEvents:array]; } } diff --git a/src/platform/macos/window.rs b/src/platform/macos/window.rs index d025467e..a210bfcf 100644 --- a/src/platform/macos/window.rs +++ b/src/platform/macos/window.rs @@ -421,7 +421,7 @@ impl WindowDelegate { INIT.call_once(|| unsafe { // Create new NSWindowDelegate - let superclass = Class::get("NSObject").unwrap(); + let superclass = class!(NSObject); let mut decl = ClassDecl::new("WinitWindowDelegate", superclass).unwrap(); // Add callback methods @@ -591,7 +591,7 @@ impl Window2 { pl_attribs: PlatformSpecificWindowBuilderAttributes, ) -> Result { unsafe { - if !msg_send![cocoa::base::class("NSThread"), isMainThread] { + if !msg_send![class!(NSThread), isMainThread] { panic!("Windows can only be created on the main thread on macOS"); } } @@ -728,7 +728,7 @@ impl Window2 { static INIT: std::sync::Once = std::sync::ONCE_INIT; INIT.call_once(|| unsafe { - let window_superclass = Class::get("NSWindow").unwrap(); + let window_superclass = class!(NSWindow); let mut decl = ClassDecl::new("WinitWindow", window_superclass).unwrap(); decl.add_method(sel!(canBecomeMainWindow), yes as extern fn(&Object, Sel) -> BOOL); decl.add_method(sel!(canBecomeKeyWindow), yes as extern fn(&Object, Sel) -> BOOL); @@ -987,7 +987,7 @@ impl Window2 { MouseCursor::ZoomOut => "arrowCursor", }; let sel = Sel::register(cursor_name); - let cls = Class::get("NSCursor").unwrap(); + let cls = class!(NSCursor); unsafe { use objc::Message; let cursor: id = cls.send_message(sel, ()).unwrap(); @@ -1004,7 +1004,7 @@ impl Window2 { #[inline] pub fn hide_cursor(&self, hide: bool) { - let cursor_class = Class::get("NSCursor").unwrap(); + let cursor_class = class!(NSCursor); // macOS uses a "hide counter" like Windows does, so we avoid incrementing it more than once. // (otherwise, `hide_cursor(false)` would need to be called n times!) if hide != self.cursor_hidden.get() {