Index: chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
diff --git a/chrome/browser/ui/panels/panel_window_controller_cocoa.mm b/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
index 4acf8259e7146d0876ef8f4c3f69416fe6821f53..c33af17214a1292560d32b4a10197c88f248d862 100644 |
--- a/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
+++ b/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
@@ -6,13 +6,11 @@ |
#import <Cocoa/Cocoa.h> |
-#include "base/auto_reset.h" |
#include "base/logging.h" |
#include "base/mac/bundle_locations.h" |
#include "base/mac/mac_util.h" |
#include "base/mac/scoped_nsautorelease_pool.h" |
#include "base/sys_string_conversions.h" |
-#include "base/time.h" |
#include "chrome/app/chrome_command_ids.h" // IDC_* |
#include "chrome/browser/chrome_browser_application_mac.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -36,8 +34,6 @@ |
#import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" |
#import "chrome/browser/ui/panels/panel_utils_cocoa.h" |
#include "chrome/browser/ui/toolbar/encoding_menu_controller.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "content/public/browser/notification_service.h" |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
#include "grit/ui_resources.h" |
@@ -84,12 +80,21 @@ enum { |
} |
// Prevent panel window from becoming key - for example when it is minimized. |
+// Panel windows use a higher priority NSWindowLevel to ensure they are always |
+// visible, causing the OS to prefer panel windows when selecting a window |
+// to make the key window. To counter this preference, we override |
+// -[NSWindow:canBecomeKeyWindow] to restrict when the panel can become the |
+// key window to a limited set of scenarios, such as when cycling through |
+// windows, when panels are the only remaining windows, when an event |
+// triggers window activation, etc. The panel may also be prevented from |
+// becoming the key window, regardless of the above scenarios, such as when |
+// a panel is minimized. |
- (BOOL)canBecomeKeyWindow { |
// Give precedence to controller preventing activation of the window. |
PanelWindowControllerCocoa* controller = |
base::mac::ObjCCast<PanelWindowControllerCocoa>([self windowController]); |
if (![controller canBecomeKeyWindow]) |
- return false; |
+ return NO; |
BrowserCrApplication* app = base::mac::ObjCCast<BrowserCrApplication>( |
[BrowserCrApplication sharedApplication]); |
@@ -97,18 +102,12 @@ enum { |
// A Panel window can become the key window only in limited scenarios. |
// This prevents the system from always preferring a Panel window due |
// to its higher priority NSWindowLevel when selecting a window to make key. |
- return canBecomeKey_ || |
+ return ([app isHandlingSendEvent] && [[app currentEvent] window] == self) || |
[controller activationRequestedByBrowser] || |
[app isCyclingWindows] || |
[app previousKeyWindow] == self || |
[[app windows] count] == static_cast<NSUInteger>([controller numPanels]); |
} |
- |
-- (void)sendEvent:(NSEvent*)anEvent { |
- // Allow the panel to become key in response to a mouse click. |
- AutoReset<BOOL> pin(&canBecomeKey_, YES); |
- [super sendEvent:anEvent]; |
-} |
@end |
// Transparent view covering the whole panel in order to intercept mouse |
@@ -858,29 +857,8 @@ enum { |
- (void)onTitlebarMouseClicked:(int)modifierFlags { |
Panel* panel = windowShim_->panel(); |
- if (modifierFlags & NSShiftKeyMask) { |
- panel->OnTitlebarClicked(panel::APPLY_TO_ALL); |
- return; |
- } |
- |
- // TODO(jennb): Move remaining titlebar click handling out of here. |
- // (http://crbug.com/118431) |
- PanelStrip* panelStrip = panel->panel_strip(); |
- if (!panelStrip) |
- return; |
- if (panelStrip->type() == PanelStrip::DOCKED && |
- panel->expansion_state() == Panel::EXPANDED) { |
- if ([[self titlebarView] isDrawingAttention]) { |
- // Do not minimize if the Panel is drawing attention since user |
- // most likely simply wants to reset the 'draw attention' status. |
- panel->Activate(); |
- return; |
- } |
- panel->SetExpansionState(Panel::MINIMIZED); |
- // The Panel class ensures deactivation when it is minimized. |
- } else { |
- panel->Activate(); |
- } |
+ panel->OnTitlebarClicked((modifierFlags & NSShiftKeyMask) ? |
+ panel::APPLY_TO_ALL : panel::NO_MODIFIER); |
} |
- (int)titlebarHeightInScreenCoordinates { |
@@ -913,18 +891,7 @@ enum { |
rwhv->SetActive(true); |
} |
- // If the window becomes key, lets make sure it is expanded and stop |
- // drawing attention - since it is ready to accept input, it already has |
- // user's attention. |
- if ([[self titlebarView] isDrawingAttention]) { |
- [[self titlebarView] stopDrawingAttention]; |
- } |
- |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PANEL_CHANGED_ACTIVE_STATUS, |
- content::Source<Panel>(windowShim_->panel()), |
- content::NotificationService::NoDetails()); |
- windowShim_->panel()->OnActiveStateChanged(); |
+ windowShim_->panel()->OnActiveStateChanged(true); |
} |
- (void)windowDidResignKey:(NSNotification*)notification { |
@@ -943,11 +910,7 @@ enum { |
rwhv->SetActive(false); |
} |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PANEL_CHANGED_ACTIVE_STATUS, |
- content::Source<Panel>(windowShim_->panel()), |
- content::NotificationService::NoDetails()); |
- windowShim_->panel()->OnActiveStateChanged(); |
+ windowShim_->panel()->OnActiveStateChanged(false); |
} |
- (void)deactivate { |
@@ -1034,8 +997,4 @@ enum { |
[[self window] invalidateCursorRectsForView:overlayView_]; |
} |
-- (BOOL)isActivationByClickingTitlebarEnabled { |
- return !windowShim_->panel()->always_on_top(); |
-} |
- |
@end |