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

Unified Diff: ui/views/win/hwnd_message_handler.h

Issue 988473002: Correctly release the touch events on Lenovo Horizon device (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « ui/views/views.gyp ('k') | ui/views/win/hwnd_message_handler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/win/hwnd_message_handler.h
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index b5d712bf7d4369000d814c83a56db2fa587e90d1..e85c2247c662d7047eb5ec7439ce960b01bab42a 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -7,7 +7,7 @@
#include <windows.h>
-#include <set>
+#include <array>
#include <vector>
#include "base/basictypes.h"
@@ -21,6 +21,7 @@
#include "ui/base/ui_base_types.h"
#include "ui/base/win/window_event_target.h"
#include "ui/events/event.h"
+#include "ui/events/gesture_detection/motion_event.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/sequential_id_generator.h"
#include "ui/gfx/win/window_impl.h"
@@ -206,7 +207,27 @@ class VIEWS_EXPORT HWNDMessageHandler :
void SizeConstraintsChanged();
private:
- typedef std::set<DWORD> TouchIDs;
+ FRIEND_TEST_ALL_PREFIXES(HWNDMessageHandler, TestCorrectTouchInputList);
+ FRIEND_TEST_ALL_PREFIXES(HWNDMessageHandler, TestCombineTouchMoveAndUp);
+ FRIEND_TEST_ALL_PREFIXES(HWNDMessageHandler, TestMissingTouchRelease);
+ FRIEND_TEST_ALL_PREFIXES(HWNDMessageHandler, TestMissingTouchPress);
+
+ // We use InTouchList self-defined type to specify if the touch point from
+ // last message is in the current message or not.
+ enum class InTouchList { NotPresent, InPreviousMessage, InCurrentMessage };
+
+ // We need the touch location to release a touch point which is not in the
+ // current message.
+ struct TouchPoint {
+ gfx::Point location;
+ InTouchList in_touch_list;
+
+ TouchPoint() : in_touch_list(InTouchList::NotPresent) {}
+ };
+
+ using TouchEvents = std::vector<ui::TouchEvent>;
+ using TouchPointArray =
+ std::array<TouchPoint, ui::MotionEvent::MAX_TOUCH_POINT_COUNT>;
// Overridden from internal::InputMethodDelegate:
void DispatchKeyEventPostIME(const ui::KeyEvent& key) override;
@@ -453,7 +474,6 @@ class VIEWS_EXPORT HWNDMessageHandler :
// Receives Windows Session Change notifications.
void OnSessionChange(WPARAM status_code);
- typedef std::vector<ui::TouchEvent> TouchEvents;
// Helper to handle the list of touch events passed in. We need this because
// touch events on windows don't fire if we enter a modal loop in the context
// of a touch event.
@@ -461,7 +481,7 @@ class VIEWS_EXPORT HWNDMessageHandler :
// Resets the flag which indicates that we are in the context of a touch down
// event.
- void ResetTouchDownContext();
+ void DecrementTouchDownContext(int decrement);
// Helper to handle mouse events.
// The |message|, |w_param|, |l_param| parameters identify the Windows mouse
@@ -484,6 +504,23 @@ class VIEWS_EXPORT HWNDMessageHandler :
// Provides functionality to transition a frame to DWM.
void PerformDwmTransition();
+ void PrepareTouchEventList(TOUCHINPUT input[],
+ int num_points,
+ TouchEvents* touch_events);
+
+ // From one WM_TOUCH message, we will generate corresponding touch events.
+ void GenerateTouchEvent(DWORD input_dwID,
+ const gfx::Point& point_location,
+ ui::EventType touch_event_type,
+ TouchEvents* touch_events);
+
+ // It will release the touch points which are no longer in the current message
+ // because the messages are sent inconsistently, and also set the touch points
+ // we have seen in the current message to be InPreviousMessage.
+ void UpdateTouchPointStates(TouchEvents* touch_events);
+
+ const TouchPointArray& touch_id_list() const { return touch_id_list_; }
+
HWNDMessageHandlerDelegate* delegate_;
scoped_ptr<FullscreenHandler> fullscreen_handler_;
@@ -517,9 +554,6 @@ class VIEWS_EXPORT HWNDMessageHandler :
// area. We need this so we can correctly show the context menu on mouse-up.
bool is_right_mouse_pressed_on_caption_;
- // The set of touch devices currently down.
- TouchIDs touch_ids_;
-
// ScopedRedrawLock ----------------------------------------------------------
// Represents the number of ScopedRedrawLocks active against this widget.
@@ -588,6 +622,16 @@ class VIEWS_EXPORT HWNDMessageHandler :
// Manages observation of Windows Session Change messages.
scoped_ptr<WindowsSessionChangeObserver> windows_session_change_observer_;
+ // HWND Message sometimes sends inconsistent number of touch pointers, so we
+ // keep the IDs of touch pointers we have seen from last message, and compare
+ // with the current message in order to release the ones which are not in the
+ // current list, or send a touchpress when we see a new touch point. The
+ // index of the array is the touch_ID.
+ TouchPointArray touch_id_list_;
+
+ // Keep the count of the current active touch points.
+ int active_touch_point_count_;
+
// The WeakPtrFactories below must occur last in the class definition so they
// get destroyed last.
« no previous file with comments | « ui/views/views.gyp ('k') | ui/views/win/hwnd_message_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698