Index: remoting/host/touch_injector_win.h |
diff --git a/remoting/host/touch_injector_win.h b/remoting/host/touch_injector_win.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b429dea46ed01b138b7f4cb2e36ed5e813cfcab |
--- /dev/null |
+++ b/remoting/host/touch_injector_win.h |
@@ -0,0 +1,106 @@ |
+// 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. |
+ |
+#ifndef REMOTING_HOST_TOUCH_INJECTOR_WIN_H_ |
+#define REMOTING_HOST_TOUCH_INJECTOR_WIN_H_ |
+ |
+#include <windows.h> |
+#include <map> |
+#include <vector> |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/scoped_native_library.h" |
+ |
+namespace remoting { |
+ |
+namespace protocol { |
+ |
+class TouchEvent; |
+ |
+} // namespace protocol |
+ |
+// This class calls InitializeTouchInjection() and InjectTouchInput() functions. |
+// The methods are virtual for mocking. |
+class TouchInjectorWinDelegate { |
+ public: |
+ virtual ~TouchInjectorWinDelegate(); |
+ |
+ // Determines whether Windows touch injection functions can be used. |
+ // Returns a non-null TouchInjectorWinDelegate on success. |
+ static scoped_ptr<TouchInjectorWinDelegate> Create(); |
+ |
+ // These match the functions in MSDN. |
+ virtual BOOL InitializeTouchInjection(UINT32 max_count, DWORD dw_mode); |
+ virtual DWORD InjectTouchInput(UINT32 count, |
+ const POINTER_TOUCH_INFO* contacts); |
+ |
+ protected: |
+ // Ctor in protected scope for mocking. |
+ // This object takes ownership of the |library|. |
+ TouchInjectorWinDelegate( |
+ base::NativeLibrary library, |
+ BOOL(NTAPI* initialize_touch_injection_func)(UINT32, DWORD), |
+ BOOL(NTAPI* inject_touch_input_func)(UINT32, const POINTER_TOUCH_INFO*)); |
+ |
+ private: |
+ base::ScopedNativeLibrary library_module_; |
+ |
+ // Pointers to Windows touch injection functions. |
+ BOOL(NTAPI* initialize_touch_injection_func_)(UINT32, DWORD); |
+ BOOL(NTAPI* inject_touch_input_func_)(UINT32, const POINTER_TOUCH_INFO*); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TouchInjectorWinDelegate); |
+}; |
+ |
+// This class converts TouchEvent objects to POINTER_TOUCH_INFO so that it can |
+// be injected using the Windows touch injection API, and calls the injection |
+// functions. |
+// This class expects good inputs and does not sanity check the inputs. |
+// This class just converts the object and hands it off to the Windows API. |
+class TouchInjectorWin { |
+ public: |
+ TouchInjectorWin(); |
+ ~TouchInjectorWin(); |
+ |
+ // Returns false if initialization of touch injection APIs fails. |
+ bool Init(); |
+ |
+ // Deinitializes the object so that it can be reinitialized. |
+ void Deinitialize(); |
+ |
+ // Inject touch events. |
+ void InjectTouchEvent(const protocol::TouchEvent& event); |
+ |
+ void SetInjectorDelegateForTest( |
+ scoped_ptr<TouchInjectorWinDelegate> functions); |
+ |
+ private: |
+ // Helper methods called from InjectTouchEvent(). |
+ // These helpers adapt Chromoting touch events, which convey changes to touch |
+ // points, to Windows touch descriptions, which must include descriptions for |
+ // all currently-active touch points, not just the changed ones. |
+ void AddNewTouchPoints(const protocol::TouchEvent& event); |
+ void MoveTouchPoints(const protocol::TouchEvent& event); |
+ void EndTouchPoints(const protocol::TouchEvent& event); |
+ void CancelTouchPoints(const protocol::TouchEvent& event); |
+ |
+ // Set to null if touch injection is not available from the OS. |
+ scoped_ptr<TouchInjectorWinDelegate> delegate_; |
+ |
+ // TODO(rkuroiwa): crbug.com/470203 |
+ // This is a naive implementation. Check if we can achieve |
+ // better performance by reducing the number of copies. |
+ // To reduce the number of copies, we can have a vector of |
+ // POINTER_TOUCH_INFO and a map from touch ID to index in the vector. |
+ // When removing points from the vector, just swap it with the last element |
+ // and resize the vector. |
+ // All the POINTER_TOUCH_INFOs are stored as "move" points. |
+ std::map<uint32_t, POINTER_TOUCH_INFO> touches_in_contact_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TouchInjectorWin); |
+}; |
+ |
+} // namespace remoting |
+ |
+#endif // REMOTING_HOST_TOUCH_INJECTOR_WIN_H_ |