Revision: 3887
          http://skim-app.svn.sourceforge.net/skim-app/?rev=3887&view=rev
Author:   hofman
Date:     2008-05-17 07:41:04 -0700 (Sat, 17 May 2008)

Log Message:
-----------
Don't use an observation context for KVO observation of 
NSUserDefaultsController. Some crashes with it have been reported on MacIntel. 
No idea if it is a bug in NSUserDefaultsController or the fact that static 
NSString*s are used as context.

Modified Paths:
--------------
    trunk/SKBookmarkController.m
    trunk/SKMainWindowController.m
    trunk/SKNoteWindowController.m
    trunk/SKPDFDocument.m
    trunk/SKPDFView.m
    trunk/SKPreferenceController.m
    trunk/SKSnapshotWindowController.m

Modified: trunk/SKBookmarkController.m
===================================================================
--- trunk/SKBookmarkController.m        2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKBookmarkController.m        2008-05-17 14:41:04 UTC (rev 3887)
@@ -71,8 +71,6 @@
 static NSString *SKRecentDocumentAliasDataKey = @"_BDAlias";
 static NSString *SKRecentDocumentSnapshotsKey = @"snapshots";
 
-static NSString *SKBookmarkDefaultsObservationContext = 
@"SKBookmarkDefaultsObservationContext";
-
 @implementation SKBookmarkController
 
 static unsigned int maxRecentDocumentsCount = 0;
@@ -778,21 +776,21 @@
     NSNumber *fontSize = [[NSUserDefaults standardUserDefaults] 
objectForKey:SKTableFontSizeKey];
     if (fontSize)
         [self setFont:[NSFont systemFontOfSize:[fontSize floatValue]]];
-    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKTableFontSizeKey context:SKBookmarkDefaultsObservationContext];
+    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKTableFontSizeKey context:NULL];
 }
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKBookmarkDefaultsObservationContext) {
-        if (NO == [keyPath hasPrefix:@"values."])
-            return;
-        NSString *key = [keyPath substringFromIndex:7];
-        if ([key isEqualToString:SKTableFontSizeKey]) {
-            NSFont *font = [NSFont systemFontOfSize:[[NSUserDefaults 
standardUserDefaults] floatForKey:SKTableFontSizeKey]];
-            [self setFont:font];
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if ([key isEqualToString:SKTableFontSizeKey]) {
+                NSFont *font = [NSFont systemFontOfSize:[[NSUserDefaults 
standardUserDefaults] floatForKey:SKTableFontSizeKey]];
+                [self setFont:font];
+                return;
+            }
         }
-    } else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
     }
+    [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
 }
 
 @end

Modified: trunk/SKMainWindowController.m
===================================================================
--- trunk/SKMainWindowController.m      2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKMainWindowController.m      2008-05-17 14:41:04 UTC (rev 3887)
@@ -129,7 +129,6 @@
 static NSString *SKMainWindowFrameAutosaveName = @"SKMainWindow";
 
 static NSString *SKPDFAnnotationPropertiesObservationContext = 
@"SKPDFAnnotationPropertiesObservationContext";
-static NSString *SKMainWindowDefaultsObservationContext = 
@"SKMainWindowDefaultsObservationContext";
 
 NSString *SKLeftSidePaneWidthKey = @"SKLeftSidePaneWidth";
 NSString *SKRightSidePaneWidthKey = @"SKRightSidePaneWidth";
@@ -3261,7 +3260,7 @@
                                   SKThumbnailSizeKey, 
SKSnapshotThumbnailSizeKey, 
                                   SKShouldAntiAliasKey, 
SKGreekingThresholdKey, 
                                   SKTableFontSizeKey, nil]
