From 65d888db325c0fc4375da31f42e2db11fb8ed69e Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 8 Jan 2026 01:29:06 +0800 Subject: [PATCH 1/3] Add basic menu bar icons --- Cargo.toml | 2 +- src/app.rs | 1 + src/app/menubar.rs | 35 +++++++++++++++++++++++++++++++++++ src/app/tile/elm.rs | 5 +++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/app/menubar.rs diff --git a/Cargo.toml b/Cargo.toml index 6a0950b..669ae9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ iced = { version = "0.14.0", features = ["image", "tokio"] } icns = "0.3.1" image = "0.25.9" objc2 = "0.6.3" -objc2-app-kit = "0.3.2" +objc2-app-kit = { version = "0.3.2", features = ["NSImage"] } objc2-application-services = { version = "0.3.2", default-features = false, features = [ "HIServices", "Processes", diff --git a/src/app.rs b/src/app.rs index f9f740a..e0145cd 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,6 +3,7 @@ use crate::clipboard::ClipBoardContentType; use crate::commands::Function; pub mod apps; +pub mod menubar; pub mod tile; use iced::window::{self, Id, Settings}; diff --git a/src/app/menubar.rs b/src/app/menubar.rs new file mode 100644 index 0000000..e49152a --- /dev/null +++ b/src/app/menubar.rs @@ -0,0 +1,35 @@ +use objc2::{MainThreadMarker, sel}; +use objc2_app_kit::{NSImage, NSMenu, NSMenuItem, NSStatusBar, NSVariableStatusItemLength}; +use objc2_foundation::{NSSize, NSString}; + +pub fn new_menu_icon(mtm: MainThreadMarker) { + let status_bar = NSStatusBar::systemStatusBar(); + let status_item = status_bar.statusItemWithLength(NSVariableStatusItemLength); + + if let Some(button) = status_item.button(mtm) { + if let Some(image) = NSImage::imageNamed(&NSString::from_str("icon")) { + image.setSize(NSSize { + width: 25., + height: 25., + }); + button.setImage(Some(&image)); + } + } + + let menu = NSMenu::new(mtm); + menu.setAutoenablesItems(true); + + let quit_title = NSString::from_str("Quit RustCast"); + let quit_item = unsafe { + NSMenuItem::initWithTitle_action_keyEquivalent( + mtm.alloc(), + &quit_title, + sel!(terminate:).into(), // note the colon + &NSString::from_str("q"), + ) + }; + menu.addItem(&quit_item); + + status_item.setMenu(Some(&menu)); + status_item.setVisible(true); +} diff --git a/src/app/tile/elm.rs b/src/app/tile/elm.rs index 0526fb7..69230d2 100644 --- a/src/app/tile/elm.rs +++ b/src/app/tile/elm.rs @@ -6,6 +6,7 @@ use iced::widget::{Column, Scrollable, space}; use iced::window; use iced::{Element, Task}; use iced::{Length::Fill, widget::text_input}; +use objc2::MainThreadMarker; use rayon::{ iter::{IntoParallelRefIterator, ParallelIterator}, slice::ParallelSliceMut, @@ -25,6 +26,7 @@ pub fn default_app_paths() -> Vec { } use crate::app::apps::AppCommand; +use crate::app::menubar::new_menu_icon; use crate::config::Theme; use crate::{ app::{Message, Page, apps::App, default_settings, tile::Tile}, @@ -47,6 +49,9 @@ pub fn new(keybind_id: u32, config: &Config) -> (Tile, Task) { let paths = default_app_paths(); + let mtm = MainThreadMarker::new().unwrap(); + new_menu_icon(mtm); + let mut options: Vec = paths .par_iter() .map(|path| get_installed_apps(path, store_icons)) From 2f11779485d5d9743555768ae192f4863d147bcd Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 8 Jan 2026 08:47:50 +0800 Subject: [PATCH 2/3] Add a running from binary rustcast icon --- src/app/menubar.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/menubar.rs b/src/app/menubar.rs index e49152a..b78513f 100644 --- a/src/app/menubar.rs +++ b/src/app/menubar.rs @@ -7,6 +7,7 @@ pub fn new_menu_icon(mtm: MainThreadMarker) { let status_item = status_bar.statusItemWithLength(NSVariableStatusItemLength); if let Some(button) = status_item.button(mtm) { + button.setTitle(&NSString::from_str("RustCast")); if let Some(image) = NSImage::imageNamed(&NSString::from_str("icon")) { image.setSize(NSSize { width: 25., @@ -24,7 +25,7 @@ pub fn new_menu_icon(mtm: MainThreadMarker) { NSMenuItem::initWithTitle_action_keyEquivalent( mtm.alloc(), &quit_title, - sel!(terminate:).into(), // note the colon + sel!(terminate:).into(), &NSString::from_str("q"), ) }; From e84ed41256102827e776bf960f5c2c3c005d6aae Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 8 Jan 2026 09:37:59 +0800 Subject: [PATCH 3/3] Add version item to menu bar --- src/app/menubar.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/app/menubar.rs b/src/app/menubar.rs index b78513f..6250f65 100644 --- a/src/app/menubar.rs +++ b/src/app/menubar.rs @@ -18,7 +18,7 @@ pub fn new_menu_icon(mtm: MainThreadMarker) { } let menu = NSMenu::new(mtm); - menu.setAutoenablesItems(true); + menu.setAutoenablesItems(false); let quit_title = NSString::from_str("Quit RustCast"); let quit_item = unsafe { @@ -29,7 +29,17 @@ pub fn new_menu_icon(mtm: MainThreadMarker) { &NSString::from_str("q"), ) }; + + let version_title = NSString::from_str( + &("RustCast Version: ".to_string() + + option_env!("APP_VERSION").unwrap_or("Unknown Version")), + ); + let version_item = NSMenuItem::new(mtm); + version_item.setTitle(&version_title); + version_item.setEnabled(false); + menu.addItem(&quit_item); + menu.addItem(&version_item); status_item.setMenu(Some(&menu)); status_item.setVisible(true);