2013-10-24 22 views
11

Özel API CGSAddWindowFilter() kullanarak ilgili eski hile artık bir nedenden dolayı Mavericks çalıştığı görünüyor. How does on-screen color inversion work in OS X?'da açıklanan bazı kodları denedim ve aşağıdaki kod aşağıdaki window ile sonuçlanır.OSX 10.9'da (Mavericks) NSWindow üzerinde CIFilter nasıl kullanılır?

#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'deki gibi arka plana filtre uygulamak için bir hile bilen var mı?

Mavericks'de MenuBarFilter çalışmasını yeniden yapabilmek için buna ihtiyacım var.

cevap

-4

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

bu, bir filtre oluşturmak arasında herhangi filtre türü yazmaya nasıl "" Orada

7

gitmek:

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

Buraya 2 ay önce burada hiçbir sey için yok. Ama bu sefer değil ! Sadece bilmek, bu nasıl 10.8 ve altında nasıl davranır? –

+1

Dün hiçbir şey için gelmedim, daha sonra Terminal.app'ı tersine çevirmeye karar verdim ve bunu buldum :) Eski OSX sürümleriyle uyumlu olup olmadığını bilmiyorum, ancak bunu test edip size bildireceğim. –

+0

Bunu 10.8'de test edemiyorum çünkü Parallels'de bu efektler çalışmaz, ancak 10.8'deki Terminal.app bu işlevi kullanır, bu yüzden çalışır. –

0

bu çözümü kullanmayın. Bu API (Özel Api)'un kullanımı nedeniyle başvurum reddedildi.

Elma aşağıda Dayanma ile benim app reddedildi:

"kamuya açık olmayan API'leri kullanılması bu API'ler gelecekte değiştirmelisiniz olumsuz bir kullanıcı deneyimine yol açabilir ve bu nedenle izin verilmez. app şunları içerir: çerçeve '/System/Library/Frameworks/CoreGraphics.framework/Versions/AcCoreGraphics' CGSSetWindowBackgroundBlurRadius. "