Index: ui/aura/window_tree_host_platform.cc |
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9205bc3b47c866e55580fc485a527a1cfbf8c88c |
--- /dev/null |
+++ b/ui/aura/window_tree_host_platform.cc |
@@ -0,0 +1,188 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/aura/window_tree_host_platform.h" |
+ |
+ |
sadrul
2015/10/15 19:47:40
Remove extra blank line.
no sievers
2015/10/16 18:26:15
Done.
|
+#include <algorithm> |
+ |
+#if defined(OS_WIN) |
+#include <windows.h> |
+#endif |
+ |
+#include "base/trace_event/trace_event.h" |
+#include "ui/aura/window_event_dispatcher.h" |
+#include "ui/compositor/compositor.h" |
+#include "ui/events/event.h" |
+ |
+#if defined(OS_ANDROID) |
+#include "ui/platform_window/android/platform_window_android.h" |
+#endif |
+ |
+#if defined(USE_OZONE) |
+#include "ui/ozone/public/ozone_platform.h" |
+#endif |
+ |
+#if defined(OS_WIN) |
+#include "base/message_loop/message_loop.h" |
+#include "ui/base/cursor/cursor_loader_win.h" |
+#include "ui/platform_window/win/win_window.h" |
+#endif |
+ |
+using std::max; |
+using std::min; |
+ |
+namespace aura { |
+ |
+// static |
+WindowTreeHost* WindowTreeHost::Create(const gfx::Rect& bounds) { |
+ return new WindowTreeHostPlatform(bounds); |
+} |
+ |
+WindowTreeHostPlatform::WindowTreeHostPlatform(const gfx::Rect& bounds) |
+ : widget_(gfx::kNullAcceleratedWidget), |
+ current_cursor_(ui::kCursorNull), |
+ has_capture_(false) { |
+#if defined(USE_OZONE) |
+ window_ = |
+ ui::OzonePlatform::GetInstance()->CreatePlatformWindow(this, bounds); |
+#elif defined(OS_WIN) |
+ window_.reset(new ui::WinWindow(this, bounds)); |
+#elif defined(OS_ANDROID) |
+ window_.reset(new ui::PlatformWindowAndroid(this)); |
+#else |
+ NOTIMPLEMENTED(); |
+#endif |
+} |
+ |
+WindowTreeHostPlatform::~WindowTreeHostPlatform() { |
+ DestroyCompositor(); |
+ DestroyDispatcher(); |
+} |
+ |
+ui::EventSource* WindowTreeHostPlatform::GetEventSource() { |
+ return this; |
+} |
+ |
+gfx::AcceleratedWidget WindowTreeHostPlatform::GetAcceleratedWidget() { |
+ return widget_; |
+} |
+ |
+void WindowTreeHostPlatform::ShowImpl() { |
+ window_->Show(); |
+} |
+ |
+void WindowTreeHostPlatform::HideImpl() { |
+ window_->Hide(); |
+} |
+ |
+gfx::Rect WindowTreeHostPlatform::GetBounds() const { |
+ return window_->GetBounds(); |
+} |
+ |
+void WindowTreeHostPlatform::SetBounds(const gfx::Rect& bounds) { |
+ window_->SetBounds(bounds); |
+} |
+ |
+gfx::Point WindowTreeHostPlatform::GetLocationOnNativeScreen() const { |
+ return window_->GetBounds().origin(); |
+} |
+ |
+void WindowTreeHostPlatform::SetCapture() { |
+ if (!has_capture_) { |
+ has_capture_ = true; |
+ window_->SetCapture(); |
+ } |
+} |
+ |
+void WindowTreeHostPlatform::ReleaseCapture() { |
+ if (has_capture_) |
+ window_->ReleaseCapture(); |
+} |
+ |
+void WindowTreeHostPlatform::SetCursorNative(gfx::NativeCursor cursor) { |
+ if (cursor == current_cursor_) |
+ return; |
+ current_cursor_ = cursor; |
+ |
+#if defined(OS_WIN) |
+ // Custom web cursors are handled directly. |
+ if (cursor == ui::kCursorCustom) |
+ return; |
+ |
+ ui::CursorLoaderWin cursor_loader; |
+ cursor_loader.SetPlatformCursor(&cursor); |
+ ::SetCursor(cursor.platform()); |
sadrul
2015/10/15 19:47:40
Can this bit move into WinWindow() instead, and we
no sievers
2015/10/16 18:26:15
Done.
|
+#else |
+ window_->SetCursor(cursor.platform()); |
+#endif |
+} |
+ |
+void WindowTreeHostPlatform::MoveCursorToNative(const gfx::Point& location) { |
+#if defined(OS_WIN) |
+// Deliberately not implemented. |
+#else |
+ window_->MoveCursorTo(location); |
+#endif |
sadrul
2015/10/15 19:47:39
WinWindow::MoveCursorTo() doesn't do anything. So
no sievers
2015/10/16 18:26:15
Done.
|
+} |
+ |
+void WindowTreeHostPlatform::OnCursorVisibilityChangedNative(bool show) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void WindowTreeHostPlatform::OnBoundsChanged(const gfx::Rect& new_bounds) { |
+ gfx::Rect old_bounds = bounds_; |
+ bounds_ = new_bounds; |
+ if (bounds_.origin() != old_bounds.origin()) |
no sievers
2015/10/16 00:06:14
These two optimizations for redundant calls are ca
|
+ OnHostMoved(bounds_.origin()); |
+ if (bounds_.size() != old_bounds.size()) |
+ OnHostResized(bounds_.size()); |
+} |
+ |
+void WindowTreeHostPlatform::OnDamageRect(const gfx::Rect& damage_rect) { |
+ compositor()->ScheduleRedrawRect(damage_rect); |
+} |
+ |
+void WindowTreeHostPlatform::DispatchEvent(ui::Event* event) { |
+ TRACE_EVENT0("input", "WindowTreeHostPlatform::DispatchEvent"); |
+ ui::EventDispatchDetails details = SendEventToProcessor(event); |
+ if (details.dispatcher_destroyed) |
+ event->SetHandled(); |
+} |
+ |
+void WindowTreeHostPlatform::OnCloseRequest() { |
+#if defined(OS_WIN) |
+ // TODO: this obviously shouldn't be here. |
+ base::MessageLoopForUI::current()->QuitWhenIdle(); |
+#else |
+ OnHostCloseRequested(); |
+#endif |
+} |
+ |
+void WindowTreeHostPlatform::OnClosed() {} |
+ |
+void WindowTreeHostPlatform::OnWindowStateChanged( |
+ ui::PlatformWindowState new_state) {} |
+ |
+void WindowTreeHostPlatform::OnLostCapture() { |
+ if (has_capture_) { |
+ has_capture_ = false; |
+ OnHostLostWindowCapture(); |
+ } |
+} |
+ |
+void WindowTreeHostPlatform::OnAcceleratedWidgetAvailable( |
+ gfx::AcceleratedWidget widget, |
+ float device_pixel_ratio) { |
+ widget_ = widget; |
+ CreateCompositor(); |
+ WindowTreeHost::OnAcceleratedWidgetAvailable(); |
+} |
+ |
+void WindowTreeHostPlatform::OnActivationChanged(bool active) { |
+ if (active) |
+ OnHostActivated(); |
+} |
+ |
+} // namespace aura |