Index: ui/platform_window/win/win_window.cc |
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..11db5fcfa6fda1b0613f1ac82aa654ef42fb9133 |
--- /dev/null |
+++ b/ui/platform_window/win/win_window.cc |
@@ -0,0 +1,165 @@ |
+// Copyright 2014 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/platform_window/win/win_window.h" |
+ |
+#include "ui/events/event.h" |
+#include "ui/events/event_utils.h" |
+#include "ui/gfx/win/msg_util.h" |
+#include "ui/platform_window/platform_window_delegate.h" |
+ |
+namespace ui { |
+ |
+namespace { |
+ |
+gfx::Rect GetWindowBoundsForClientBounds(DWORD style, DWORD ex_style, |
+ const gfx::Rect& bounds) { |
+ RECT wr; |
+ wr.left = bounds.x(); |
+ wr.top = bounds.y(); |
+ wr.right = bounds.x() + bounds.width(); |
+ wr.bottom = bounds.y() + bounds.height(); |
+ AdjustWindowRectEx(&wr, style, FALSE, ex_style); |
+ |
+ // Make sure to keep the window onscreen, as AdjustWindowRectEx() may have |
+ // moved part of it offscreen. |
+ gfx::Rect window_bounds(wr.left, wr.top, |
+ wr.right - wr.left, wr.bottom - wr.top); |
+ window_bounds.set_x(std::max(0, window_bounds.x())); |
+ window_bounds.set_y(std::max(0, window_bounds.y())); |
+ return window_bounds; |
+} |
+ |
+} // namespace |
+ |
+WinWindow::WinWindow(PlatformWindowDelegate* delegate, |
+ const gfx::Rect& bounds) |
+ : delegate_(delegate) { |
+ CHECK(delegate_); |
+ gfx::Rect window_bounds = GetWindowBoundsForClientBounds( |
+ WS_OVERLAPPEDWINDOW, window_ex_style(), bounds); |
+ gfx::WindowImpl::Init(NULL, window_bounds); |
+ SetWindowText(hwnd(), L"WinWindow"); |
+} |
+ |
+WinWindow::~WinWindow() { |
+ Destroy(); |
+} |
+ |
+void WinWindow::Destroy() { |
+ if (IsWindow(hwnd())) |
+ DestroyWindow(hwnd()); |
+} |
+ |
+void WinWindow::Show() { |
+ ShowWindow(hwnd(), SW_SHOWNORMAL); |
+} |
+ |
+void WinWindow::Hide() { |
+ ShowWindow(hwnd(), SW_HIDE); |
+} |
+ |
+void WinWindow::Close() { |
+ Destroy(); |
+} |
+ |
+void WinWindow::SetBounds(const gfx::Rect& bounds) { |
+ gfx::Rect window_bounds = GetWindowBoundsForClientBounds( |
+ GetWindowLong(hwnd(), GWL_STYLE), |
+ GetWindowLong(hwnd(), GWL_EXSTYLE), |
+ bounds); |
+ SetWindowPos(hwnd(), NULL, window_bounds.x(), window_bounds.y(), |
+ window_bounds.width(), window_bounds.height(), |
+ SWP_NOREPOSITION); |
+} |
+ |
+gfx::Rect WinWindow::GetBounds() { |
+ RECT cr; |
+ GetClientRect(hwnd(), &cr); |
+ return gfx::Rect(cr); |
+} |
+ |
+void WinWindow::SetCapture() { |
+ DCHECK(::GetCapture() != hwnd()); |
+ ::SetCapture(hwnd()); |
+} |
+ |
+void WinWindow::ReleaseCapture() { |
+ if (::GetCapture() == hwnd()) |
+ ::ReleaseCapture(); |
+} |
+ |
+void WinWindow::ToggleFullscreen() {} |
+ |
+void WinWindow::Maximize() {} |
+ |
+void WinWindow::Minimize() {} |
+ |
+void WinWindow::Restore() {} |
+ |
+LRESULT WinWindow::OnMouseRange(UINT message, WPARAM w_param, LPARAM l_param) { |
+ MSG msg = { hwnd(), message, w_param, l_param, 0, |
+ { CR_GET_X_LPARAM(l_param), CR_GET_Y_LPARAM(l_param) } }; |
+ MouseEvent event(msg); |
+ if (IsMouseEventFromTouch(message)) |
+ event.set_flags(event.flags() | EF_FROM_TOUCH); |
+ if (!(event.flags() & ui::EF_IS_NON_CLIENT)) |
+ delegate_->DispatchEvent(&event); |
+ SetMsgHandled(event.handled()); |
+ return 0; |
+} |
+ |
+LRESULT WinWindow::OnCaptureChanged(UINT message, |
+ WPARAM w_param, |
+ LPARAM l_param) { |
+ delegate_->OnLostCapture(); |
+ return 0; |
+} |
+ |
+LRESULT WinWindow::OnKeyEvent(UINT message, WPARAM w_param, LPARAM l_param) { |
+ MSG msg = { hwnd(), message, w_param, l_param }; |
+ KeyEvent event(msg, message == WM_CHAR); |
+ delegate_->DispatchEvent(&event); |
+ SetMsgHandled(event.handled()); |
+ return 0; |
+} |
+ |
+LRESULT WinWindow::OnNCActivate(UINT message, WPARAM w_param, LPARAM l_param) { |
+ return DefWindowProc(hwnd(), message, w_param, l_param); |
+} |
+ |
+void WinWindow::OnClose() { |
+ delegate_->OnCloseRequest(); |
+} |
+ |
+LRESULT WinWindow::OnCreate(CREATESTRUCT* create_struct) { |
+ delegate_->OnAcceleratedWidgetAvailable(hwnd()); |
+ return 0; |
+} |
+ |
+void WinWindow::OnDestroy() { |
+ delegate_->OnClosed(); |
+} |
+ |
+void WinWindow::OnPaint(HDC) { |
+ gfx::Rect damage_rect; |
+ RECT update_rect = {0}; |
+ if (GetUpdateRect(hwnd(), &update_rect, FALSE)) |
+ damage_rect = gfx::Rect(update_rect); |
+ delegate_->OnDamageRect(damage_rect); |
+ ValidateRect(hwnd(), NULL); |
+} |
+ |
+void WinWindow::OnWindowPosChanged(WINDOWPOS* window_pos) { |
+ if (!(window_pos->flags & SWP_NOSIZE) || |
+ !(window_pos->flags & SWP_NOMOVE)) { |
+ RECT cr; |
+ GetClientRect(hwnd(), &cr); |
+ delegate_->OnBoundsChanged( |
+ gfx::Rect(window_pos->x, window_pos->y, |
+ cr.right - cr.left, cr.bottom - cr.top)); |
+ } |
+} |
+ |
+} // namespace ui |