1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/ash_window_tree_host.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/ash_export.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/ash_switches.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/ash_remote_window_tree_host_win.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/host/ash_window_tree_host_init_params.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/root_window_transformer.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/host/transformer_helper.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/command_line.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/win/windows_version.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/aura/window_tree_host_win.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/geometry/insets.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/transform.h"
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace ash {
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace {
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AshWindowTreeHostWin : public AshWindowTreeHost,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             public aura::WindowTreeHostWin {
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  explicit AshWindowTreeHostWin(const gfx::Rect& initial_bounds)
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : aura::WindowTreeHostWin(initial_bounds),
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        fullscreen_(false),
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        saved_window_style_(0),
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        saved_window_ex_style_(0),
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        transformer_helper_(this) {}
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~AshWindowTreeHostWin() {}
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // AshWindowTreeHost:
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void ToggleFullScreen() OVERRIDE {
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    gfx::Rect target_rect;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (!fullscreen_) {
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      fullscreen_ = true;
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      saved_window_style_ = GetWindowLong(hwnd(), GWL_STYLE);
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      saved_window_ex_style_ = GetWindowLong(hwnd(), GWL_EXSTYLE);
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GetWindowRect(hwnd(), &saved_window_rect_);
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SetWindowLong(hwnd(),
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    GWL_STYLE,
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                    saved_window_style_ & ~(WS_CAPTION | WS_THICKFRAME));
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SetWindowLong(
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          hwnd(),
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          GWL_EXSTYLE,
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          saved_window_ex_style_ & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE |
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      MONITORINFO mi;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      mi.cbSize = sizeof(mi);
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTONEAREST), &mi);
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      target_rect = gfx::Rect(mi.rcMonitor);
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    } else {
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      fullscreen_ = false;
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SetWindowLong(hwnd(), GWL_STYLE, saved_window_style_);
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      SetWindowLong(hwnd(), GWL_EXSTYLE, saved_window_ex_style_);
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      target_rect = gfx::Rect(saved_window_rect_);
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetWindowPos(hwnd(),
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 NULL,
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 target_rect.x(),
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 target_rect.y(),
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 target_rect.width(),
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 target_rect.height(),
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                 SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual bool ConfineCursorToRootWindow() OVERRIDE { return false; }
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void UnConfineCursor() OVERRIDE { NOTIMPLEMENTED(); }
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetRootWindowTransformer(
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      scoped_ptr<RootWindowTransformer> transformer) {
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    transformer_helper_.SetRootWindowTransformer(transformer.Pass());
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Insets GetHostInsets() const OVERRIDE {
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return transformer_helper_.GetHostInsets();
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual aura::WindowTreeHost* AsWindowTreeHost() OVERRIDE { return this; }
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // WindowTreeHostWin:
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE {
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (fullscreen_) {
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      saved_window_rect_.right = saved_window_rect_.left + bounds.width();
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      saved_window_rect_.bottom = saved_window_rect_.top + bounds.height();
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return;
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    WindowTreeHostWin::SetBounds(bounds);
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetRootTransform(const gfx::Transform& transform) OVERRIDE {
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    transformer_helper_.SetTransform(transform);
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::Transform GetRootTransform() const {
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return transformer_helper_.GetTransform();
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual gfx::Transform GetInverseRootTransform() const OVERRIDE {
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return transformer_helper_.GetInverseTransform();
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void UpdateRootWindowSize(const gfx::Size& host_size) OVERRIDE {
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    transformer_helper_.UpdateWindowSize(host_size);
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool fullscreen_;
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RECT saved_window_rect_;
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DWORD saved_window_style_;
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DWORD saved_window_ex_style_;
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TransformerHelper transformer_helper_;
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AshWindowTreeHostWin);
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AshWindowTreeHost* AshWindowTreeHost::Create(
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const AshWindowTreeHostInitParams& init_params) {
1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (base::win::GetVersion() >= base::win::VERSION_WIN7 &&
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      !CommandLine::ForCurrentProcess()->HasSwitch(
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ash::switches::kForceAshToDesktop))
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return new AshRemoteWindowTreeHostWin(init_params.remote_hwnd);
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new AshWindowTreeHostWin(init_params.initial_bounds);
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace ash
125