1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ash/host/ash_window_tree_host.h"
7 #include "ash/ash_export.h"
8 #include "ash/ash_switches.h"
9 #include "ash/host/ash_remote_window_tree_host_win.h"
10 #include "ash/host/ash_window_tree_host_init_params.h"
11 #include "ash/host/root_window_transformer.h"
12 #include "ash/host/transformer_helper.h"
13 #include "ash/ime/input_method_event_handler.h"
14 #include "base/command_line.h"
15 #include "base/win/windows_version.h"
16 #include "ui/aura/window_tree_host_win.h"
17 #include "ui/events/event_processor.h"
18 #include "ui/gfx/geometry/insets.h"
19 #include "ui/gfx/transform.h"
24 class AshWindowTreeHostWin
: public AshWindowTreeHost
,
25 public aura::WindowTreeHostWin
{
27 explicit AshWindowTreeHostWin(const gfx::Rect
& initial_bounds
)
28 : aura::WindowTreeHostWin(initial_bounds
),
30 saved_window_style_(0),
31 saved_window_ex_style_(0),
32 transformer_helper_(this) {
33 transformer_helper_
.Init();
35 ~AshWindowTreeHostWin() override
{}
39 void ToggleFullScreen() override
{
40 gfx::Rect target_rect
;
43 saved_window_style_
= GetWindowLong(hwnd(), GWL_STYLE
);
44 saved_window_ex_style_
= GetWindowLong(hwnd(), GWL_EXSTYLE
);
45 GetWindowRect(hwnd(), &saved_window_rect_
);
48 saved_window_style_
& ~(WS_CAPTION
| WS_THICKFRAME
));
52 saved_window_ex_style_
& ~(WS_EX_DLGMODALFRAME
| WS_EX_WINDOWEDGE
|
53 WS_EX_CLIENTEDGE
| WS_EX_STATICEDGE
));
56 mi
.cbSize
= sizeof(mi
);
57 GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTONEAREST
), &mi
);
58 target_rect
= gfx::Rect(mi
.rcMonitor
);
61 SetWindowLong(hwnd(), GWL_STYLE
, saved_window_style_
);
62 SetWindowLong(hwnd(), GWL_EXSTYLE
, saved_window_ex_style_
);
63 target_rect
= gfx::Rect(saved_window_rect_
);
71 SWP_NOZORDER
| SWP_NOACTIVATE
| SWP_FRAMECHANGED
);
73 bool ConfineCursorToRootWindow() override
{ return false; }
74 void UnConfineCursor() override
{ NOTIMPLEMENTED(); }
75 void SetRootWindowTransformer(
76 scoped_ptr
<RootWindowTransformer
> transformer
) override
{
77 transformer_helper_
.SetRootWindowTransformer(transformer
.Pass());
79 gfx::Insets
GetHostInsets() const override
{
80 return transformer_helper_
.GetHostInsets();
82 aura::WindowTreeHost
* AsWindowTreeHost() override
{ return this; }
85 void SetBounds(const gfx::Rect
& bounds
) override
{
87 saved_window_rect_
.right
= saved_window_rect_
.left
+ bounds
.width();
88 saved_window_rect_
.bottom
= saved_window_rect_
.top
+ bounds
.height();
91 WindowTreeHostWin::SetBounds(bounds
);
93 void SetRootTransform(const gfx::Transform
& transform
) override
{
94 transformer_helper_
.SetTransform(transform
);
96 gfx::Transform
GetRootTransform() const override
{
97 return transformer_helper_
.GetTransform();
99 gfx::Transform
GetInverseRootTransform() const override
{
100 return transformer_helper_
.GetInverseTransform();
102 void UpdateRootWindowSize(const gfx::Size
& host_size
) override
{
103 transformer_helper_
.UpdateWindowSize(host_size
);
106 // ui::internal::InputMethodDelegate:
107 ui::EventDispatchDetails
DispatchKeyEventPostIME(
108 ui::KeyEvent
* event
) override
{
109 input_method_handler()->SetPostIME(true);
110 ui::EventDispatchDetails details
=
111 event_processor()->OnEventFromSource(event
);
112 if (!details
.dispatcher_destroyed
)
113 input_method_handler()->SetPostIME(false);
118 RECT saved_window_rect_
;
119 DWORD saved_window_style_
;
120 DWORD saved_window_ex_style_
;
122 TransformerHelper transformer_helper_
;
124 DISALLOW_COPY_AND_ASSIGN(AshWindowTreeHostWin
);
129 AshWindowTreeHost
* AshWindowTreeHost::Create(
130 const AshWindowTreeHostInitParams
& init_params
) {
131 if (base::win::GetVersion() >= base::win::VERSION_WIN7
&&
132 !base::CommandLine::ForCurrentProcess()->HasSwitch(
133 ash::switches::kForceAshToDesktop
))
134 return new AshRemoteWindowTreeHostWin(init_params
.remote_hwnd
);
136 return new AshWindowTreeHostWin(init_params
.initial_bounds
);