如何在OSX 10.9(Mavericks)上使用CIFilter处理NSWindow?

11

由于某些原因,在Mavericks中使用涉及私有API CGSAddWindowFilter()的老技巧似乎不再奏效。我尝试了一些在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中重新工作。

2个回答

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
两个月前来这里是白来了。但这次不同!只是想知道,这在10.8及以下版本中的表现如何? - Matthieu Riegler
1
我昨天来这里是白来了,然后我决定反向工程Terminal.app并找到了这个 :) 我不知道它是否与旧的OSX版本兼容,但我会测试它并让你知道。 - Guilherme Rambo
我无法在10.8上进行测试,因为在Parallels中这些效果不起作用,但是来自10.8的Terminal.app使用此函数,所以我猜它应该可以工作。 - Guilherme Rambo
这似乎是添加了模糊滤镜。有没有办法向窗口添加其他的过滤器呢?谢谢! - EightyEight

-3

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

这是创建滤镜的方法,将任何滤镜类型写在引号内即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接