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