-        context:SKMainWindowDefaultsObservationContext];
+        context:NULL];
 }
 
 - (void)unregisterAsObserver {
@@ -3324,10 +3323,10 @@
 #pragma mark KVO
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKMainWindowDefaultsObservationContext) {
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
         
         // A default value that we are observing has changed
-        NSString *key = [keyPath substringFromIndex:7];
+        NSString *key = [keyPath hasPrefix:@"values."] ? [keyPath 
substringFromIndex:7] : nil;
         if ([key isEqualToString:SKBackgroundColorKey]) {
             if ([self isFullScreen] == NO && [self isPresentation] == NO)
                 [pdfView setBackgroundColor:[[NSUserDefaults 
standardUserDefaults] colorForKey:SKBackgroundColorKey]];

Modified: trunk/SKNoteWindowController.m
===================================================================
--- trunk/SKNoteWindowController.m      2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKNoteWindowController.m      2008-05-17 14:41:04 UTC (rev 3887)
@@ -54,7 +54,6 @@
 
 static NSString *SKNoteWindowPageObservationContext = 
@"SKNoteWindowPageObservationContext";
 static NSString *SKNoteWindowBoundsObservationContext = 
@"SKNoteWindowBoundsObservationContext";
-static NSString *SKNoteWindowDefaultsObservationContext = 
@"SKNoteWindowDefaultsObservationContext";
 
 @implementation SKNoteWindowController
 
@@ -100,7 +99,7 @@
         
         [note addObserver:self forKeyPath:SKPDFAnnotationPageKey options:0 
context:SKNoteWindowPageObservationContext];
         [note addObserver:self forKeyPath:SKPDFAnnotationBoundsKey options:0 
context:SKNoteWindowBoundsObservationContext];
-        [[NSUserDefaultsController sharedUserDefaultsController] 
addObserver:self forKeys:[NSArray arrayWithObjects:SKAnchoredNoteFontNameKey, 
SKAnchoredNoteFontSizeKey, nil] context:SKNoteWindowDefaultsObservationContext];
+        [[NSUserDefaultsController sharedUserDefaultsController] 
addObserver:self forKeys:[NSArray arrayWithObjects:SKAnchoredNoteFontNameKey, 
SKAnchoredNoteFontSizeKey, nil] context:NULL];
     }
     return self;
 }
@@ -293,21 +292,22 @@
 }
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKNoteWindowDefaultsObservationContext) {
-        if (NO == [keyPath hasPrefix:@"values."])
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if (([key isEqualToString:SKAnchoredNoteFontNameKey] || [key 
isEqualToString:SKAnchoredNoteFontSizeKey]) && [self isNoteType] && [[textView 
string] length] == 0) {
+                NSString *fontName = [[NSUserDefaults standardUserDefaults] 
stringForKey:SKAnchoredNoteFontNameKey];
+                float fontSize = [[NSUserDefaults standardUserDefaults] 
floatForKey:SKAnchoredNoteFontSizeKey];
+                NSFont *font = fontName ? [NSFont fontWithName:fontName 
size:fontSize] : nil;
+                if (font)
+                    [textView setFont:font];
+            }
             return;
-        NSString *key = [keyPath substringFromIndex:7];
-        if (([key isEqualToString:SKAnchoredNoteFontNameKey] || [key 
isEqualToString:SKAnchoredNoteFontSizeKey]) && [self isNoteType] && [[textView 
string] length] == 0) {
-            NSString *fontName = [[NSUserDefaults standardUserDefaults] 
stringForKey:SKAnchoredNoteFontNameKey];
-            float fontSize = [[NSUserDefaults standardUserDefaults] 
floatForKey:SKAnchoredNoteFontSizeKey];
-            NSFont *font = fontName ? [NSFont fontWithName:fontName 
size:fontSize] : nil;
-            if (font)
-                [textView setFont:font];
         }
     } else if (context == SKNoteWindowBoundsObservationContext || context == 
SKNoteWindowPageObservationContext) {
         [self updateStatusMessage];
-    } else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
+        return;
     }
+    [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
 }
 @end

Modified: trunk/SKPDFDocument.m
===================================================================
--- trunk/SKPDFDocument.m       2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKPDFDocument.m       2008-05-17 14:41:04 UTC (rev 3887)
@@ -83,8 +83,6 @@
 static NSString *SKAutoRotatePrintedPagesKey = @"SKAutoRotatePrintedPages";
 static NSString *SKDisableReloadAlertKey = @"SKDisableReloadAlert";
 
-static NSString *SKPDFDocumentDefaultsObservationContext = 
@"SKPDFDocumentDefaultsObservationContext";
-
 @interface NSFileManager (SKPDFDocumentExtensions)
 - (NSString *)subfileWithExtension:(NSString *)extensions 
