muda

#rust #gui

「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

出典

作成日時: 2026-09-06 23:14 / 更新日時: 2026-09-06 23:14