2013-10-24 1 views
11

비공개 API CGSAddWindowFilter() 사용과 관련된 이전 트릭은 어떤 이유로 Mavericks에서 더 이상 작동하지 않는 것 같습니다. How does on-screen color inversion work in OS X?에 설명 된 일부 코드를 시도했는데 아래 코드는 다음과 같습니다. window.OSW 10.9 (Mavericks)에서 NSWindow에서 CIFilter를 사용하는 방법은 무엇입니까?

#import "AppDelegate.h" 

//Declarations to avoid compiler warnings (because of private APIs): 
typedef void * CGSConnection; 
typedef void * CGSWindowID; 
extern OSStatus CGSNewConnection(const void **attributes, CGSConnection * id); 
typedef void *CGSWindowFilterRef; 
extern CGError CGSNewCIFilterByName(CGSConnection cid, CFStringRef filterName, CGSWindowFilterRef *outFilter); 
extern CGError CGSAddWindowFilter(CGSConnection cid, CGSWindowID wid, CGSWindowFilterRef filter, int flags); 
extern CGError CGSSetCIFilterValuesFromDictionary(CGSConnection cid, CGSWindowFilterRef filter, CFDictionaryRef filterValues); 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [self.window setOpaque:NO]; 
    [self.window setAlphaValue:1.0]; 
    [self.window setBackgroundColor:[NSColor colorWithCalibratedWhite:0.0 alpha:0.1]]; 
    self.window.level = NSDockWindowLevel; 

    CGSConnection thisConnection; 
    CGSWindowFilterRef compositingFilter; 
    int compositingType = 1; // under the window 

    /* Make a new connection to CoreGraphics */ 
    CGSNewConnection(NULL, &thisConnection); 

    /* Create a CoreImage filter and set it up */ 
    CGSNewCIFilterByName(thisConnection, CFSTR("CIColorInvert"), &compositingFilter); 
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:3.0] forKey:@"inputRadius"]; 
    CGSSetCIFilterValuesFromDictionary(thisConnection, compositingFilter, (__bridge CFDictionaryRef)options); 

    /* Now apply the filter to the window */ 
    CGSAddWindowFilter(thisConnection, (CGSWindowID)[self.window windowNumber], compositingFilter, compositingType); 
} 

@end 

누구나 OSX 10.8 에서처럼 필터를 배경에 적용하는 방법을 알고 있습니까?

MenuBarFilter을 (를) 비공개로 다시 작동 시키려면이 기능이 필요합니다.

답변

-4

CIFilter * filter = [CIFilter filterWithName : @ ""];

이, 필터를 만들 사이의 필터 유형을 작성하는 방법이다 ""이

7

당신이 이동 :

typedef void * CGSConnection; 
extern OSStatus CGSSetWindowBackgroundBlurRadius(CGSConnection connection, NSInteger windowNumber, int radius); 
extern CGSConnection CGSDefaultConnectionForThread(); 

- (void)enableBlurForWindow:(NSWindow *)window 
{ 
    [window setOpaque:NO]; 
    window.backgroundColor = [NSColor colorWithCalibratedWhite:1.0 alpha:0.5]; 

    CGSConnection connection = CGSDefaultConnectionForThread(); 
    CGSSetWindowBackgroundBlurRadius(connection, [window windowNumber], 20); 
} 
+1

2 개월 전 아무 것도 없습니다. 하지만 이번엔 안돼! 그냥 알다시피, 10.8 이하에서는 어떻게 동작합니까? –

+1

어제 여기에 왔는데, Terminal.app을 리버스 엔지니어링하기로 결정했는데 이것을 발견했습니다. 이전 OSX 버전과 호환되는지는 모르겠지만 테스트해볼 것입니다. –

+0

Parallels에서이 효과가 작동하지 않지만 10.8의 Terminal.app에서이 함수를 사용하기 때문에 10.8에서 테스트 할 수 없습니다. –

0

이 솔루션을 사용하지 마십시오. 이 API의 사용으로 인해 신청이 거부되었습니다 (개인 Api입니다).

애플은 아래 respose 내 응용 프로그램 거부 :

는 "비 공개 API의 사용은 이러한 API는 향후 변경해야 사용자 만족도를 떨어 뜨린다 수, 따라서 허용되지 않습니다.을 응용 프로그램에는 프레임 워크 의 CGSSetWindowBackgroundBlurRadius가 포함되어 있습니다. '/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics'. "