X-Git-Url: http://git.ithinksw.org/~jspiros/WindowBlur.git/blobdiff_plain/eda6452792ea372d3a6ef6e876845c55f41fbd93..HEAD:/WindowBlurSIMBL.m diff --git a/WindowBlurSIMBL.m b/WindowBlurSIMBL.m index 49b8bdc..c50f0e0 100644 --- a/WindowBlurSIMBL.m +++ b/WindowBlurSIMBL.m @@ -7,7 +7,7 @@ // #import "WindowBlurSIMBL.h" -#import "WindowBlurWindowHack.h" +#import "CGSInternal.h" #import void MethodSwizzle(Class aClass, SEL orig_sel, SEL alt_sel) @@ -34,6 +34,91 @@ void MethodSwizzle(Class aClass, SEL orig_sel, SEL alt_sel) } } +static NSMutableDictionary *instanceIDToIvars = nil; +static BOOL needToSwizzleDealloc = YES; + +@implementation WindowBlurWindowHack + +- (id)PRE__instanceID +{ + return [NSValue valueWithPointer:self]; +} + +- (NSMutableDictionary *)PRE__ivars +{ + NSMutableDictionary *ivars; + + if (needToSwizzleDealloc) + { + MethodSwizzle([NSWindow class], + @selector(dealloc), + @selector(PRE__deallocSwizzler)); + needToSwizzleDealloc = NO; + } + + if (instanceIDToIvars == nil) + { + instanceIDToIvars = [[NSMutableDictionary alloc] init]; + } + + ivars = [instanceIDToIvars objectForKey:[self PRE__instanceID]]; + if (ivars == nil) + { + ivars = [NSMutableDictionary dictionary]; + [instanceIDToIvars setObject:ivars forKey:[self PRE__instanceID]]; + } + + return ivars; +} + +- (void)PRE__deallocSwizzler +{ + [instanceIDToIvars removeObjectForKey:[self PRE__instanceID]]; + if ([instanceIDToIvars count] == 0) + { + [instanceIDToIvars release]; + instanceIDToIvars = nil; + } + + [self PRE__deallocSwizzler]; +} + +- (void)display { + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + if (floor(NSAppKitVersionNumber) > 824) { + NSString *filterName; + if (!(filterName = [[NSUserDefaults standardUserDefaults] stringForKey:@"WindowBlurSIMBL-FilterName"])) { + filterName = @"CIGaussianBlur"; + } + NSDictionary *filterValues; + if (!(filterValues = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"WindowBlurSIMBL-FilterValues"])) { + filterValues = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:2.0] forKey:@"inputRadius"]; + } + NSMutableDictionary *optionsDict = [NSMutableDictionary dictionaryWithDictionary:filterValues]; + if (![optionsDict objectForKey:@"inputCenter"]) { + [optionsDict setObject:[CIVector vectorWithX:0.0 Y:0.0] forKey:@"inputCenter"]; + } + CGSConnectionID con = CGSMainConnectionID(); + if (con) { + NSNumber *filterNumber; + int filter; + if (filterNumber = [[self PRE__ivars] objectForKey:@"filter"]) { + filter = [filterNumber intValue]; + CGSRemoveWindowFilter(con, [self windowNumber], filter); + } + if (noErr == CGSNewCIFilterByName(con, (CFStringRef)filterName, &filter)) { + CGSSetCIFilterValuesFromDictionary(con, filter, (CFDictionaryRef)optionsDict); + CGSAddWindowFilter(con, [self windowNumber], filter, kCGWindowFilterUnderlay); + [[self PRE__ivars] setObject:[NSNumber numberWithInt:filter] forKey:@"filter"]; + } + } + } + #endif + [super display]; +} + +@end + @implementation WindowBlurSIMBL + (void)load {