| 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 #include "chrome/browser/ui/cocoa/panels/panel_window_controller_cocoa.h" | 5 #include "chrome/browser/ui/cocoa/panels/panel_window_controller_cocoa.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 [controller activationRequestedByPanel] || | 89 [controller activationRequestedByPanel] || |
| 90 [app isCyclingWindows] || | 90 [app isCyclingWindows] || |
| 91 [app previousKeyWindow] == self || | 91 [app previousKeyWindow] == self || |
| 92 [[app windows] count] == static_cast<NSUInteger>([controller numPanels]); | 92 [[app windows] count] == static_cast<NSUInteger>([controller numPanels]); |
| 93 } | 93 } |
| 94 | 94 |
| 95 - (void)performMiniaturize:(id)sender { | 95 - (void)performMiniaturize:(id)sender { |
| 96 [[self windowController] minimizeButtonClicked:0]; | 96 [[self windowController] minimizeButtonClicked:0]; |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Ignore key events if window cannot become key window to fix problem | |
| 100 // where keyboard input is still going into a minimized panel even though | |
| 101 // the app has been deactivated in -[PanelWindowControllerCocoa deactivate:]. | |
| 102 - (void)sendEvent:(NSEvent*)anEvent { | |
| 103 NSEventType eventType = [anEvent type]; | |
| 104 if ((eventType == NSKeyDown || eventType == NSKeyUp) && | |
| 105 ![self canBecomeKeyWindow]) | |
| 106 return; | |
| 107 [super sendEvent:anEvent]; | |
| 108 } | |
| 109 | |
| 110 - (void)mouseMoved:(NSEvent*)event { | 99 - (void)mouseMoved:(NSEvent*)event { |
| 111 // Cocoa does not support letting the application determine the edges that | 100 // Cocoa does not support letting the application determine the edges that |
| 112 // can trigger the user resizing. To work around this, we track the mouse | 101 // can trigger the user resizing. To work around this, we track the mouse |
| 113 // location. When it is close to the edge/corner where the user resizing | 102 // location. When it is close to the edge/corner where the user resizing |
| 114 // is not desired, we force the min and max size of the window to be same | 103 // is not desired, we force the min and max size of the window to be same |
| 115 // as current window size. For all other cases, we restore the min and max | 104 // as current window size. For all other cases, we restore the min and max |
| 116 // size. | 105 // size. |
| 117 PanelWindowControllerCocoa* controller = | 106 PanelWindowControllerCocoa* controller = |
| 118 base::mac::ObjCCast<PanelWindowControllerCocoa>([self windowController]); | 107 base::mac::ObjCCast<PanelWindowControllerCocoa>([self windowController]); |
| 119 NSRect frame = [self frame]; | 108 NSRect frame = [self frame]; |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 | 593 |
| 605 - (void)windowDidResignKey:(NSNotification*)notification { | 594 - (void)windowDidResignKey:(NSNotification*)notification { |
| 606 // If our app is still active and we're still the key window, ignore this | 595 // If our app is still active and we're still the key window, ignore this |
| 607 // message, since it just means that a menu extra (on the "system status bar") | 596 // message, since it just means that a menu extra (on the "system status bar") |
| 608 // was activated; we'll get another |-windowDidResignKey| if we ever really | 597 // was activated; we'll get another |-windowDidResignKey| if we ever really |
| 609 // lose key window status. | 598 // lose key window status. |
| 610 if ([NSApp isActive] && ([NSApp keyWindow] == [self window])) | 599 if ([NSApp isActive] && ([NSApp keyWindow] == [self window])) |
| 611 return; | 600 return; |
| 612 | 601 |
| 613 [self onWindowDidResignKey]; | 602 [self onWindowDidResignKey]; |
| 614 | |
| 615 // Make the window not user-resizable when it loses the focus. This is to | |
| 616 // solve the problem that the bottom edge of the active panel does not | |
| 617 // trigger the user-resizing if this panel stacks with another inactive | |
| 618 // panel at the bottom. | |
| 619 [[self window] setStyleMask: | |
| 620 [[self window] styleMask] & ~NSResizableWindowMask]; | |
| 621 } | 603 } |
| 622 | 604 |
| 623 - (void)windowWillStartLiveResize:(NSNotification*)notification { | 605 - (void)windowWillStartLiveResize:(NSNotification*)notification { |
| 624 // Check if the user-resizing is allowed for the triggering edge/corner. | 606 // Check if the user-resizing is allowed for the triggering edge/corner. |
| 625 // This is an extra safe guard because we are not able to track the mouse | 607 // This is an extra safe guard because we are not able to track the mouse |
| 626 // movement outside the window and Cocoa could trigger the user-resizing | 608 // movement outside the window and Cocoa could trigger the user-resizing |
| 627 // when the mouse moves a bit outside the edge/corner. | 609 // when the mouse moves a bit outside the edge/corner. |
| 628 if (![self canResizeByMouseAtCurrentLocation]) | 610 if (![self canResizeByMouseAtCurrentLocation]) |
| 629 return; | 611 return; |
| 630 userResizing_ = YES; | 612 userResizing_ = YES; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 // Activate the window. -|windowDidBecomeKey:| will be called when | 698 // Activate the window. -|windowDidBecomeKey:| will be called when |
| 717 // window becomes active. | 699 // window becomes active. |
| 718 base::AutoReset<BOOL> pin(&activationRequestedByPanel_, true); | 700 base::AutoReset<BOOL> pin(&activationRequestedByPanel_, true); |
| 719 [BrowserWindowUtils activateWindowForController:self]; | 701 [BrowserWindowUtils activateWindowForController:self]; |
| 720 } | 702 } |
| 721 | 703 |
| 722 - (void)deactivate { | 704 - (void)deactivate { |
| 723 if (![[self window] isMainWindow]) | 705 if (![[self window] isMainWindow]) |
| 724 return; | 706 return; |
| 725 | 707 |
| 726 // Cocoa does not support deactivating a window, so we deactivate the app. | |
| 727 [NSApp deactivate]; | 708 [NSApp deactivate]; |
| 728 | 709 |
| 729 // Deactivating the app does not trigger windowDidResignKey. Do it manually. | 710 // Cocoa does not support deactivating a NSWindow explicitly. To work around |
| 711 // this, we call orderOut and orderFront to force the window to lose its key |
| 712 // window state. |
| 713 |
| 714 // Before doing this, we need to disable screen updates to prevent flickering. |
| 715 NSDisableScreenUpdates(); |
| 716 |
| 717 // If a panel is in stacked mode, the window has a background parent window. |
| 718 // We need to detach it from its parent window before applying the ordering |
| 719 // change and then put it back because otherwise tha background parent window |
| 720 // might show up. |
| 721 NSWindow* parentWindow = [[self window] parentWindow]; |
| 722 if (parentWindow) |
| 723 [parentWindow removeChildWindow:[self window]]; |
| 724 |
| 725 [[self window] orderOut:nil]; |
| 726 [[self window] orderFront:nil]; |
| 727 |
| 728 if (parentWindow) |
| 729 [parentWindow addChildWindow:[self window] ordered:NSWindowAbove]; |
| 730 |
| 731 NSEnableScreenUpdates(); |
| 732 |
| 733 // Though the above workaround causes the window to lose its key window state, |
| 734 // it does not trigger the system to call windowDidResignKey. |
| 730 [self onWindowDidResignKey]; | 735 [self onWindowDidResignKey]; |
| 731 } | 736 } |
| 732 | 737 |
| 733 - (void)onWindowDidResignKey { | 738 - (void)onWindowDidResignKey { |
| 734 // We need to deactivate the controls (in the "WebView"). To do this, get the | 739 // We need to deactivate the controls (in the "WebView"). To do this, get the |
| 735 // selected WebContents's RenderWidgetHostView and tell it to deactivate. | 740 // selected WebContents's RenderWidgetHostView and tell it to deactivate. |
| 736 if (WebContents* contents = windowShim_->panel()->GetWebContents()) { | 741 if (WebContents* contents = windowShim_->panel()->GetWebContents()) { |
| 737 if (content::RenderWidgetHostView* rwhv = | 742 if (content::RenderWidgetHostView* rwhv = |
| 738 contents->GetRenderWidgetHostView()) | 743 contents->GetRenderWidgetHostView()) |
| 739 rwhv->SetActive(false); | 744 rwhv->SetActive(false); |
| 740 } | 745 } |
| 741 | 746 |
| 742 windowShim_->panel()->OnActiveStateChanged(false); | 747 windowShim_->panel()->OnActiveStateChanged(false); |
| 748 |
| 749 // Make the window not user-resizable when it loses the focus. This is to |
| 750 // solve the problem that the bottom edge of the active panel does not |
| 751 // trigger the user-resizing if this panel stacks with another inactive |
| 752 // panel at the bottom. |
| 753 [[self window] setStyleMask: |
| 754 [[self window] styleMask] & ~NSResizableWindowMask]; |
| 743 } | 755 } |
| 744 | 756 |
| 745 - (void)preventBecomingKeyWindow:(BOOL)prevent { | 757 - (void)preventBecomingKeyWindow:(BOOL)prevent { |
| 746 canBecomeKeyWindow_ = !prevent; | 758 canBecomeKeyWindow_ = !prevent; |
| 747 } | 759 } |
| 748 | 760 |
| 749 - (void)fullScreenModeChanged:(bool)isFullScreen { | 761 - (void)fullScreenModeChanged:(bool)isFullScreen { |
| 750 [self updateWindowLevel]; | 762 [self updateWindowLevel]; |
| 751 | 763 |
| 752 // If the panel is not always on top, its z-order should not be affected if | 764 // If the panel is not always on top, its z-order should not be affected if |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 - (NSRect)contentRectForFrameRect:(NSRect)frameRect { | 920 - (NSRect)contentRectForFrameRect:(NSRect)frameRect { |
| 909 NSRect contentRect = [[[self window] contentView] convertRect:frameRect | 921 NSRect contentRect = [[[self window] contentView] convertRect:frameRect |
| 910 fromView:nil]; | 922 fromView:nil]; |
| 911 contentRect.size.height -= panel::kTitlebarHeight; | 923 contentRect.size.height -= panel::kTitlebarHeight; |
| 912 if (contentRect.size.height < 0) | 924 if (contentRect.size.height < 0) |
| 913 contentRect.size.height = 0; | 925 contentRect.size.height = 0; |
| 914 return contentRect; | 926 return contentRect; |
| 915 } | 927 } |
| 916 | 928 |
| 917 @end | 929 @end |
| OLD | NEW |