Index: athena/wm/window_manager_impl.cc |
diff --git a/athena/wm/window_manager_impl.cc b/athena/wm/window_manager_impl.cc |
index c8c1caccc01060c1261b40e0ef2a0682aaaba28a..f29d8e4f3bcced7edeade9fd2840a5a8dc8ace9a 100644 |
--- a/athena/wm/window_manager_impl.cc |
+++ b/athena/wm/window_manager_impl.cc |
@@ -16,8 +16,10 @@ |
#include "athena/wm/window_overview_mode.h" |
#include "base/bind.h" |
#include "base/logging.h" |
+#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/layout_manager.h" |
#include "ui/aura/window.h" |
+#include "ui/aura/window_delegate.h" |
#include "ui/compositor/closure_animation_observer.h" |
#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/gfx/display.h" |
@@ -40,6 +42,16 @@ void SetWindowState(aura::Window* window, |
window->SetTransform(transform); |
} |
+// Tests whether the given window can be maximized |
+bool CanWindowMaximize(const aura::Window* const window) { |
+ const aura::WindowDelegate* delegate = window->delegate(); |
+ const bool no_max_size = |
+ !delegate || delegate->GetMaximumSize().IsEmpty(); |
+ return no_max_size && |
+ window->GetProperty(aura::client::kCanMaximizeKey) && |
+ window->GetProperty(aura::client::kCanResizeKey); |
+} |
+ |
} // namespace |
class AthenaContainerLayoutManager : public aura::LayoutManager { |
@@ -91,11 +103,10 @@ void AthenaContainerLayoutManager::OnWindowResized() { |
else if (window == instance->split_view_controller_->right_window()) |
window->SetBounds( |
gfx::Rect(gfx::Point(split_size.width(), 0), split_size)); |
- else |
+ else if (CanWindowMaximize(window)) |
+ window->SetBounds(gfx::Rect(work_area)); |
+ } else if (CanWindowMaximize(window)) |
window->SetBounds(gfx::Rect(work_area)); |
- } else { |
- window->SetBounds(gfx::Rect(work_area)); |
- } |
} |
} |
@@ -119,6 +130,14 @@ void AthenaContainerLayoutManager::OnWindowRemovedFromLayout( |
void AthenaContainerLayoutManager::OnChildWindowVisibilityChanged( |
aura::Window* child, |
bool visible) { |
+ if (visible && CanWindowMaximize(child)) { |
+ // Make sure we're resizing a window that actually exists in the window list |
+ // to avoid resizing the divider in the split mode. |
+ if(instance->window_list_provider_->IsWindowInList(child)) { |
+ child->SetBounds( |
+ gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area()); |
+ } |
+ } |
} |
void AthenaContainerLayoutManager::SetChildBounds( |
@@ -291,7 +310,11 @@ void WindowManagerImpl::OnSelectWindow(aura::Window* window) { |
// resized. |
const gfx::Size work_area = |
gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); |
- if (window->GetTargetBounds().size() != work_area) { |
+ |
+ // Resize to the screen bounds only if the window is maximize-able, and |
+ // is not already maximized |
+ if (window->GetTargetBounds().size() != work_area && |
+ CanWindowMaximize(window)) { |
const gfx::Rect& window_bounds = window->bounds(); |
const gfx::Rect desired_bounds(work_area); |
gfx::Transform transform; |