アプリケーション名のメニューアイテムにイメージを表示する

アップルメニューの右隣、アプリケーションのバンドル名が表示されているところにアイコンを表示してみたいと思った。

メニューバーアプリや、メニューエクストラはメニューバーの多くの領域を占めるが、その数が多くなってくると MacBookMacBook Pro では手狭になってくる。メニューの沢山あるアプリケーションなんかだと、勢いメニューバーアプリのアイコンが見えなくなってしまうのだ。それを嫌ってメニューバーアプリやメニューエクストラは厳選して表示させるようにしていたのだが、それはそれでフラストレーションがたまるもの。

そんなとき、MinimumMenu というアプリケーションを知った。「File」や「Edit」などのメニュー項目を削除してバンドル名だけのメニュー項目を表示するアプリケーションだ。メニューバーアプリにアクセスしたい時にはこのアプリケーションに切り替えればよいわけだ。なんとソースコードも公開しているのが嬉しい。

せっかくメニューバーを広く使えるようにするアプリケーションなのに MinimumMenu という名前なのは長過ぎないかという気がするだろうが、それはそれ、実際には Minu という表示名になっている。しかしどうせなら、アイコンにすればもっと広く使えるのにと思ったのが、最初に書いた源なんだよね。

早速ソースコードをダウンロードして、リソースの MainMenu.nib をいじって適当な PNG イメージを設定してみた。しかし、残念ながらアプリケーション名のメニュー項目が表示されなくなってしまった。それはそれで当初の目的を達成しているともいえるのだが…。いくらなんでもこれはないよね。

そこで試しにということで別のメニュー項目を追加して、そこにイメージを設定してみたら、これはちゃんとアイコンが表示される。

よく考えてみると、アプリケーション名のメニュー項目って、nib で別の文字列「NewApplication」になっていてもちゃんとバンドル名が表示される。ということは、フレームワークの中でこのメニュー項目をいじっているということだ。

そこで awakeFromNib メソッドの中で、次のようにイメージを設定してみた。

MSImage *menuItemImage = [NSImage imageNamed:@"Menubar"];
[[[NSApp mainMenu] itemAtIndex:0] setImage:menuItemImage];

しかしこれでは、メニューバーに「...」と表示されるだけで、アイコンは表示されない。まあ、一歩前進したともいえるが、行き詰まってしまったともいえる。
一体何が起こっているのやら。アプリケーション名のメニュー項目にはイメージは設定できないという制限なのかなあ。でも、そういうアプリケーションを見たような記憶もあるのだが…。

そこで発想を変えて、アプリケーション名のメニュー項目の右隣に、アプリケーションのメニューの内容をそっくり移したメニューを作って、そのメニュー項目にイメージを設定し、awakeFromNib でアプリケーション名のメニュー項目を非表示にしてみた。

[[[NSApp mainMenu] itemAtIndex:0] setHidden:YES];

これで見た目はアプリケーション名がアイコンになっているように見える。でもなんか他に影響しそうな気がするなあ。