I would like to execute a function (say print something to the console), when a menu item in the systray is clicked. I just can't figure out how to do this. In Swift for example it would simply be
@objc func menuItemClick() {
print("Clicked a menu item.")
}
I tried to replicate the same behaviour in Rust, but failed, because I was unable to figure out how to declare a custom objective C function, that will print something to the console:
use cocoa::{
appkit::{
NSApp, NSApplication, NSApplicationActivationPolicy::NSApplicationActivationPolicyRegular,
NSMenu, NSMenuItem, NSSquareStatusItemLength, NSStatusBar, NSStatusItem,
NSWindow,
},
base::{nil, selector},
foundation::{NSAutoreleasePool, NSString},
};
fn main() {
unsafe {
let app = NSApp();
app.setActivationPolicy_(NSApplicationActivationPolicyRegular);
//app.activateIgnoringOtherApps_(cocoa::base::YES); // We probably don't want this when creating a tray menu.
let status_bar = NSStatusBar::systemStatusBar(app);
let status_item = status_bar.statusItemWithLength_(NSSquareStatusItemLength);
let title = NSString::alloc(nil).init_str("😀");
status_item.button().setTitle_(title);
let status_bar_menu = NSMenu::new(nil).autorelease();
let quit_title = NSString::alloc(nil).init_str("Quit ");
let quit_action = selector("applicationShouldTerminate:");
let quit_key = NSString::alloc(nil).init_str("q");
let quit_item = NSMenuItem::alloc(nil)
.initWithTitle_action_keyEquivalent_(quit_title, quit_action, quit_key)
.autorelease();
status_bar_menu.addItem_(quit_item);
status_item.setMenu_(status_bar_menu);
app.setMenu_(status_bar_menu);
app.run();
}
}
How can I execute a Rust function, when the "Quit" entry is clicked?