15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell/toplevel_window.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_controller.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_positioner.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace shell { 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct SavedState { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect bounds; 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::WindowShowState show_state; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The last window state in ash_shell. We don't bother deleting 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// this on shutdown. 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SavedState* saved_state = NULL; 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToplevelWindow::CreateParams::CreateParams() 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : can_resize(false), 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch can_maximize(false) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)views::Widget* ToplevelWindow::CreateToplevelWindow( 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const CreateParams& params) { 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::Widget* widget = views::Widget::CreateWindowWithContext( 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new ToplevelWindow(params), Shell::GetPrimaryRootWindow()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()->SetName("Examples:ToplevelWindow"); 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wm::WindowState* window_state = wm::GetWindowState(widget->GetNativeView()); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_state->set_window_position_managed(true); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return widget; 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// static 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void ToplevelWindow::ClearSavedStateForTest() { 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delete saved_state; 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) saved_state = NULL; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToplevelWindow::ToplevelWindow(const CreateParams& params) : params_(params) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ToplevelWindow::~ToplevelWindow() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ToplevelWindow::OnPaint(gfx::Canvas* canvas) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(GetLocalBounds(), SK_ColorDKGRAY); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::string16 ToplevelWindow::GetWindowTitle() const { 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16("Examples: Toplevel Window"); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ToplevelWindow::SaveWindowPlacement(const gfx::Rect& bounds, 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::WindowShowState show_state) { 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!saved_state) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) saved_state = new SavedState; 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) saved_state->bounds = bounds; 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) saved_state->show_state = show_state; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool ToplevelWindow::GetSavedWindowPlacement( 780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const views::Widget* widget, 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect* bounds, 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::WindowShowState* show_state) const { 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_saved_bounds = !!saved_state; 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (saved_state) { 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *bounds = saved_state->bounds; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *show_state = saved_state->show_state; 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Initial default bounds. 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bounds->SetRect(10, 150, 300, 300); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WindowPositioner::GetBoundsAndShowStateForNewWindow( 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::Shell::GetScreen(), 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NULL, 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_saved_bounds, 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *show_state, 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bounds, 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) show_state); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* ToplevelWindow::GetContentsView() { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToplevelWindow::CanResize() const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params_.can_resize; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ToplevelWindow::CanMaximize() const { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return params_.can_maximize; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ToplevelWindow::CanMinimize() const { 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return params_.can_maximize; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace shell 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 117