Chromium Code Reviews| Index: ui/gfx/win/direct_manipulation.cc |
| diff --git a/ui/gfx/win/direct_manipulation.cc b/ui/gfx/win/direct_manipulation.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..555a2cf44c6838b4e21dcf59eda18ca7ca314887 |
| --- /dev/null |
| +++ b/ui/gfx/win/direct_manipulation.cc |
| @@ -0,0 +1,103 @@ |
| +// 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/gfx/win/direct_manipulation.h" |
| + |
| +#include "base/basictypes.h" |
| +#include "base/win/windows_version.h" |
| + |
| +namespace gfx { |
| +namespace win { |
| + |
| +// static |
| +DirectManipulationHelper* DirectManipulationHelper::CreateInstance() { |
| + if (base::win::GetVersion() >= base::win::VERSION_WIN10) |
| + return new DirectManipulationHelper; |
| + return NULL; |
|
sky
2015/08/11 23:45:02
nullptr
ananta
2015/08/12 00:41:58
Not needed anymore with the function returning a s
|
| +} |
| + |
| +void DirectManipulationHelper::Initialize(HWND window) { |
| + DCHECK(::IsWindow(window)); |
| + |
| + // TODO(ananta) |
| + // Remove the CHECK statements here and below and replace them with logs |
| + // when this code stabilizes. |
| + HRESULT hr = manager_.CreateInstance(CLSID_DirectManipulationManager, |
| + nullptr, CLSCTX_INPROC_SERVER); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = compositor_.CreateInstance(CLSID_DCompManipulationCompositor, |
| + nullptr, CLSCTX_INPROC_SERVER); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = manager_->GetUpdateManager(IID_PPV_ARGS(update_manager_.Receive())); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = compositor_->SetUpdateManager(update_manager_.get()); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = frame_info_.QueryFrom(compositor_.get()); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = manager_->CreateViewport(frame_info_.get(), window, |
| + IID_PPV_ARGS(view_port_outer_.Receive())); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + // |
| + // Enable the desired configuration for each viewport. |
| + // |
| + DIRECTMANIPULATION_CONFIGURATION configuration = |
| + DIRECTMANIPULATION_CONFIGURATION_INTERACTION |
| + | DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X |
| + | DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y |
| + | DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA |
| + | DIRECTMANIPULATION_CONFIGURATION_RAILS_X |
| + | DIRECTMANIPULATION_CONFIGURATION_RAILS_Y |
| + | DIRECTMANIPULATION_CONFIGURATION_SCALING |
| + | DIRECTMANIPULATION_CONFIGURATION_SCALING_INERTIA; |
| + |
| + hr = view_port_outer_->ActivateConfiguration(configuration); |
| + CHECK(SUCCEEDED(hr)); |
| +} |
| + |
| +void DirectManipulationHelper::SetBounds(const gfx::Rect& bounds) { |
| + base::win::ScopedComPtr<IDirectManipulationPrimaryContent> |
| + primary_content_outer; |
| + HRESULT hr = view_port_outer_->GetPrimaryContent( |
| + IID_PPV_ARGS(primary_content_outer.Receive())); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + base::win::ScopedComPtr<IDirectManipulationContent> content_outer; |
| + hr = content_outer.QueryFrom(primary_content_outer.get()); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + RECT rect = bounds.ToRECT(); |
| + |
| + hr = view_port_outer_->SetViewportRect(&rect); |
| + CHECK(SUCCEEDED(hr)); |
| + |
| + hr = content_outer->SetContentRect(&rect); |
| + CHECK(SUCCEEDED(hr)); |
| +} |
| + |
| +void DirectManipulationHelper::Activate(HWND window) { |
| + DCHECK(::IsWindow(window)); |
| + HRESULT hr = manager_->Activate(window); |
| + CHECK(SUCCEEDED(hr)); |
| +} |
| + |
| +void DirectManipulationHelper:: HandleMouseWheel(HWND window, UINT message, |
| + WPARAM w_param, LPARAM l_param) { |
| + MSG msg = { window, message, w_param, l_param}; |
| + |
| + HRESULT hr = view_port_outer_->SetContact(DIRECTMANIPULATION_MOUSEFOCUS); |
| + if (SUCCEEDED(hr)) { |
| + BOOL handled = FALSE; |
| + manager_->ProcessInput(&msg, &handled); |
| + view_port_outer_->ReleaseContact(DIRECTMANIPULATION_MOUSEFOCUS); |
| + } |
| +} |
| + |
| +} // namespace win. |
| +} // namespace gfx. |