Index: ui/views/widget/native_widget_mac.mm |
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm |
index b6aa7176a1163772804329ac8577fa0cf8146f31..4f4a52127f4e5fcf2e9bf83098ce26bb07a6a29e 100644 |
--- a/ui/views/widget/native_widget_mac.mm |
+++ b/ui/views/widget/native_widget_mac.mm |
@@ -7,10 +7,12 @@ |
#import <Cocoa/Cocoa.h> |
#include "base/mac/foundation_util.h" |
+#import "base/mac/sdk_forward_declarations.h" |
#include "base/mac/scoped_nsobject.h" |
#include "base/strings/sys_string_conversions.h" |
#include "ui/gfx/font_list.h" |
#import "ui/gfx/mac/coordinate_conversion.h" |
+#include "ui/gfx/screen.h" |
#include "ui/native_theme/native_theme.h" |
#import "ui/views/cocoa/bridged_content_view.h" |
#import "ui/views/cocoa/bridged_native_widget.h" |
@@ -33,8 +35,11 @@ |
return YES; |
} |
+// Also override canBecomeMainWindow, but ensure that transient child windows |
+// do not achieve main status, even if key. Main status should stay with the |
+// parent window. |
- (BOOL)canBecomeMainWindow { |
- return YES; |
+ return ![[self viewsNSWindowDelegate] isTransientChild]; |
} |
// Override orderWindow to intercept visibility changes, since there is no way |
@@ -43,7 +48,7 @@ |
relativeTo:(NSInteger)otherWindowNumber { |
[[self viewsNSWindowDelegate] onWindowOrderWillChange:orderingMode]; |
[super orderWindow:orderingMode relativeTo:otherWindowNumber]; |
- [[self viewsNSWindowDelegate] onWindowOrderChanged]; |
+ [[self viewsNSWindowDelegate] onWindowOrderChanged:nil]; |
} |
@end |
@@ -77,7 +82,9 @@ NSRect ValidateContentRect(NSRect content_rect) { |
} |
gfx::Size WindowSizeForClientAreaSize(NSWindow* window, const gfx::Size& size) { |
- NSRect content_rect = NSMakeRect(0, 0, size.width(), size.height()); |
+ DCHECK(window); |
+ NSRect content_rect = |
+ ValidateContentRect(NSMakeRect(0, 0, size.width(), size.height())); |
NSRect frame_rect = [window frameRectForContentRect:content_rect]; |
return gfx::Size(NSWidth(frame_rect), NSHeight(frame_rect)); |
} |
@@ -146,8 +153,7 @@ bool NativeWidgetMac::ShouldUseNativeFrame() const { |
} |
bool NativeWidgetMac::ShouldWindowContentsBeTransparent() const { |
- NOTIMPLEMENTED(); |
- return false; |
+ return true; |
} |
void NativeWidgetMac::FrameTypeChanged() { |
@@ -177,18 +183,15 @@ Widget* NativeWidgetMac::GetTopLevelWidget() { |
} |
const ui::Compositor* NativeWidgetMac::GetCompositor() const { |
- NOTIMPLEMENTED(); |
- return NULL; |
+ return bridge_->layer() ? bridge_->layer()->GetCompositor() : NULL; |
} |
ui::Compositor* NativeWidgetMac::GetCompositor() { |
- NOTIMPLEMENTED(); |
- return NULL; |
+ return bridge_->layer() ? bridge_->layer()->GetCompositor() : NULL; |
} |
ui::Layer* NativeWidgetMac::GetLayer() { |
- NOTIMPLEMENTED(); |
- return NULL; |
+ return bridge_->GetOrCreateLayer(); |
} |
void NativeWidgetMac::ReorderNativeViews() { |
@@ -215,16 +218,20 @@ TooltipManager* NativeWidgetMac::GetTooltipManager() const { |
} |
void NativeWidgetMac::SetCapture() { |
- NOTIMPLEMENTED(); |
+ // Basic mouse capture to simulate ::SetCapture() from Windows. Capture on OSX |
+ // is automatic for mouse drag events. This allows mouse move events to also |
+ // be sent to responders, but only when the mouse is over the window. To get |
+ // move events outside the window, Mac will need an event tap. |
+ [GetNativeWindow() setAcceptsMouseMovedEvents:YES]; |
+ //[GetNativeWindow() makeKeyWindow]; |
} |
void NativeWidgetMac::ReleaseCapture() { |
- NOTIMPLEMENTED(); |
+ [GetNativeWindow() setAcceptsMouseMovedEvents:NO]; |
} |
bool NativeWidgetMac::HasCapture() const { |
- NOTIMPLEMENTED(); |
- return false; |
+ return [GetNativeWindow() acceptsMouseMovedEvents]; |
} |
InputMethod* NativeWidgetMac::CreateInputMethod() { |
@@ -247,9 +254,21 @@ void NativeWidgetMac::CenterWindow(const gfx::Size& size) { |
[GetNativeWindow() center]; |
} |
-void NativeWidgetMac::GetWindowPlacement(gfx::Rect* bounds, |
- ui::WindowShowState* maximized) const { |
- NOTIMPLEMENTED(); |
+void NativeWidgetMac::GetWindowPlacement( |
+ gfx::Rect* bounds, |
+ ui::WindowShowState* show_state) const { |
+ *bounds = GetRestoredBounds(); |
+ if (IsMinimized()) { |
+ *show_state = ui::SHOW_STATE_MINIMIZED; |
+ return; |
+ } |
+ |
+ if (IsFullscreen()) { |
+ *show_state = ui::SHOW_STATE_FULLSCREEN; |
+ return; |
+ } |
+ |
+ *show_state = ui::SHOW_STATE_DEFAULT; |
} |
bool NativeWidgetMac::SetWindowTitle(const base::string16& title) { |
@@ -287,9 +306,20 @@ gfx::Rect NativeWidgetMac::GetRestoredBounds() const { |
} |
void NativeWidgetMac::SetBounds(const gfx::Rect& bounds) { |
+#if 1 |
[GetNativeWindow() setFrame:gfx::ScreenRectToNSRect(bounds) |
display:YES |
animate:NO]; |
+ if (!IsVisible()) { |
+ // If not visible, notifications do not come from Cocoa, so send our own. |
+ //NSSize new_size = [GetNativeWindow() frame].size; |
+ //GetWidget()->OnNativeWidgetSizeChanged( |
+ // gfx::Size(new_size.width, new_size.height)); |
+ } |
+#else |
+ if (bridge_) |
+ bridge_->SetBounds(bounds); |
+#endif |
} |
void NativeWidgetMac::SetSize(const gfx::Size& size) { |
@@ -340,7 +370,7 @@ void NativeWidgetMac::Show() { |
} |
void NativeWidgetMac::Hide() { |
- NOTIMPLEMENTED(); |
+ [GetNativeWindow() orderOut:nil]; |
} |
void NativeWidgetMac::ShowMaximizedWithBounds( |
@@ -428,7 +458,13 @@ void NativeWidgetMac::Maximize() { |
} |
void NativeWidgetMac::Minimize() { |
- NOTIMPLEMENTED(); |
+ NSWindow* window = GetNativeWindow(); |
+ // Calling performMiniaturize: will momentarily highlight the button, but |
+ // AppKit will reject it if there is no miniaturize button. |
+ if ([window styleMask] & NSMiniaturizableWindowMask) |
+ [window performMiniaturize:nil]; |
+ else |
+ [window miniaturize:nil]; |
} |
bool NativeWidgetMac::IsMaximized() const { |
@@ -438,12 +474,11 @@ bool NativeWidgetMac::IsMaximized() const { |
} |
bool NativeWidgetMac::IsMinimized() const { |
- NOTIMPLEMENTED(); |
- return false; |
+ return [GetNativeWindow() isMiniaturized]; |
} |
void NativeWidgetMac::Restore() { |
- NOTIMPLEMENTED(); |
+ [GetNativeWindow() deminiaturize:nil]; |
} |
void NativeWidgetMac::SetFullscreen(bool fullscreen) { |
@@ -481,6 +516,9 @@ void NativeWidgetMac::SchedulePaintInRect(const gfx::Rect& rect) { |
// TODO(tapted): This should use setNeedsDisplayInRect:, once the coordinate |
// system of |rect| has been converted. |
[GetNativeView() setNeedsDisplay:YES]; |
+ if (bridge_ && bridge_->layer()) { |
+ bridge_->layer()->SchedulePaint(rect); |
+ } |
} |
void NativeWidgetMac::SetCursor(gfx::NativeCursor cursor) { |
@@ -497,8 +535,12 @@ void NativeWidgetMac::ClearNativeFocus() { |
} |
gfx::Rect NativeWidgetMac::GetWorkAreaBoundsInScreen() const { |
- NOTIMPLEMENTED(); |
- return gfx::Rect(); |
+ NSView* view = GetNativeView(); |
+ if (!view) |
+ return gfx::Rect(); |
+ return gfx::Screen::GetScreenFor(view) |
+ ->GetDisplayNearestWindow(view) |
+ .work_area(); |
} |
Widget::MoveLoopResult NativeWidgetMac::RunMoveLoop( |