Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4368)

Unified Diff: chrome/browser/cocoa/window_size_autosaver.mm

Issue 536086: Mac: Save/restore task manager window pos and size. (Closed)
Patch Set: comments Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/cocoa/window_size_autosaver.mm
diff --git a/chrome/browser/cocoa/window_size_autosaver.mm b/chrome/browser/cocoa/window_size_autosaver.mm
new file mode 100644
index 0000000000000000000000000000000000000000..d8c0f77f180e5d2b441a90fc268184a891994e34
--- /dev/null
+++ b/chrome/browser/cocoa/window_size_autosaver.mm
@@ -0,0 +1,95 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#import "chrome/browser/cocoa/window_size_autosaver.h"
+
+#include "chrome/common/pref_service.h"
+
+@interface WindowSizeAutosaver (Private)
+- (void)save:(NSNotification*)notification;
+- (void)restore;
+@end
+
+@implementation WindowSizeAutosaver
+
+- (id)initWithWindow:(NSWindow*)window
+ prefService:(PrefService*)prefs
+ path:(const wchar_t*)path
+ state:(WindowSizeAutosaverState)state {
+ if ((self = [super init])) {
+ window_ = window;
+ prefService_ = prefs;
+ path_ = path;
+ state_ = state;
+
+ [self restore];
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(save:)
+ name:NSWindowDidMoveNotification
+ object:window_];
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(save:)
+ name:NSWindowDidResizeNotification
+ object:window_];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [super dealloc];
+}
+
+- (void)save:(NSNotification*)notification {
+ DictionaryValue* windowPrefs = prefService_->GetMutableDictionary(path_);
+ NSRect frame = [window_ frame];
+ if (state_ == kSaveWindowRect) {
+ // Save the origin of the window.
+ windowPrefs->SetInteger(L"left", NSMinX(frame));
+ windowPrefs->SetInteger(L"right", NSMaxX(frame));
+ // windows's and linux's profiles have top < bottom due to having their
+ // screen origin in the upper left, while cocoa's is in the lower left. To
+ // keep the top < bottom invariant, store top in bottom and vice versa.
+ windowPrefs->SetInteger(L"top", NSMinY(frame));
+ windowPrefs->SetInteger(L"bottom", NSMaxY(frame));
+ } else if (state_ == kSaveWindowPos) {
+ // Save the origin of the window.
+ windowPrefs->SetInteger(L"x", frame.origin.x);
+ windowPrefs->SetInteger(L"y", frame.origin.y);
+ } else {
+ NOTREACHED();
+ }
+}
+
+- (void)restore {
+ // Get the positioning information.
+ DictionaryValue* windowPrefs = prefService_->GetMutableDictionary(path_);
+ if (state_ == kSaveWindowRect) {
+ int x1, x2, y1, y2;
+ if (!windowPrefs->GetInteger(L"left", &x1) ||
+ !windowPrefs->GetInteger(L"right", &x2) ||
+ !windowPrefs->GetInteger(L"top", &y1) ||
+ !windowPrefs->GetInteger(L"bottom", &y2)) {
+ return;
+ }
+ [window_ setFrame:NSMakeRect(x1, y1, x2 - x1, y2 - y1) display:YES];
+ } else if (state_ == kSaveWindowPos) {
+ int x, y;
+ if (!windowPrefs->GetInteger(L"x", &x) ||
+ !windowPrefs->GetInteger(L"y", &y))
+ return; // Nothing stored.
+ // Turn the origin (lower-left) into an upper-left window point.
+ NSPoint upperLeft = NSMakePoint(x, y + NSHeight([window_ frame]));
+ [window_ cascadeTopLeftFromPoint:upperLeft];
+ } else {
+ NOTREACHED();
+ }
+}
+
+@end
+

Powered by Google App Engine
This is Rietveld 408576698