OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/app_controller_mac.h" | 5 #import "chrome/browser/app_controller_mac.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 | 104 |
105 using apps::AppShimHandler; | 105 using apps::AppShimHandler; |
106 using apps::ExtensionAppShimHandler; | 106 using apps::ExtensionAppShimHandler; |
107 using base::UserMetricsAction; | 107 using base::UserMetricsAction; |
108 using content::BrowserContext; | 108 using content::BrowserContext; |
109 using content::BrowserThread; | 109 using content::BrowserThread; |
110 using content::DownloadManager; | 110 using content::DownloadManager; |
111 | 111 |
112 namespace { | 112 namespace { |
113 | 113 |
114 // Declare notification names from the 10.7 SDK. | |
115 #if !defined(MAC_OS_X_VERSION_10_7) || \ | |
116 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 | |
117 NSString* NSPopoverDidShowNotification = @"NSPopoverDidShowNotification"; | |
118 NSString* NSPopoverDidCloseNotification = @"NSPopoverDidCloseNotification"; | |
119 #endif | |
120 | |
121 // How long we allow a workspace change notification to wait to be | 114 // How long we allow a workspace change notification to wait to be |
122 // associated with a dock activation. The animation lasts 250ms. See | 115 // associated with a dock activation. The animation lasts 250ms. See |
123 // applicationShouldHandleReopen:hasVisibleWindows:. | 116 // applicationShouldHandleReopen:hasVisibleWindows:. |
124 static const int kWorkspaceChangeTimeoutMs = 500; | 117 static const int kWorkspaceChangeTimeoutMs = 500; |
125 | 118 |
126 // True while AppController is calling chrome::NewEmptyWindow(). We need a | 119 // True while AppController is calling chrome::NewEmptyWindow(). We need a |
127 // global flag here, analogue to StartupBrowserCreator::InProcessStartup() | 120 // global flag here, analogue to StartupBrowserCreator::InProcessStartup() |
128 // because otherwise the SessionService will try to restore sessions when we | 121 // because otherwise the SessionService will try to restore sessions when we |
129 // make a new window while there are no other active windows. | 122 // make a new window while there are no other active windows. |
130 bool g_is_opening_new_window = false; | 123 bool g_is_opening_new_window = false; |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 addObserver:self | 339 addObserver:self |
347 selector:@selector(windowDidBecomeMain:) | 340 selector:@selector(windowDidBecomeMain:) |
348 name:NSWindowDidBecomeMainNotification | 341 name:NSWindowDidBecomeMainNotification |
349 object:nil]; | 342 object:nil]; |
350 [notificationCenter | 343 [notificationCenter |
351 addObserver:self | 344 addObserver:self |
352 selector:@selector(windowDidResignMain:) | 345 selector:@selector(windowDidResignMain:) |
353 name:NSWindowDidResignMainNotification | 346 name:NSWindowDidResignMainNotification |
354 object:nil]; | 347 object:nil]; |
355 | 348 |
356 if (base::mac::IsOSLionOrLater()) { | |
357 [notificationCenter | |
358 addObserver:self | |
359 selector:@selector(popoverDidShow:) | |
360 name:NSPopoverDidShowNotification | |
361 object:nil]; | |
362 [notificationCenter | |
363 addObserver:self | |
364 selector:@selector(popoverDidClose:) | |
365 name:NSPopoverDidCloseNotification | |
366 object:nil]; | |
367 } | |
368 | |
369 // Register for space change notifications. | 349 // Register for space change notifications. |
370 [[[NSWorkspace sharedWorkspace] notificationCenter] | 350 [[[NSWorkspace sharedWorkspace] notificationCenter] |
371 addObserver:self | 351 addObserver:self |
372 selector:@selector(activeSpaceDidChange:) | 352 selector:@selector(activeSpaceDidChange:) |
373 name:NSWorkspaceActiveSpaceDidChangeNotification | 353 name:NSWorkspaceActiveSpaceDidChangeNotification |
374 object:nil]; | 354 object:nil]; |
375 | 355 |
376 [[[NSWorkspace sharedWorkspace] notificationCenter] | 356 [[[NSWorkspace sharedWorkspace] notificationCenter] |
377 addObserver:self | 357 addObserver:self |
378 selector:@selector(willPowerOff:) | 358 selector:@selector(willPowerOff:) |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 } else { | 535 } else { |
556 [closeTabMenuItem_ setKeyEquivalent:@""]; | 536 [closeTabMenuItem_ setKeyEquivalent:@""]; |
557 [closeTabMenuItem_ setKeyEquivalentModifierMask:0]; | 537 [closeTabMenuItem_ setKeyEquivalentModifierMask:0]; |
558 } | 538 } |
559 } | 539 } |
560 | 540 |
561 // See if the focused window window has tabs, and adjust the key equivalents for | 541 // See if the focused window window has tabs, and adjust the key equivalents for |
562 // Close Tab/Close Window accordingly. | 542 // Close Tab/Close Window accordingly. |
563 - (void)menuNeedsUpdate:(NSMenu*)menu { | 543 - (void)menuNeedsUpdate:(NSMenu*)menu { |
564 DCHECK(menu == [closeTabMenuItem_ menu]); | 544 DCHECK(menu == [closeTabMenuItem_ menu]); |
565 NSWindow* window = [NSApp keyWindow]; | 545 |
566 NSWindow* mainWindow = [NSApp mainWindow]; | 546 BOOL enableCloseTabShortcut = NO; |
567 if (!window || ([window parentWindow] == mainWindow)) { | 547 id target = [NSApp targetForAction:@selector(performClose:)]; |
568 // If the key window is a child of the main window (e.g. a bubble), the main | 548 |
569 // window should be the one that handles the close menu item action. | 549 // |target| is an instance of NSPopover or NSWindow. |
570 // Also, there might be a small amount of time where there is no key window; | 550 // If a popover (likely the dictionary lookup popover), we want Cmd-W to |
571 // in that case as well, just use our main browser window if there is one. | 551 // close the popover so map it to "Close Window". |
572 // You might think that we should just always use the main window, but the | 552 // Otherwise, map Cmd-W to "Close Tab" if it's a browser window. |
573 // "About Chrome" window serves as a counterexample. | 553 if ([target isKindOfClass:[NSWindow class]]) { |
574 window = mainWindow; | 554 NSWindow* window = target; |
| 555 NSWindow* mainWindow = [NSApp mainWindow]; |
| 556 if (!window || ([window parentWindow] == mainWindow)) { |
| 557 // If the target window is a child of the main window (e.g. a bubble), the |
| 558 // main window should be the one that handles the close menu item action. |
| 559 window = mainWindow; |
| 560 } |
| 561 enableCloseTabShortcut = |
| 562 [[window windowController] isKindOfClass:[TabWindowController class]]; |
575 } | 563 } |
576 | 564 |
577 BOOL hasTabs = | |
578 [[window windowController] isKindOfClass:[TabWindowController class]]; | |
579 BOOL enableCloseTabShortcut = hasTabs && !hasPopover_; | |
580 [self adjustCloseWindowMenuItemKeyEquivalent:enableCloseTabShortcut]; | 565 [self adjustCloseWindowMenuItemKeyEquivalent:enableCloseTabShortcut]; |
581 [self adjustCloseTabMenuItemKeyEquivalent:enableCloseTabShortcut]; | 566 [self adjustCloseTabMenuItemKeyEquivalent:enableCloseTabShortcut]; |
582 } | 567 } |
583 | 568 |
584 - (void)windowDidResignKey:(NSNotification*)notify { | 569 - (void)windowDidResignKey:(NSNotification*)notify { |
585 // If a window is closed, this notification is fired but |[NSApp keyWindow]| | 570 // If a window is closed, this notification is fired but |[NSApp keyWindow]| |
586 // returns nil regardless of whether any suitable candidates for the key | 571 // returns nil regardless of whether any suitable candidates for the key |
587 // window remain. It seems that the new key window for the app is not set | 572 // window remain. It seems that the new key window for the app is not set |
588 // until after this notification is fired, so a check is performed after the | 573 // until after this notification is fired, so a check is performed after the |
589 // run loop is allowed to spin. | 574 // run loop is allowed to spin. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 } | 617 } |
633 } | 618 } |
634 | 619 |
635 // Called when shutting down or logging out. | 620 // Called when shutting down or logging out. |
636 - (void)willPowerOff:(NSNotification*)notify { | 621 - (void)willPowerOff:(NSNotification*)notify { |
637 // Don't attempt any shutdown here. Cocoa will shortly call | 622 // Don't attempt any shutdown here. Cocoa will shortly call |
638 // -[BrowserCrApplication terminate:]. | 623 // -[BrowserCrApplication terminate:]. |
639 isPoweringOff_ = YES; | 624 isPoweringOff_ = YES; |
640 } | 625 } |
641 | 626 |
642 // Called on Lion and later when a popover (e.g. dictionary) is shown. | |
643 - (void)popoverDidShow:(NSNotification*)notify { | |
644 hasPopover_ = YES; | |
645 } | |
646 | |
647 // Called on Lion and later when a popover (e.g. dictionary) is closed. | |
648 - (void)popoverDidClose:(NSNotification*)notify { | |
649 hasPopover_ = NO; | |
650 } | |
651 | |
652 - (void)checkForAnyKeyWindows { | 627 - (void)checkForAnyKeyWindows { |
653 if ([NSApp keyWindow]) | 628 if ([NSApp keyWindow]) |
654 return; | 629 return; |
655 | 630 |
656 content::NotificationService::current()->Notify( | 631 content::NotificationService::current()->Notify( |
657 chrome::NOTIFICATION_NO_KEY_WINDOW, | 632 chrome::NOTIFICATION_NO_KEY_WINDOW, |
658 content::NotificationService::AllSources(), | 633 content::NotificationService::AllSources(), |
659 content::NotificationService::NoDetails()); | 634 content::NotificationService::NoDetails()); |
660 } | 635 } |
661 | 636 |
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 | 1684 |
1710 //--------------------------------------------------------------------------- | 1685 //--------------------------------------------------------------------------- |
1711 | 1686 |
1712 namespace app_controller_mac { | 1687 namespace app_controller_mac { |
1713 | 1688 |
1714 bool IsOpeningNewWindow() { | 1689 bool IsOpeningNewWindow() { |
1715 return g_is_opening_new_window; | 1690 return g_is_opening_new_window; |
1716 } | 1691 } |
1717 | 1692 |
1718 } // namespace app_controller_mac | 1693 } // namespace app_controller_mac |
OLD | NEW |