1

NPAPI Chrome ブラウザ プラグインの一部として、Mac OS のステータス バーにメニュー付きのステータス アイコンを表示する作業を行っています。

Firebreath は C++ を使用していますが、Mac OS 開発用のライブラリのほとんどは Objective C を使用しています。この質問に対する回答のおかげで、そのハードルを克服できました。また、XIB ファイルを NIB にコンパイルするには、CMake の設定を調整する必要がありました。

試行錯誤の結果、ステータスバーオプションをステータスバーに表示することはできましたが、クリックしてもメニューが展開されません。メニューを表示するために何をする必要があるのか​​ わかりません。Cocoa アプリケーションでは機能しますが、Firebreath アプリケーションでは機能しません。

Foundation ライブラリと Cocoa ライブラリもインポートしました。

MainMenu.xib ファイルまたは AppDelegate.m に問題があると思われます。

AppDelegate.m:

#import "AppDelegate.h"   

@implementation AppDelegate

-(void)awakeFromNib {
    NSLog(@"calling awakeFromNib...");

    NSStatusBar *bar = [NSStatusBar systemStatusBar];
    statusItem = [[bar statusItemWithLength:NSVariableStatusItemLength ] retain];


   // statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    //[statusItem retain];
    NSMenuItem *menuItem;


    menuItem = [[[NSMenuItem alloc] initWithTitle:@"Test" action:NULL keyEquivalent:@""] retain];
//    [menuItem setView: myView];
    statusMenu = [statusMenu initWithTitle:@"WTF"];
    [statusMenu addItem:menuItem];

    [menuItem retain];
    [statusItem setTitle: NSLocalizedString(@"StatusMenu",@"")];
    [statusItem setHighlightMode:YES];
    [statusItem setMenu:statusMenu];
    [statusItem setEnabled:YES];

    [statusMenu retain];

    // this was needed to get the icon to display
    [statusItem retain];
    //[window retain];
}

- (IBAction)settings:(id)sender {
    NSLog(@"Invoking the settings from the menu...");

}

//@synthesize window;
@end

このファイルはサンプル アプリから取得したもので、awakeFromNib は Objective C++ ラッパー クラスから手動で呼び出されています。ログと、ステータス バーに "StatusMenu" が表示されていることから、この関数が呼び出されていることがわかります。

MainMenu.xib のスクリーンショットも含めます。

MainMenu.xib:

MainMenu.xib

私が最後に試したのは、NSStatusItem を IBOutlet として追加して、xib ファイル内の何かに接続できるかどうかを確認することですが、これが正しい方向であるかどうかはよくわかりません。

[ステータス メニュー] オプションをクリックしたときにメニューを表示するには、何をする必要がありますか?

4

1 に答える 1

0

ここでの問題は、FirebreathプロジェクトとNPAPIプラグインアーキテクチャが自動参照カウント(ARC)をサポートしていないことです。これは、XCodeプロジェクトでは通常デフォルトでオンになっています。

さらに、ObjectiveCとC++の混合の狂気のため、XCodeは、コードが純粋にObjective Cで記述されているかのように、エラーを簡単に報告することはできません。したがって、エラーメッセージは抑制されます。エラーを回避するために、NPAPIプラグインアーキテクチャを使用する開発者は、NSMenuオブジェクトでallocを呼び出すことにより、メモリを明示的に管理する必要があります。

これらのオブジェクトでallocが呼び出されている限り、それらは適切に保持されます。これで問題が解決します。

于 2012-10-19T02:20:19.863 に答える