2016-12-29 1 views
2

NSTouchBar 버튼을 플러그인을 통해 다른 방법으로 수정할 수없는 애플리케이션에 노출시키는 지원을 추가하려고합니다. 공유 라이브러리 인 플러그인은 기본 창을 만든 후 런타임에로드됩니다. makeTouchBartouchBar 기능을 구현하는 @implmentation메인 윈도우가 생성 된 후 NSTouchBar 지원 추가하기

@interface AppDelegate : NSResponder <NSTouchBarDelegate> 
@end 

: 다음과 같이 내가 AppDelegate을 만든

- (NSTouchBar *) makeTouchBar 
- (nullable NSTouchBarItem *) touchBar:(NSTouchBar *)touchBar 
         makeItemForIdentifier: (NSTouchBarItemIdentifier)identifier 

마침내 응용 프로그램에 주입하는 시도를, 나는하여 다음 사항했다 onload 응용 프로그램에로드 될 때 동적 라이브러리에서 호출되는 함수입니다.

NSWindow *w = [NSApp mainWindow]; 

AppDelegate *a = [[AppDelegate alloc] init]; 
a.nextResponder = w.nextResponder; 
w.nextResponder = a; 

// Re-setting FirstResponder will trigger AppDelegate::makeTouchBar 
// that was attached above. 
NSResponder *n = w.firstResponder; 
[w makeFirstResponder: nil]; 
[w makeFirstResponder: n]; 

그러나 ... AppDelegate::touchBar는 호출되지 않을 것이다, 따라서 touchbar은 내 테스트 버튼으로 채워되지 않습니다.

내가 엑스 코드에서 새 프로젝트를 만들고, 모두 표시 및 이벤트를 눌러 응답하는, 내가 기능 버튼을 얻을 동일한 AppDelegate 구현 (같은 @interface@implementation의 복사 - 붙여 넣기)를 사용, 그래서 주입의 경우

부러진 부분. (Xcode의 모든 것을 나는 추측 MainMenu.xib를 통해 매여)

업데이트 : 가장 큰 문제는 응용 프로그램이 TouchBar이 일을 방지하는 방식으로 컴파일 된 것이 었습니다. 아마도 이전 버전의 Mac OS에서 제작되었을 것입니다.

답변

1

이 객체가 주 응용 프로그램 위임자 체인 (실제로 NSApp의 delegate으로 설정하는 것이 좋습니다)에서 실제로 응용 프로그램 위임자 (이름에서 알 수 있듯이) 역할을해야하는 경우 설정된 대리자의 touchBar는 터치 막대를 만들 때도 사용됩니다 (NSTouchBar Discovery and the Responder Chain 참조).

플러그인에서 작동하지 않는 경우 (응용 프로그램에 이미 필요한 특정 응용 프로그램 대리인이있을 수 있음) mainWindow 대신 NSApp의 응답자 체인에 삽입 할 수 있습니다.

두 가지 모두 터치 창을 창보다는 응용 프로그램 수준에서 연결하는 이점이 있습니다. 따라서 메인/키 윈도우가 변경되면 제공된 터치 바가 항상 사용됩니다.

+0

NSApp.delegate를 설정할 때 아무런 문제가 없었습니다. 이전과 같이 작동합니다. 내 AppDelegate의 touchBar는 여전히 호출되지 않습니다. NSApp.delegate = myappdelegate, myappdelegate.touchBar = nil, NSApp.touchBar = nil, myappdelegate.nextResponder = NSApp.nextResponder, NSApp.nextResponder = myappdelegate를 설정하려고했습니다. 문제의 응용 프로그램은 Emacs이며, 평가할 때로드 된 네이티브 elisp 모듈을 통해 터치 막대를 추가하려고합니다 (모듈로드 "/ path/to/module"). – dsvensson

+0

myappdelegate.touchBar는 여전히 makeTouchBar에 의해 생성됩니다. myappdelegate.touchBar를 NSApp.touchBar에 할당하려고했지만 여전히 터치 바가 없습니다. – dsvensson

+0

터치 막대를 삽입하려고하는 응용 프로그램 (이 경우 Emacs)이 터치바 지원을 사용할 수없는 옵션으로 컴파일 될 수 있습니까? https://emacsformacosx.com/의 최신 버전을 사용하고 있습니다. – dsvensson

관련 문제