diff options
Diffstat (limited to 'chrome/browser/cocoa/focus_tracker.mm')
-rw-r--r-- | chrome/browser/cocoa/focus_tracker.mm | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/focus_tracker.mm b/chrome/browser/cocoa/focus_tracker.mm new file mode 100644 index 0000000..ecbb864 --- /dev/null +++ b/chrome/browser/cocoa/focus_tracker.mm @@ -0,0 +1,46 @@ +// Copyright (c) 2009 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 "chrome/browser/cocoa/focus_tracker.h" + +#include "base/logging.h" + +@implementation FocusTracker + +- (id)initWithWindow:(NSWindow*)window { + if ((self = [super init])) { + NSResponder* current_focus = [window firstResponder]; + + // Special case NSTextViews, because they are removed from the + // view hierarchy when their text field does not have focus. If + // an NSTextView is the current first responder, save a pointer to + // its NSTextField delegate instead. + if ([current_focus isKindOfClass:[NSTextView class]]) { + id delegate = [(NSTextView*)current_focus delegate]; + if ([delegate isKindOfClass:[NSTextField class]]) + current_focus = delegate; + else + current_focus = nil; + } + + if ([current_focus isKindOfClass:[NSView class]]) { + NSView* current_focus_view = (NSView*)current_focus; + focusedView_.reset([current_focus_view retain]); + } + } + + return self; +} + +- (BOOL)restoreFocusInWindow:(NSWindow*)window { + if (!focusedView_.get()) + return NO; + + if ([focusedView_ window] && [focusedView_ window] == window) + return [window makeFirstResponder:focusedView_.get()]; + + return NO; +} + +@end |