+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
+