Как использовать CIFilter для NSWindow в OSX 10.9 (Mavericks)?

Старый трюк, связанный с использованием частного API CGSAddWindowFilter(), по-видимому, больше не работает в Mavericks. Я пробовал код, описанный в Как работает инверсия цвета на экране в OS X?, а приведенный ниже код приводит к следующему окно.

#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 снова работать в Mavericks.

Ответ 1

Там вы идете:

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);
}

Ответ 2

Не используйте это решение. Мое приложение отклонено из-за использования этого API (это частный Api).

Apple отклонила мое приложение с нижеперечисленным:

"Использование непубличных API-интерфейсов может привести к эти API изменяются в будущем и поэтому не допускаются. Приложение включает: CGSSetWindowBackgroundBlurRadius из фреймворка" /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics".

Ответ 3

CIFilter * filter = [Фильтр CIFilterWithName: @""];

вот как создать фильтр, напишите любой тип фильтра между "