| 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..6fdb640f2f5bb947ea4167e92068a428a38ded0b
 | 
| --- /dev/null
 | 
| +++ b/ui/gfx/win/direct_manipulation.cc
 | 
| @@ -0,0 +1,109 @@
 | 
| +// 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
 | 
| +scoped_ptr<DirectManipulationHelper>
 | 
| +DirectManipulationHelper::CreateInstance() {
 | 
| +  scoped_ptr<DirectManipulationHelper> instance;
 | 
| +
 | 
| +  if (base::win::GetVersion() >= base::win::VERSION_WIN10)
 | 
| +    instance.reset(new DirectManipulationHelper);
 | 
| +
 | 
| +  return instance.Pass();
 | 
| +}
 | 
| +
 | 
| +DirectManipulationHelper::DirectManipulationHelper() {}
 | 
| +
 | 
| +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.
 | 
| 
 |