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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/metro.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkRegion.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/aura/client/cursor_client.h"
128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_property.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor_loader_win.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/ime/input_method.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/shell.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_constants.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/insets.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/gfx/path.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path_win.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/vector2d.h"
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_aura.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_win.h"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/corewm/tooltip_win.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/ime/input_method_bridge.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_cursor_loader_updater.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/root_view.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_hwnd_utils.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/win/fullscreen_handler.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/win/hwnd_message_handler.h"
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/compound_event_filter.h"
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/input_method_event_filter.h"
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_animations.h"
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/scoped_tooltip_disabler.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Size GetExpandedWindowSize(DWORD window_style, gfx::Size size) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!(window_style & WS_EX_COMPOSITED) || !ui::win::IsAeroGlassEnabled())
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return size;
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Some AMD drivers can't display windows that are less than 64x64 pixels,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // so expand them to be at least that size. http://crbug.com/286609
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Size expanded(std::max(size.width(), 64), std::max(size.height(), 64));
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return expanded;
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void InsetBottomRight(gfx::Rect* rect, gfx::Vector2d vector) {
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  rect->Inset(0, 0, vector.x(), vector.y());
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_WINDOW_PROPERTY_KEY(aura::Window*, kContentWindowForRootWindow, NULL);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Identifies the DesktopWindowTreeHostWin associated with the
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// WindowEventDispatcher.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_WINDOW_PROPERTY_KEY(DesktopWindowTreeHostWin*, kDesktopWindowTreeHostKey,
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           NULL);
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::is_cursor_visible_ = true;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DesktopWindowTreeHostWin::DesktopWindowTreeHostWin(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::NativeWidgetDelegate* native_widget_delegate,
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DesktopNativeWidgetAura* desktop_native_widget_aura)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : message_handler_(new HWNDMessageHandler(this)),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_widget_delegate_(native_widget_delegate),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desktop_native_widget_aura_(desktop_native_widget_aura),
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_window_(NULL),
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      drag_drop_client_(NULL),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_animate_window_close_(false),
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pending_close_(false),
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      has_non_client_view_(false),
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tooltip_(NULL) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DesktopWindowTreeHostWin::~DesktopWindowTreeHostWin() {
908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // WARNING: |content_window_| has been destroyed by the time we get here.
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  desktop_native_widget_aura_->OnDesktopWindowTreeHostDestroyed(this);
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyDispatcher();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)aura::Window* DesktopWindowTreeHostWin::GetContentWindowForHWND(HWND hwnd) {
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host =
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      aura::WindowTreeHost::GetForAcceleratedWidget(hwnd);
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return host ? host->window()->GetProperty(kContentWindowForRootWindow) : NULL;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ui::NativeTheme* DesktopWindowTreeHost::GetNativeTheme(aura::Window* window) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use NativeThemeWin for windows shown on the desktop, those not on the
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // desktop come from Ash and get NativeThemeAura.
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host = window ? window->GetHost() : NULL;
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host) {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    HWND host_hwnd = host->GetAcceleratedWidget();
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (host_hwnd &&
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        DesktopWindowTreeHostWin::GetContentWindowForHWND(host_hwnd)) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeThemeWin::instance();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::NativeThemeAura::instance();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, DesktopWindowTreeHost implementation:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DesktopWindowTreeHostWin::Init(aura::Window* content_window,
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    const Widget::InitParams& params) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): SetInitParams().
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_window_ = content_window;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::client::SetAnimationHost(content_window_, this);
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigureWindowStyles(message_handler_.get(), params,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetWidget()->widget_delegate(),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        native_widget_delegate_);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HWND parent_hwnd = NULL;
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (params.parent && params.parent->GetHost())
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    parent_hwnd = params.parent->GetHost()->GetAcceleratedWidget();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_handler_->set_remove_standard_frame(params.remove_standard_frame);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  has_non_client_view_ = Widget::RequiresNonClientView(params.type);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(params.bounds);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_handler_->Init(parent_hwnd, pixel_bounds);
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (params.type == Widget::InitParams::TYPE_MENU) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ::SetProp(GetAcceleratedWidget(),
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              kForceSoftwareCompositor,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              reinterpret_cast<HANDLE>(true));
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateCompositor(GetAcceleratedWidget());
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DesktopWindowTreeHostWin::OnNativeWidgetCreated(
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Widget::InitParams& params) {
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The cursor is not necessarily visible when the root window is created.
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::CursorClient* cursor_client =
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      aura::client::GetCursorClient(window());
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (cursor_client)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    is_cursor_visible_ = cursor_client->IsCursorVisible();
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window()->SetProperty(kContentWindowForRootWindow, content_window_);
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window()->SetProperty(kDesktopWindowTreeHostKey, this);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_animate_window_close_ =
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content_window_->type() != ui::wm::WINDOW_TYPE_NORMAL &&
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !wm::WindowAnimationsDisabled(content_window_);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// TODO this is not invoked *after* Init(), but should be ok.
1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SetWindowTransparency();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() {
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!tooltip_);
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tooltip_ = new corewm::TooltipWin(GetAcceleratedWidget());
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return scoped_ptr<corewm::Tooltip>(tooltip_);
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_ptr<aura::client::DragDropClient>
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DesktopWindowTreeHostWin::CreateDragDropClient(
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DesktopNativeCursorManager* cursor_manager) {
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  drag_drop_client_ = new DesktopDragDropClientWin(window(), GetHWND());
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return scoped_ptr<aura::client::DragDropClient>(drag_drop_client_).Pass();
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Close() {
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // TODO(beng): Move this entire branch to DNWA so it can be shared with X11.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_animate_window_close_) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pending_close_ = true;
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const bool is_animating =
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        content_window_->layer()->GetAnimator()->IsAnimatingProperty(
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            ui::LayerAnimationElement::VISIBILITY);
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Animation may not start for a number of reasons.
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!is_animating)
190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      message_handler_->Close();
191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // else case, OnWindowHidingAnimationCompleted does the actual Close.
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_handler_->Close();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::CloseNow() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->CloseNow();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)aura::WindowTreeHost* DesktopWindowTreeHostWin::AsWindowTreeHost() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::ShowWindowWithState(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WindowShowState show_state) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->ShowWindowWithState(show_state);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::ShowMaximizedWithBounds(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& restored_bounds) {
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect pixel_bounds = gfx::win::DIPToScreenRect(restored_bounds);
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_handler_->ShowMaximizedWithBounds(pixel_bounds);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsVisible() const {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->IsVisible();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetSize(const gfx::Size& size) {
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Size size_in_pixels = gfx::win::DIPToScreenSize(size);
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Size expanded = GetExpandedWindowSize(
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      message_handler_->window_ex_style(), size_in_pixels);
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_enlargement_ =
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Vector2d(expanded.width() - size_in_pixels.width(),
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    expanded.height() - size_in_pixels.height());
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  message_handler_->SetSize(expanded);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::StackAtTop() {
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  message_handler_->StackAtTop();
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::CenterWindow(const gfx::Size& size) {
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Size size_in_pixels = gfx::win::DIPToScreenSize(size);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size expanded_size;
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expanded_size = GetExpandedWindowSize(message_handler_->window_ex_style(),
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        size_in_pixels);
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_enlargement_ =
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gfx::Vector2d(expanded_size.width() - size_in_pixels.width(),
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    expanded_size.height() - size_in_pixels.height());
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  message_handler_->CenterWindow(expanded_size);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::GetWindowPlacement(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect* bounds,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WindowShowState* show_state) const {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->GetWindowPlacement(bounds, show_state);
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InsetBottomRight(bounds, window_enlargement_);
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  *bounds = gfx::win::ScreenToDIPRect(*bounds);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect DesktopWindowTreeHostWin::GetWindowBoundsInScreen() const {
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen();
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InsetBottomRight(&pixel_bounds, window_enlargement_);
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::win::ScreenToDIPRect(pixel_bounds);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() const {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen();
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InsetBottomRight(&pixel_bounds, window_enlargement_);
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::win::ScreenToDIPRect(pixel_bounds);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect DesktopWindowTreeHostWin::GetRestoredBounds() const {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds();
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  InsetBottomRight(&pixel_bounds, window_enlargement_);
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::win::ScreenToDIPRect(pixel_bounds);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect DesktopWindowTreeHostWin::GetWorkAreaBoundsInScreen() const {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MONITORINFO monitor_info;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  monitor_info.cbSize = sizeof(monitor_info);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMonitorInfo(MonitorFromWindow(message_handler_->hwnd(),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   MONITOR_DEFAULTTONEAREST),
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &monitor_info);
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect pixel_bounds = gfx::Rect(monitor_info.rcWork);
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return gfx::win::ScreenToDIPRect(pixel_bounds);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetShape(gfx::NativeRegion native_region) {
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (native_region) {
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    message_handler_->SetRegion(gfx::CreateHRGNFromSkRegion(*native_region));
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    message_handler_->SetRegion(NULL);
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  delete native_region;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Activate() {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Activate();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Deactivate() {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Deactivate();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsActive() const {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->IsActive();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Maximize() {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Maximize();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Minimize() {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Minimize();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Restore() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Restore();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsMaximized() const {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->IsMaximized();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsMinimized() const {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->IsMinimized();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HasCapture() const {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->HasCapture();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetAlwaysOnTop(bool always_on_top) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->SetAlwaysOnTop(always_on_top);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsAlwaysOnTop() const {
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return message_handler_->IsAlwaysOnTop();
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DesktopWindowTreeHostWin::SetVisibleOnAllWorkspaces(bool always_visible) {
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Windows does not have the concept of workspaces.
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::SetWindowTitle(const base::string16& title) {
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return message_handler_->SetTitle(title);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::ClearNativeFocus() {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->ClearNativeFocus();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Widget::MoveLoopResult DesktopWindowTreeHostWin::RunMoveLoop(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Vector2d& drag_offset,
34968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Widget::MoveLoopSource source,
35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Widget::MoveLoopEscapeBehavior escape_behavior) {
35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const bool hide_on_escape =
35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      escape_behavior == Widget::MOVE_LOOP_ESCAPE_BEHAVIOR_HIDE;
35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return message_handler_->RunMoveLoop(drag_offset, hide_on_escape) ?
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Widget::MOVE_LOOP_SUCCESSFUL : Widget::MOVE_LOOP_CANCELED;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::EndMoveLoop() {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->EndMoveLoop();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetVisibilityChangedAnimationsEnabled(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool value) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->SetVisibilityChangedAnimationsEnabled(value);
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content_window_->SetProperty(aura::client::kAnimationsDisabledKey, !value);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::ShouldUseNativeFrame() const {
3688f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  return IsTranslucentWindowOpacitySupported();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::ShouldWindowContentsBeTransparent() const {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the window has a native frame, we assume it is an Aero Glass window, and
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is therefore transparent. Note: This is not equivalent to calling
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // IsAeroGlassEnabled, because ShouldUseNativeFrame is overridden in a
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // subclass.
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ShouldUseNativeFrame();
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::FrameTypeChanged() {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->FrameTypeChanged();
3810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SetWindowTransparency();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetFullscreen(bool fullscreen) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->fullscreen_handler()->SetFullscreen(fullscreen);
386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(sky): workaround for ScopedFullscreenVisibility showing window
387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // directly. Instead of this should listen for visibility changes and then
388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // update window.
389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (message_handler_->IsVisible() && !content_window_->TargetVisibility())
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content_window_->Show();
3910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  SetWindowTransparency();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsFullscreen() const {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->fullscreen_handler()->fullscreen();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetOpacity(unsigned char opacity) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->SetOpacity(static_cast<BYTE>(opacity));
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content_window_->layer()->SetOpacity(opacity / 255.0);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetWindowIcons(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& window_icon, const gfx::ImageSkia& app_icon) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->SetWindowIcons(window_icon, app_icon);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::InitModalType(ui::ModalType modal_type) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->InitModalType(modal_type);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::FlashFrame(bool flash_frame) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->FlashFrame(flash_frame);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnRootViewLayout() const {
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnNativeWidgetFocus() {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HWNDMessageHandler will perform the proper updating on its own.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnNativeWidgetBlur() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsAnimatingClosed() const {
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return pending_close_;
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4308f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liubool DesktopWindowTreeHostWin::IsTranslucentWindowOpacitySupported() const {
4318f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  return ui::win::IsAeroGlassEnabled();
4328f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu}
4338f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, WindowTreeHost implementation:
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuui::EventSource* DesktopWindowTreeHostWin::GetEventSource() {
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return this;
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::AcceleratedWidget DesktopWindowTreeHostWin::GetAcceleratedWidget() {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->hwnd();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Show() {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->Show();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::Hide() {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!pending_close_)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_handler_->Hide();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// GetBounds and SetBounds work in pixel coordinates, whereas other get/set
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// methods work in DIP.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Rect DesktopWindowTreeHostWin::GetBounds() const {
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect bounds(message_handler_->GetClientAreaBounds());
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If the window bounds were expanded we need to return the original bounds
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // To achieve this we do the reverse of the expansion, i.e. add the
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // window_expansion_top_left_delta_ to the origin and subtract the
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // window_expansion_bottom_right_delta_ from the width and height.
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect without_expansion(
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.x() + window_expansion_top_left_delta_.x(),
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.y() + window_expansion_top_left_delta_.y(),
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bounds.width() - window_expansion_bottom_right_delta_.x() -
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          window_enlargement_.x(),
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bounds.height() - window_expansion_bottom_right_delta_.y() -
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          window_enlargement_.y());
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return without_expansion;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetBounds(const gfx::Rect& bounds) {
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If the window bounds have to be expanded we need to subtract the
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // window_expansion_top_left_delta_ from the origin and add the
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // window_expansion_bottom_right_delta_ to the width and height
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size old_hwnd_size(message_handler_->GetClientAreaBounds().size());
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Size old_content_size = GetBounds().size();
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect expanded(
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.x() - window_expansion_top_left_delta_.x(),
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.y() - window_expansion_top_left_delta_.y(),
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.width() + window_expansion_bottom_right_delta_.x(),
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bounds.height() + window_expansion_bottom_right_delta_.y());
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect new_expanded(
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      expanded.origin(),
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetExpandedWindowSize(message_handler_->window_ex_style(),
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            expanded.size()));
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  window_enlargement_ =
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      gfx::Vector2d(new_expanded.width() - expanded.width(),
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    new_expanded.height() - expanded.height());
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  message_handler_->SetBounds(new_expanded, old_content_size != bounds.size());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Point DesktopWindowTreeHostWin::GetLocationOnNativeScreen() const {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetBounds().origin();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetCapture() {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->SetCapture();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::ReleaseCapture() {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_handler_->ReleaseCapture();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::PostNativeEvent(
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::NativeEvent& native_event) {
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnDeviceScaleFactorChanged(
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    float device_scale_factor) {
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetCursorNative(gfx::NativeCursor cursor) {
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::CursorLoaderWin cursor_loader;
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor_loader.SetPlatformCursor(&cursor);
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  message_handler_->SetCursor(cursor.platform());
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnCursorVisibilityChangedNative(bool show) {
524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (is_cursor_visible_ == show)
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  is_cursor_visible_ = show;
5270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ::ShowCursor(!!show);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::MoveCursorToNative(const gfx::Point& location) {
531b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  POINT cursor_location = location.ToPOINT();
532b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ::ClientToScreen(GetHWND(), &cursor_location);
533b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ::SetCursorPos(cursor_location.x, cursor_location.y);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, ui::EventSource implementation:
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ui::EventProcessor* DesktopWindowTreeHostWin::GetEventProcessor() {
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return dispatcher();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, aura::AnimationHost implementation:
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetHostTransitionOffsets(
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const gfx::Vector2d& top_left_delta,
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const gfx::Vector2d& bottom_right_delta) {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds_without_expansion = GetBounds();
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_expansion_top_left_delta_ = top_left_delta;
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_expansion_bottom_right_delta_ = bottom_right_delta;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetBounds(bounds_without_expansion);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::OnWindowHidingAnimationCompleted() {
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (pending_close_)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_handler_->Close();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, HWNDMessageHandlerDelegate implementation:
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsWidgetWindow() const {
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return has_non_client_view_;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsUsingCustomFrame() const {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !GetWidget()->ShouldUseNativeFrame();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SchedulePaint() {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->GetRootView()->SchedulePaint();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::EnableInactiveRendering() {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->EnableInactiveRendering();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsInactiveRenderingDisabled() {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->IsInactiveRenderingDisabled();
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::CanResize() const {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->widget_delegate()->CanResize();
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::CanMaximize() const {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->widget_delegate()->CanMaximize();
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::CanActivate() const {
5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (IsModalWindowActive())
5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return true;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->CanActivate();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::WidgetSizeIsClientSize() const {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Widget* widget = GetWidget()->GetTopLevelWidget();
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsMaximized() || (widget && widget->ShouldUseNativeFrame());
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsModal() const {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->IsModal();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int DesktopWindowTreeHostWin::GetInitialShowState() const {
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return CanActivate() ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::WillProcessWorkAreaChange() const {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->widget_delegate()->WillProcessWorkAreaChange();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int DesktopWindowTreeHostWin::GetNonClientComponent(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Point dip_position = gfx::win::ScreenToDIPPoint(point);
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return native_widget_delegate_->GetNonClientComponent(dip_position);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::GetWindowMask(const gfx::Size& size,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             gfx::Path* path) {
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (GetWidget()->non_client_view()) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetWidget()->non_client_view()->GetWindowMask(size, path);
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else if (!window_enlargement_.IsZero()) {
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    gfx::Rect bounds(WidgetSizeIsClientSize()
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         ? message_handler_->GetClientAreaBoundsInScreen()
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         : message_handler_->GetWindowBoundsInScreen());
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    InsetBottomRight(&bounds, window_enlargement_);
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    path->addRect(SkRect::MakeXYWH(0, 0, bounds.width(), bounds.height()));
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::GetClientAreaInsets(gfx::Insets* insets) const {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::GetMinMaxSize(gfx::Size* min_size,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             gfx::Size* max_size) const {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *min_size = native_widget_delegate_->GetMinimumSize();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *max_size = native_widget_delegate_->GetMaximumSize();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Size DesktopWindowTreeHostWin::GetRootViewSize() const {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetRootView()->size();
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::ResetWindowControls() {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->non_client_view()->ResetWindowControls();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::PaintLayeredWindow(gfx::Canvas* canvas) {
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetWidget()->GetRootView()->Paint(canvas, views::CullSet());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeViewAccessible DesktopWindowTreeHostWin::GetNativeViewAccessible() {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetRootView()->GetNativeViewAccessible();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)InputMethod* DesktopWindowTreeHostWin::GetInputMethod() {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetInputMethodDirect();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::ShouldHandleSystemCommands() const {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetWidget()->widget_delegate()->ShouldHandleSystemCommands();
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleAppDeactivated() {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->EnableInactiveRendering();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleActivationChanged(bool active) {
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This can be invoked from HWNDMessageHandler::Init(), at which point we're
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // not in a good state and need to ignore it.
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(beng): Do we need this still now the host owns the dispatcher?
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!dispatcher())
6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (active)
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    OnHostActivated();
68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  desktop_native_widget_aura_->HandleActivationChanged(active);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleAppCommand(short command) {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We treat APPCOMMAND ids as an extension of our command namespace, and just
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // let the delegate figure out what to do...
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->widget_delegate() &&
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetWidget()->widget_delegate()->ExecuteWindowsCommand(command);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleCancelMode() {
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dispatcher()->DispatchCancelModeEvent();
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleCaptureLost() {
695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHostLostWindowCapture();
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnMouseCaptureLost();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleClose() {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->Close();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleCommand(int command) {
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleAccelerator(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator& accelerator) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->GetFocusManager()->ProcessAccelerator(accelerator);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleCreate() {
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  native_widget_delegate_->OnNativeWidgetCreated(true);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleDestroying() {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  drag_drop_client_->OnNativeWidgetDestroying(GetHWND());
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetDestroying();
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Destroy the compositor before destroying the HWND since shutdown
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // may try to swap to the window.
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DestroyCompositor();
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleDestroyed() {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desktop_native_widget_aura_->OnHostClosed();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleInitialFocus(
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::WindowShowState show_state) {
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetWidget()->SetInitialFocus(show_state);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleDisplayChange() {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->widget_delegate()->OnDisplayChanged();
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleBeginWMSizeMove() {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetBeginUserBoundsChange();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleEndWMSizeMove() {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetEndUserBoundsChange();
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleMove() {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetMove();
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnHostMoved(GetBounds().origin());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleWorkAreaChanged() {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->widget_delegate()->OnWorkAreaChanged();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleVisibilityChanging(bool visible) {
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetVisibilityChanging(visible);
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleVisibilityChanged(bool visible) {
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_widget_delegate_->OnNativeWidgetVisibilityChanged(visible);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleClientSizeChanged(
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Size& new_size) {
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (dispatcher())
766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    OnHostResized(new_size);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleFrameChanged() {
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetWindowTransparency();
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Replace the frame and layout the contents.
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetWidget()->non_client_view()->UpdateFrame();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleNativeFocus(HWND last_focused_window) {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): inform the native_widget_delegate_.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethod* input_method = GetInputMethod();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_method)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method->OnFocus();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): inform the native_widget_delegate_.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethod* input_method = GetInputMethod();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input_method)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method->OnBlur();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleMouseEvent(const ui::MouseEvent& event) {
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendEventToProcessor(const_cast<ui::MouseEvent*>(&event));
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return event.handled();
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleKeyEvent(const ui::KeyEvent& event) {
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleUntranslatedKeyEvent(
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::KeyEvent& event) {
800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::KeyEvent duplicate_event(event);
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendEventToProcessor(&duplicate_event);
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return duplicate_event.handled();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleTouchEvent(
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::TouchEvent& event) {
80758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // HWNDMessageHandler asynchronously processes touch events. Because of this
808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // it's possible for the aura::WindowEventDispatcher to have been destroyed
809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // by the time we attempt to process them.
81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!GetWidget()->GetNativeView())
81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
8120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
8130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Currently we assume the window that has capture gets touch events too.
814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  aura::WindowTreeHost* host =
815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      aura::WindowTreeHost::GetForAcceleratedWidget(GetCapture());
816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (host) {
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DesktopWindowTreeHostWin* target =
818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        host->window()->GetProperty(kDesktopWindowTreeHostKey);
8190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (target && target->HasCapture() && target != this) {
8200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      POINT target_location(event.location().ToPOINT());
8210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ClientToScreen(GetHWND(), &target_location);
8220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ScreenToClient(target->GetHWND(), &target_location);
8230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ui::TouchEvent target_event(event, static_cast<View*>(NULL),
8240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                  static_cast<View*>(NULL));
8250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      target_event.set_location(gfx::Point(target_location));
8260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      target_event.set_root_location(target_event.location());
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      target->SendEventToProcessor(&target_event);
8280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return;
8290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
8300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendEventToProcessor(const_cast<ui::TouchEvent*>(&event));
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleIMEMessage(UINT message,
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                WPARAM w_param,
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                LPARAM l_param,
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                LRESULT* result) {
8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MSG msg = {};
8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  msg.hwnd = GetHWND();
8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  msg.message = message;
8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  msg.wParam = w_param;
8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  msg.lParam = l_param;
8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return desktop_native_widget_aura_->input_method_event_filter()->
8447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      input_method()->OnUntranslatedIMEMessage(msg, result);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleInputLanguageChange(
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD character_set,
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HKL input_language_id) {
8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  desktop_native_widget_aura_->input_method_event_filter()->
8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      input_method()->OnInputLocaleChanged();
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandlePaintAccelerated(
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& invalid_rect) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->OnNativeWidgetPaintAccelerated(invalid_rect);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandlePaint(gfx::Canvas* canvas) {
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // It appears possible to get WM_PAINT after WM_DESTROY.
861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor())
862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    compositor()->ScheduleRedrawRect(gfx::Rect());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleTooltipNotify(int w_param,
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   NMHDR* l_param,
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   LRESULT* l_result) {
8684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return tooltip_ && tooltip_->HandleNotify(w_param, l_param, l_result);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleTooltipMouseMove(UINT message,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      WPARAM w_param,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      LPARAM l_param) {
8744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TooltipWin implementation doesn't need this.
8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(sky): remove from HWNDMessageHandler once non-aura path nuked.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleMenuLoop(bool in_menu_loop) {
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (in_menu_loop) {
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tooltip_disabler_.reset(
881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new aura::client::ScopedTooltipDisabler(window()));
8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tooltip_disabler_.reset();
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::PreHandleMSG(UINT message,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            WPARAM w_param,
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            LPARAM l_param,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            LRESULT* result) {
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::PostHandleMSG(UINT message,
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             WPARAM w_param,
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             LPARAM l_param) {
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::HandleScrollEvent(
9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::ScrollEvent& event) {
9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendEventToProcessor(const_cast<ui::ScrollEvent*>(&event));
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return event.handled();
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DesktopWindowTreeHostWin::HandleWindowSizeChanging() {
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor())
907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    compositor()->FinishAllRendering();
908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHostWin, private:
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Widget* DesktopWindowTreeHostWin::GetWidget() {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->AsWidget();
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const Widget* DesktopWindowTreeHostWin::GetWidget() const {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_widget_delegate_->AsWidget();
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HWND DesktopWindowTreeHostWin::GetHWND() const {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message_handler_->hwnd();
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DesktopWindowTreeHostWin::SetWindowTransparency() {
9260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool transparent = ShouldUseNativeFrame() && !IsFullscreen();
927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  compositor()->SetHostHasTransparentBackground(transparent);
928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  window()->SetTransparent(transparent);
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content_window_->SetTransparent(transparent);
9300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
9310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool DesktopWindowTreeHostWin::IsModalWindowActive() const {
9334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This function can get called during window creation which occurs before
934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // dispatcher() has been created.
935a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!dispatcher())
9364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;
9374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  aura::Window::Windows::const_iterator index;
939a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (index = window()->children().begin();
940a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       index != window()->children().end();
9414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       ++index) {
9424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if ((*index)->GetProperty(aura::client::kModalKey) !=
9434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ui:: MODAL_TYPE_NONE && (*index)->TargetVisibility())
9444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return true;
9454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
9464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return false;
9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
9484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DesktopWindowTreeHost, public:
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DesktopWindowTreeHost* DesktopWindowTreeHost::Create(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    internal::NativeWidgetDelegate* native_widget_delegate,
9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DesktopNativeWidgetAura* desktop_native_widget_aura) {
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return new DesktopWindowTreeHostWin(native_widget_delegate,
9571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      desktop_native_widget_aura);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
961