2012-09-18 2 views
1

NPAPI Chrome 브라우저 플러그인의 일부로 Mac OS 상태 표시 줄에 메뉴가있는 상태 아이콘을 표시하려고합니다.FireBreath NPAPI 플러그인의 NSStatusItem에 NSMenu를 연결하여 StatusBar Item을 클릭 할 때 메뉴가 나타나게하는 방법은 무엇입니까?

Firebreath는 C++을 사용하고 Mac OS 개발 용 라이브러리의 대부분은 목표 C를 사용합니다. this question의 응답 덕분에 장애물을 극복했습니다. 또한 XIB 파일을 NIB로 컴파일하기 위해 CMake 설정을 조정해야했습니다.

시행 착오 끝에 상태 표시 줄 옵션을 상태 표시 줄에 표시 할 수 있었지만 클릭하면 메뉴가 확장되지 않습니다. 메뉴를 표시하려면 무엇을해야하는지 잘 모르겠습니다. 그것은 코코아 응용 프로그램에서 작동하지만 Firebreath 응용 프로그램에서는 작동하지 않습니다.

재단 및 코코아 라이브러리도 가져 왔습니다.

문제가 내 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은 목표 C++ 래퍼 클래스에서 수동으로 호출되고있다. 로그마다, 그리고 상태 표시 줄에 "StatusMenu"가 있다는 사실을 알기 때문에이 함수가 호출되었음을 알았습니다.

MainMenu.xib :

나는 또한 MainMenu.xib의 스크린 샷을 포함

MainMenu.xib

내가 있는지 확인하기 위해 함께 IBOutlet으로 NSStatusItem을 추가하려고했습니다 마지막 것은 xib 파일의 내용에 연결할 수는 있지만 이것이 올바른 방향인지는 확실치 않습니다.

상태 메뉴 옵션을 클릭 할 때 표시 할 메뉴를 얻으려면 어떻게해야합니까?

+0

"awakeFromNib"이 Objective C++에서 수동으로 호출된다고 말하면'NSBundle' 또는'NSNib'를 사용하고 있습니까? 그렇지 않다면 그렇게 할 필요가 있다고 생각합니다. 아마도 [Nib Object Life Cycle] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW18) 또는 [프로그래밍 방식으로 Nib 파일로드하기] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW24) 도움이 될 것입니다. –

+0

안녕하세요 @ JoshCaswell, 샘플 응용 프로그램에서, 나는 그것이 응용 프로그램을로드 처리하는 다른 프로세스에 의해 호출되었다고 생각하지만, Firebreath 프레임 워크는 C + + 및 응용 프로그램을 시작하는 다른 메커니즘을 사용합니다. 나는 Objective C++ wrapper에서 awakeFromNib을 호출하고있다. NSBundle과 NSLib 및 그 링크를 살펴 보겠습니다. 팁 고마워; 나는 더 많은 것을 배울 때 나의 질문을 업데이트 할 것이다. – jmort253

+0

NSApplication이 없기 때문에 NSApplication을 만들지 못할 수도 있습니다. 이들은 다른 누군가의 과정에서 살아가는 데있어서의 단점입니다. – taxilian

답변

0

Firebreath 프로젝트와 NPAPI 플러그인 아키텍처는 자동 참조 카운팅 (ARC)을 지원하지 않습니다. 자동 참조 카운팅 (ARC)은 일반적으로 Xcode 프로젝트에서 기본적으로 설정됩니다.

또한 Objective C와 C++를 혼동하게되어서 Xcode는 실제로 코드가 Objective C로 작성된 것처럼 쉽게 오류를보고 할 수 없습니다. 따라서 오류 메시지가 표시되지 않습니다. 오류를 피하기 위해 NPAPI 플러그인 아키텍처로 작업하는 개발자는 NSMenu 객체에 대해 alloc을 호출하여 메모리를 명시 적으로 관리해야합니다.

이러한 개체에 대해 alloc을 호출하면 해당 개체가 올바르게 유지됩니다. 이렇게하면 문제가 해결됩니다.