Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(592)

Unified Diff: ui/gfx/win/direct_manipulation.cc

Issue 1283913002: Improve scroll performance on Windows 10 with high precision touchpads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed comment Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698