inPDFBundleAtPath:(NSString *)path;
 @end
@@ -166,7 +164,7 @@
     [mainController setAnnotationsFromDictionaries:noteDicts undoable:NO];
     [self setNoteDicts:nil];
     
-    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKAutoCheckFileUpdateKey 
context:SKPDFDocumentDefaultsObservationContext];
+    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKAutoCheckFileUpdateKey context:NULL];
        [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(handleWindowWillCloseNotification:) 
                                                  
name:NSWindowWillCloseNotification object:[mainController window]];
 }
@@ -1282,12 +1280,13 @@
 #pragma mark Notification observation
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKPDFDocumentDefaultsObservationContext) {
-        if (NO == [keyPath hasPrefix:@"values."])
-            return;
-        NSString *key = [keyPath substringFromIndex:7];
-        if ([key isEqualToString:SKAutoCheckFileUpdateKey]) {
-            [self checkFileUpdatesIfNeeded];
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if ([key isEqualToString:SKAutoCheckFileUpdateKey]) {
+                [self checkFileUpdatesIfNeeded];
+                return;
+            }
         }
     } else {
         [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];

Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m   2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKPDFView.m   2008-05-17 14:41:04 UTC (rev 3887)
@@ -105,8 +105,6 @@
 static NSString *SKDefaultFreeTextNoteContentsKey = 
@"SKDefaultFreeTextNoteContents";
 static NSString *SKDefaultAnchoredNoteContentsKey = 
@"SKDefaultAnchoredNoteContents";
 
-static NSString *SKPDFViewDefaultsObservationContext = 
@"SKPDFViewDefaultsObservationContext";
-
 static unsigned int moveReadingBarModifiers = NSAlternateKeyMask;
 static unsigned int resizeReadingBarModifiers = NSAlternateKeyMask | 
NSShiftKeyMask;
 
@@ -251,7 +249,7 @@
                                                  
name:PDFViewScaleChangedNotification object:self];
     [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKeys:
         [NSArray arrayWithObjects:SKReadingBarColorKey, SKReadingBarInvertKey, 
nil]
-        context:SKPDFViewDefaultsObservationContext];
+        context:NULL];
 }
 
 - (id)initWithFrame:(NSRect)frameRect {
@@ -2318,18 +2316,20 @@
 #pragma mark KVO
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKPDFViewDefaultsObservationContext) {
-        NSString *key = [keyPath substringFromIndex:7];
-        if ([key isEqualToString:SKReadingBarColorKey] || [key 
isEqualToString:SKReadingBarInvertKey]) {
-            if (readingBar) {
-                [self setNeedsDisplay:YES];
-                [[NSNotificationCenter defaultCenter] 
postNotificationName:SKPDFViewReadingBarDidChangeNotification 
-                    object:self userInfo:[NSDictionary 
dictionaryWithObjectsAndKeys:[readingBar page], SKPDFViewOldPageKey, 
[readingBar page], SKPDFViewNewPageKey, nil]];
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if ([key isEqualToString:SKReadingBarColorKey] || [key 
isEqualToString:SKReadingBarInvertKey]) {
+                if (readingBar) {
+                    [self setNeedsDisplay:YES];
+                    [[NSNotificationCenter defaultCenter] 
postNotificationName:SKPDFViewReadingBarDidChangeNotification 
+                        object:self userInfo:[NSDictionary 
dictionaryWithObjectsAndKeys:[readingBar page], SKPDFViewOldPageKey, 
[readingBar page], SKPDFViewNewPageKey, nil]];
+                }
+                return;
             }
         }
-    } else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
     }
