Chromium Code Reviews| 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..bab298a6c1770b3fe9f1baf0ed0f07ac467673a4 |
| --- /dev/null |
| +++ b/remoting/host/touch_injector_win.h |
| @@ -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. |
| + |
| +#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. |
| + // Ownership of |library| transfers. |
|
Wez
2015/03/21 01:10:09
You mean the delegate takes ownership of |library|
Rintaro Kuroiwa
2015/03/24 20:34:47
Yes, the delegate takes ownership. Reworded.
Nativ
|
| + 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(). |
| + // If points in contact are not specified in |event|, *TouchPoints() methods |
| + // will inject them as "move" events with the same values as the previous call |
| + // to these methods. |
| + // For example: |
| + // 1. AddNewTouchPoints(id = 1) |
| + // 2. AddNewTouchPoints(id = 2) |
| + // Step 2 will inject move event for id = 1 and start event for id = 2. |
|
Wez
2015/03/21 01:10:09
I'd suggest rewording this to simply say something
Rintaro Kuroiwa
2015/03/24 20:34:47
Done.
|
| + 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 when not usable. |
|
Wez
2015/03/21 01:10:09
That's somewhat tautologous; if it's NULL then it'
Rintaro Kuroiwa
2015/03/24 20:34:47
Done.
|
| + scoped_ptr<TouchInjectorWinDelegate> delegate_; |
| + |
| + // TODO(rkuroiwa): This is a naive implementation. Check if we can achieve |
|
Wez
2015/03/21 01:10:09
nit: File a bug to make that optimization, so this
Rintaro Kuroiwa
2015/03/24 20:34:47
Oh right. Thanks for reminding!
Done.
|
| + // 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_ |