| 11 | |
| 12 | impl Menu { |
| 13 | pub(super) fn new(event_scheduler: AppEventScheduler) -> Self { |
| 14 | // TODO: Remove as much app submenu special handling as possible |
| 15 | let app_submenu = Submenu::with_items("", true, &[]).unwrap(); |
| 16 | |
| 17 | let menu = MudaMenu::new(); |
| 18 | menu.prepend(&app_submenu).unwrap(); |
| 19 | |
| 20 | menu.init_for_nsapp(); |
| 21 | |
| 22 | MenuEvent::set_event_handler(Some(move |event: MenuEvent| { |
| 23 | let mtm = objc2::MainThreadMarker::new().expect("only ever called from main thread"); |
| 24 | let is_shortcut_triggered = objc2_app_kit::NSApplication::sharedApplication(mtm) |
| 25 | .mainMenu() |
| 26 | .map(|m| m.highlightedItem().is_some()) |
| 27 | .unwrap_or_default(); |
| 28 | if is_shortcut_triggered { |
| 29 | tracing::error!("A keyboard input triggered a menu event. This is most likely a bug. Please report!"); |
| 30 | return; |
| 31 | } |
| 32 | |
| 33 | let id = event.id().0.clone(); |
| 34 | event_scheduler.schedule(AppEvent::MenuEvent { id }); |
| 35 | })); |
| 36 | |
| 37 | Menu { inner: menu } |
| 38 | } |
| 39 | |
| 40 | pub(super) fn update(&self, entries: Vec<WrapperMenuItem>) { |
| 41 | let new_entries = menu_items_from_wrapper(entries); |