+    [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
 }
 
 - (void)transformCGContext:(CGContextRef)context forPage:(PDFPage *)page {

Modified: trunk/SKPreferenceController.m
===================================================================
--- trunk/SKPreferenceController.m      2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKPreferenceController.m      2008-05-17 14:41:04 UTC (rev 3887)
@@ -55,8 +55,6 @@
 
 static NSString *SKPreferenceWindowFrameAutosaveName = @"SKPreferenceWindow";
 
-static NSString *SKPreferenceWindowDefaultsObservationContext = 
@"SKPreferenceWindowDefaultsObservationContext";
-
 @implementation SKPreferenceController
 
 + (id)sharedPrefenceController {
@@ -73,8 +71,8 @@
         
         sud = [NSUserDefaults standardUserDefaults];
         sudc = [NSUserDefaultsController sharedUserDefaultsController];
-        [sudc addObserver:self forKey:SKDefaultPDFDisplaySettingsKey 
context:SKPreferenceWindowDefaultsObservationContext];
-        [sudc addObserver:self forKey:SKDefaultFullScreenPDFDisplaySettingsKey 
context:SKPreferenceWindowDefaultsObservationContext];
+        [sudc addObserver:self forKey:SKDefaultPDFDisplaySettingsKey 
context:NULL];
+        [sudc addObserver:self forKey:SKDefaultFullScreenPDFDisplaySettingsKey 
context:NULL];
     }
     return self;
 }
@@ -267,14 +265,16 @@
 #pragma mark KVO
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKPreferenceWindowDefaultsObservationContext) {
-        NSString *key = [keyPath substringFromIndex:7];
-        if ([key isEqualToString:SKDefaultPDFDisplaySettingsKey] || [key 
isEqualToString:SKDefaultFullScreenPDFDisplaySettingsKey]) {
-            [self updateRevertButtons];
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if ([key isEqualToString:SKDefaultPDFDisplaySettingsKey] || [key 
isEqualToString:SKDefaultFullScreenPDFDisplaySettingsKey]) {
+                [self updateRevertButtons];
+                return;
+            }
         }
-    } else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
     }
+    [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
 }
 
 @end

Modified: trunk/SKSnapshotWindowController.m
===================================================================
--- trunk/SKSnapshotWindowController.m  2008-05-17 13:18:23 UTC (rev 3886)
+++ trunk/SKSnapshotWindowController.m  2008-05-17 14:41:04 UTC (rev 3887)
@@ -66,8 +66,6 @@
 static NSString *SKSnapshotWindowFrameAutosaveName = @"SKSnapshotWindow";
 static NSString *SKSnapshotViewChangedNotification = 
@"SKSnapshotViewChangedNotification";
 
-static NSString *SKSnapshotWindowDefaultsObservationContext = 
@"SKSnapshotWindowDefaultsObservationContext";
-
 @implementation SKSnapshotWindowController
 
 - (void)dealloc {
@@ -85,7 +83,7 @@
     BOOL keepOnTop = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKSnapshotsOnTopKey];
     [[self window] setLevel:keepOnTop || forceOnTop ? NSFloatingWindowLevel : 
NSNormalWindowLevel];
     [[self window] setHidesOnDeactivate:keepOnTop || forceOnTop];
-    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKSnapshotsOnTopKey context:SKSnapshotWindowDefaultsObservationContext];
+    [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self 
forKey:SKSnapshotsOnTopKey context:NULL];
 }
 
 - (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName {
@@ -533,16 +531,18 @@
 #pragma mark KVO
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {
-    if (context == SKSnapshotWindowDefaultsObservationContext) {
-        NSString *key = [keyPath substringFromIndex:7];
-        if ([key isEqualToString:SKSnapshotsOnTopKey]) {
-            BOOL keepOnTop = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKSnapshotsOnTopKey];
-            [[self window] setLevel:keepOnTop || forceOnTop ? 
NSFloatingWindowLevel : NSNormalWindowLevel];
-            [[self window] setHidesOnDeactivate:keepOnTop || forceOnTop];
+    if (object == [NSUserDefaultsController sharedUserDefaultsController]) {
+        if ([keyPath hasPrefix:@"values."]) {
+            NSString *key = [keyPath substringFromIndex:7];
+            if ([key isEqualToString:SKSnapshotsOnTopKey]) {
+                BOOL keepOnTop = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKSnapshotsOnTopKey];
+                [[self window] setLevel:keepOnTop || forceOnTop ? 
NSFloatingWindowLevel : NSNormalWindowLevel];
+                [[self window] setHidesOnDeactivate:keepOnTop || forceOnTop];
+                return;
+            }
         }
-    } else {
-        [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
     }
+    [super observeValueForKeyPath:keyPath ofObject:object change:change 
context:context];
 }
 
 @end


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to