From d6fee6ff627e6ff08bf8bf9a2880197d0f07271e Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Sun, 26 Jan 2025 16:32:06 +0100 Subject: [PATCH] chore(deps): Use objc2 v0.6 (#226) This uses the new crates objc2-core-graphics and objc2-core-foundation. --- .changes/objc2-v6.md | 5 +++ Cargo.toml | 23 ++++++++---- examples/tao.rs | 6 +-- examples/winit.rs | 6 +-- src/platform_impl/macos/mod.rs | 69 +++++++++++++++------------------- 5 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 .changes/objc2-v6.md diff --git a/.changes/objc2-v6.md b/.changes/objc2-v6.md new file mode 100644 index 0000000..e83d98c --- /dev/null +++ b/.changes/objc2-v6.md @@ -0,0 +1,5 @@ +--- +"tray-icon": patch +--- + +Update `objc2` to v0.6. diff --git a/Cargo.toml b/Cargo.toml index 4841ccf..e508dbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,9 +39,20 @@ dirs = "5" gtk = "0.18" [target."cfg(target_os = \"macos\")".dependencies] -objc2 = "0.5.2" -objc2-foundation = { version = "0.2.2", features = [ +objc2 = "0.6.0" +objc2-core-graphics = { version = "0.3.0", default-features = false, features = [ + "std", + "CGDirectDisplay", +] } +objc2-core-foundation = { version = "0.3.0", default-features = false, features = [ + "std", + "CFCGTypes", + "CFRunLoop", +] } +objc2-foundation = { version = "0.3.0", default-features = false, features = [ + "std", "block2", + "objc2-core-foundation", "NSArray", "NSData", "NSEnumerator", @@ -49,7 +60,9 @@ objc2-foundation = { version = "0.2.2", features = [ "NSString", "NSThread", ] } -objc2-app-kit = { version = "0.2.2", features = [ +objc2-app-kit = { version = "0.3.0", default-features = false, features = [ + "std", + "objc2-core-foundation", "NSButton", "NSCell", "NSControl", @@ -64,10 +77,6 @@ objc2-app-kit = { version = "0.2.2", features = [ "NSView", "NSWindow", ] } -core-graphics = "0.24" - -[target."cfg(target_os = \"macos\")".dev-dependencies] -core-foundation = "0.10" [target."cfg(any(target_os = \"linux\", target_os = \"macos\"))".dependencies] png = "0.17" diff --git a/examples/tao.rs b/examples/tao.rs index c1cc557..2fad154 100644 --- a/examples/tao.rs +++ b/examples/tao.rs @@ -78,10 +78,10 @@ fn main() { // Tao only exposes a redraw method on the Window so we use core-foundation directly. #[cfg(target_os = "macos")] unsafe { - use core_foundation::runloop::{CFRunLoopGetMain, CFRunLoopWakeUp}; + use objc2_core_foundation::{CFRunLoopGetMain, CFRunLoopWakeUp}; - let rl = CFRunLoopGetMain(); - CFRunLoopWakeUp(rl); + let rl = CFRunLoopGetMain().unwrap(); + CFRunLoopWakeUp(&rl); } } diff --git a/examples/winit.rs b/examples/winit.rs index 9383460..75dd053 100644 --- a/examples/winit.rs +++ b/examples/winit.rs @@ -80,10 +80,10 @@ impl ApplicationHandler for Application { // Winit only exposes a redraw method on the Window so we use core-foundation directly. #[cfg(target_os = "macos")] unsafe { - use core_foundation::runloop::{CFRunLoopGetMain, CFRunLoopWakeUp}; + use objc2_core_foundation::{CFRunLoopGetMain, CFRunLoopWakeUp}; - let rl = CFRunLoopGetMain(); - CFRunLoopWakeUp(rl); + let rl = CFRunLoopGetMain().unwrap(); + CFRunLoopWakeUp(&rl); } } } diff --git a/src/platform_impl/macos/mod.rs b/src/platform_impl/macos/mod.rs index d8b10dd..47389aa 100644 --- a/src/platform_impl/macos/mod.rs +++ b/src/platform_impl/macos/mod.rs @@ -5,14 +5,15 @@ mod icon; use std::cell::{Cell, RefCell}; -use core_graphics::display::CGDisplay; use objc2::rc::Retained; -use objc2::{declare_class, msg_send, msg_send_id, mutability, ClassType, DeclaredClass}; +use objc2::{define_class, msg_send, AllocAnyThread, DeclaredClass, Message}; use objc2_app_kit::{ NSCellImagePosition, NSEvent, NSImage, NSMenu, NSStatusBar, NSStatusItem, NSTrackingArea, NSTrackingAreaOptions, NSVariableStatusItemLength, NSView, NSWindow, }; -use objc2_foundation::{CGPoint, CGRect, CGSize, MainThreadMarker, NSData, NSSize, NSString}; +use objc2_core_foundation::{CGPoint, CGRect, CGSize}; +use objc2_core_graphics::{CGDisplayPixelsHigh, CGMainDisplayID}; +use objc2_foundation::{MainThreadMarker, NSData, NSSize, NSString}; pub(crate) use self::icon::PlatformIcon; use crate::Error; @@ -86,8 +87,7 @@ impl TrayIcon { status_item: ns_status_item.retain(), menu_on_left_click: Cell::new(attrs.menu_on_left_click), }); - let tray_target: Retained = - msg_send_id![super(target), initWithFrame: frame]; + let tray_target: Retained = msg_send![super(target), initWithFrame: frame]; tray_target.setWantsLayer(true); button.addSubview(&tray_target); @@ -285,7 +285,7 @@ fn set_icon_for_ns_status_item_button( button.setImage(Some(&nsimage)); nsimage.setSize(new_size); // The image is to the right of the title - button.setImagePosition(NSCellImagePosition::NSImageLeft); + button.setImagePosition(NSCellImagePosition::ImageLeft); nsimage.setTemplate(icon_is_template); } } else { @@ -303,22 +303,15 @@ struct TrayTargetIvars { menu_on_left_click: Cell, } -declare_class!( +define_class!( + #[unsafe(super(NSView))] + #[name = "TaoTrayTarget"] + #[ivars = TrayTargetIvars] struct TrayTarget; - unsafe impl ClassType for TrayTarget { - type Super = NSView; - type Mutability = mutability::MainThreadOnly; - const NAME: &'static str = "TaoTrayTarget"; - } - - impl DeclaredClass for TrayTarget { - type Ivars = TrayTargetIvars; - } - - // Mouse events on NSResponder - unsafe impl TrayTarget { - #[method(mouseDown:)] + /// Mouse events on NSResponder + impl TrayTarget { + #[unsafe(method(mouseDown:))] fn on_mouse_down(&self, event: &NSEvent) { send_mouse_event( self, @@ -332,7 +325,7 @@ declare_class!( on_tray_click(self, MouseButton::Left); } - #[method(mouseUp:)] + #[unsafe(method(mouseUp:))] fn on_mouse_up(&self, event: &NSEvent) { let mtm = MainThreadMarker::from(self); unsafe { @@ -350,7 +343,7 @@ declare_class!( ); } - #[method(rightMouseDown:)] + #[unsafe(method(rightMouseDown:))] fn on_right_mouse_down(&self, event: &NSEvent) { send_mouse_event( self, @@ -364,7 +357,7 @@ declare_class!( on_tray_click(self, MouseButton::Right); } - #[method(rightMouseUp:)] + #[unsafe(method(rightMouseUp:))] fn on_right_mouse_up(&self, event: &NSEvent) { send_mouse_event( self, @@ -377,7 +370,7 @@ declare_class!( ); } - #[method(otherMouseDown:)] + #[unsafe(method(otherMouseDown:))] fn on_other_mouse_down(&self, event: &NSEvent) { let button_number = unsafe { event.buttonNumber() }; if button_number == 2 { @@ -393,7 +386,7 @@ declare_class!( } } - #[method(otherMouseUp:)] + #[unsafe(method(otherMouseUp:))] fn on_other_mouse_up(&self, event: &NSEvent) { let button_number = unsafe { event.buttonNumber() }; if button_number == 2 { @@ -409,38 +402,38 @@ declare_class!( } } - #[method(mouseEntered:)] + #[unsafe(method(mouseEntered:))] fn on_mouse_entered(&self, event: &NSEvent) { send_mouse_event(self, event, MouseEventType::Enter, None); } - #[method(mouseExited:)] + #[unsafe(method(mouseExited:))] fn on_mouse_exited(&self, event: &NSEvent) { send_mouse_event(self, event, MouseEventType::Leave, None); } - #[method(mouseMoved:)] + #[unsafe(method(mouseMoved:))] fn on_mouse_moved(&self, event: &NSEvent) { send_mouse_event(self, event, MouseEventType::Move, None); } } - // Tracking mouse enter/exit/move events - unsafe impl TrayTarget { - #[method(updateTrackingAreas)] + /// Tracking mouse enter/exit/move events + impl TrayTarget { + #[unsafe(method(updateTrackingAreas))] fn update_tracking_areas(&self) { unsafe { let areas = self.trackingAreas(); - for area in &areas { - self.removeTrackingArea(area); + for area in areas { + self.removeTrackingArea(&area); } let _: () = msg_send![super(self), updateTrackingAreas]; - let options = NSTrackingAreaOptions::NSTrackingMouseEnteredAndExited - | NSTrackingAreaOptions::NSTrackingMouseMoved - | NSTrackingAreaOptions::NSTrackingActiveAlways - | NSTrackingAreaOptions::NSTrackingInVisibleRect; + let options = NSTrackingAreaOptions::MouseEnteredAndExited + | NSTrackingAreaOptions::MouseMoved + | NSTrackingAreaOptions::ActiveAlways + | NSTrackingAreaOptions::InVisibleRect; let rect = CGRect { origin: CGPoint { x: 0.0, y: 0.0 }, size: CGSize { @@ -590,5 +583,5 @@ struct MouseClickEvent { /// This conversion happens to be symmetric, so we only need this one function /// to convert between the two coordinate systems. fn flip_window_screen_coordinates(y: f64) -> f64 { - CGDisplay::main().pixels_high() as f64 - y + unsafe { CGDisplayPixelsHigh(CGMainDisplayID()) as f64 - y } }