1

作为 NPAPI Chrome 浏览器插件的一部分,我正在努力获取一个带有菜单的状态图标,以显示在 Mac OS 状态栏中。

Firebreath 使用 C++,而大多数用于 Mac OS 开发的库都使用 Objective C。感谢对这个问题的回答,我克服了这个障碍。我还必须调整我的 CMake 设置才能将 XIB 文件编译为 NIB。

经过反复试验,我能够让状态栏选项出现在状态栏中,但是当我单击它时,菜单不会展开。我不确定我需要做什么才能显示菜单。它适用于 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

该文件是从示例应用程序中获取的,并且正在从 Objective C++ 包装类手动调用 awakeFromNib。根据日志,以及我在状态栏中看到“StatusMenu”的事实,我知道正在调用此函数。

我还包括 MainMenu.xib 的屏幕截图:

主菜单.xib:

主菜单.xib

我尝试的最后一件事是将 NSStatusItem 添加为 IBOutlet 以查看是否可以将其连接到 xib 文件中的某些内容,但我不确定这是正确的方向。

单击“状态菜单”选项时需要做什么才能显示菜单?

4

1 回答 1

0

这里的问题是 Firebreath 项目和 NPAPI 插件架构不支持自动引用计数(ARC),通常在 XCode 项目中默认开启。

此外,由于将 Objective C 与 C++ 混合的疯狂,XCode 并不能像纯粹用 Objective C 编写代码那样容易地报告错误。因此,错误消息被抑制了。为了避免错误,使用 NPAPI 插件架构的开发人员必须通过在 NSMenu 对象上调用 alloc 来显式管理内存。

只要对这些对象调用 alloc,它们就会被正确保留。这解决了问题。

于 2012-10-19T02:20:19.863 回答