1 // Copyright (c) 2012 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 "ui/aura/window_tree_host_win.h"
11 #include "base/message_loop/message_loop.h"
12 #include "ui/aura/client/cursor_client.h"
13 #include "ui/aura/window_event_dispatcher.h"
14 #include "ui/base/cursor/cursor_loader_win.h"
15 #include "ui/base/view_prop.h"
16 #include "ui/compositor/compositor.h"
17 #include "ui/events/event.h"
18 #include "ui/gfx/display.h"
19 #include "ui/gfx/insets.h"
20 #include "ui/gfx/native_widget_types.h"
21 #include "ui/gfx/screen.h"
22 #include "ui/platform_window/win/win_window.h"
30 bool use_popup_as_root_window_for_test
= false;
35 WindowTreeHost
* WindowTreeHost::Create(const gfx::Rect
& bounds
) {
36 return new WindowTreeHostWin(bounds
);
40 gfx::Size
WindowTreeHost::GetNativeScreenSize() {
41 return gfx::Size(GetSystemMetrics(SM_CXSCREEN
),
42 GetSystemMetrics(SM_CYSCREEN
));
45 WindowTreeHostWin::WindowTreeHostWin(const gfx::Rect
& bounds
)
46 : has_capture_(false),
47 widget_(gfx::kNullAcceleratedWidget
),
48 window_(new ui::WinWindow(this, bounds
)) {
51 WindowTreeHostWin::~WindowTreeHostWin() {
57 ui::EventSource
* WindowTreeHostWin::GetEventSource() {
61 gfx::AcceleratedWidget
WindowTreeHostWin::GetAcceleratedWidget() {
65 void WindowTreeHostWin::Show() {
69 void WindowTreeHostWin::Hide() {
73 gfx::Rect
WindowTreeHostWin::GetBounds() const {
74 return window_
->GetBounds();
77 void WindowTreeHostWin::SetBounds(const gfx::Rect
& bounds
) {
78 window_
->SetBounds(bounds
);
81 gfx::Point
WindowTreeHostWin::GetLocationOnNativeScreen() const {
82 return window_
->GetBounds().origin();
85 void WindowTreeHostWin::SetCapture() {
88 window_
->SetCapture();
92 void WindowTreeHostWin::ReleaseCapture() {
94 window_
->ReleaseCapture();
97 void WindowTreeHostWin::SetCursorNative(gfx::NativeCursor native_cursor
) {
98 // Custom web cursors are handled directly.
99 if (native_cursor
== ui::kCursorCustom
)
102 ui::CursorLoaderWin cursor_loader
;
103 cursor_loader
.SetPlatformCursor(&native_cursor
);
104 ::SetCursor(native_cursor
.platform());
107 void WindowTreeHostWin::MoveCursorToNative(const gfx::Point
& location
) {
108 // Deliberately not implemented.
111 void WindowTreeHostWin::OnCursorVisibilityChangedNative(bool show
) {
115 void WindowTreeHostWin::PostNativeEvent(const base::NativeEvent
& native_event
) {
117 widget_
, native_event
.message
, native_event
.wParam
, native_event
.lParam
);
120 ui::EventProcessor
* WindowTreeHostWin::GetEventProcessor() {
124 void WindowTreeHostWin::OnBoundsChanged(const gfx::Rect
& new_bounds
) {
125 gfx::Rect old_bounds
= bounds_
;
126 bounds_
= new_bounds
;
127 if (bounds_
.origin() != old_bounds
.origin())
128 OnHostMoved(bounds_
.origin());
129 if (bounds_
.size() != old_bounds
.size())
130 OnHostResized(bounds_
.size());
133 void WindowTreeHostWin::OnDamageRect(const gfx::Rect
& damage_rect
) {
134 compositor()->ScheduleRedrawRect(damage_rect
);
137 void WindowTreeHostWin::DispatchEvent(ui::Event
* event
) {
138 ui::EventDispatchDetails details
= SendEventToProcessor(event
);
139 if (details
.dispatcher_destroyed
)
143 void WindowTreeHostWin::OnCloseRequest() {
144 // TODO: this obviously shouldn't be here.
145 base::MessageLoopForUI::current()->Quit();
148 void WindowTreeHostWin::OnClosed() {
151 void WindowTreeHostWin::OnWindowStateChanged(
152 ui::PlatformWindowState new_state
) {
155 void WindowTreeHostWin::OnLostCapture() {
157 has_capture_
= false;
158 OnHostLostWindowCapture();
162 void WindowTreeHostWin::OnAcceleratedWidgetAvailable(
163 gfx::AcceleratedWidget widget
) {
165 CreateCompositor(widget
);
168 void WindowTreeHostWin::OnActivationChanged(bool active
) {