muda
「Menu Utilities for Desktop Applications」。Tauriチームが作っているRustのメニュークレートで、同じチームのtray-icon(システムトレイ用)と対になる。macOS/Windows/Linux・BSDのそれぞれでOSネイティブのメニューを作るのが方針。バージョンは0.19.3(2026年6月)、crates.ioのダウンロードは累計3,286万・recent 1,335万と、Tauriの土台としてよく使われている。
対応プラットフォームは Windows / macOS / Linux・BSD (GTK 3) / Linux・BSD (GTK 4)。GTK3とGTK4はcargo featureで排他的に選ぶ(gtkが既定、gtk4を使うときはdefault-features = falseが要る)。
メニューの「取り付け方」がプラットフォームごとに違う
Menuを組み立てるところまでは共通だが、それをどこに繋ぐかのAPIが分かれている。
| プラットフォーム | アプリのメニュー | コンテキストメニュー |
|---|---|---|
| macOS | Menu::init_for_nsapp() |
show_context_menu_for_nsview() |
| Windows | unsafe Menu::init_for_hwnd(hwnd) |
show_context_menu_for_hwnd() |
| Linux/BSD | Menu::init_for_gtk_window(window, container) |
show_context_menu_for_gtk_window() |
macOSは画面上部のメニューバー、Windowsはウィンドウ内のメニューバー(HMENU)、Linuxは指定したGTKコンテナの中、と出る場所も違う。init_for_hwndにはテーマを指定できるinit_for_hwnd_with_theme()もある。
GPUIがmacOSでしかOSメニューを作らず、Windows/Linuxではアプリ側に自前描画を任せている(GPUI Kitでのクロスプラットフォームなメニュー)のとは対照的な設計。3プラットフォームともOSに任せる代わりに、呼び出し側がプラットフォーム分岐を書く。
アクセラレータ
"CmdOrCtrl+Space"のような文字列をパースしてAcceleratorにする。CmdOrCtrlはmacOSでは⌘、それ以外ではCtrlに解決される。
Windowsには固有の落とし穴があり、win32のメッセージループがTranslateAcceleratorWを呼ばないとショートカットが効かない。Menu::haccel()でHACCELを取れるので、自前のイベントループを持つ場合はそこに組み込む必要がある。
PredefinedMenuItem
OSが役割を知っている標準項目をPredefinedMenuItemとして用意している。ラベル文字列はOption<&str>で上書きでき、NoneならOS既定の(ローカライズされた)ラベルになる。
- 編集系:
copy/cut/paste/paste_and_match_style/delete/select_all/undo/redo - ウィンドウ系:
minimize/maximize/zoom/fullscreen/hide/hide_others/show_all/close_window/bring_all_to_front - 表示系:
actual_size/zoom_in/zoom_out - アプリ系:
about(text, metadata)/services/quit/separator - macOS固有:
start_speaking/stop_speaking/start_dictation/emoji_and_symbols
paste_and_match_styleやstart_speakingのようにmacOSにしか対応物が無いものも含まれており、他のプラットフォームでは無効になる。
Linuxの依存
GTK3バックエンドのcopy/cut/paste/select_allは、libxdo(xdotool)を使ってキーストロークを合成することで実現している。そのため既定featureのlibxdoが有効だとlibxdoへのリンクが必要になる。GTK4バックエンドはこれを使わない。
# Debian/Ubuntu, GTK 3
sudo apt install libgtk-3-dev libxdo-dev
# Debian/Ubuntu, GTK 4
sudo apt install libgtk-4-dev
出典
- tauri-apps/muda - GitHub — README、
src/menu.rs、src/items/predefined.rs、src/accelerator/、CHANGELOG - muda - crates.io
- muda - docs.rs