Index: ui/base/touch/touch_device_win.cc |
diff --git a/ui/base/touch/touch_device_win.cc b/ui/base/touch/touch_device_win.cc |
index 0e1655f40b2a5568f1e42abc2ef401eb2fb0a535..ef4c316315022c21f2a1727b1b50d50fb36df70e 100644 |
--- a/ui/base/touch/touch_device_win.cc |
+++ b/ui/base/touch/touch_device_win.cc |
@@ -3,9 +3,9 @@ |
// found in the LICENSE file. |
#include "ui/base/touch/touch_device.h" |
+ |
#include "base/logging.h" |
-#include "base/win/windows_version.h" |
-#include <windows.h> |
+#include "base/win/win_util.h" |
namespace ui { |
@@ -17,29 +17,49 @@ bool IsTouchDevicePresent() { |
((value & NID_INTEGRATED_TOUCH) || (value & NID_EXTERNAL_TOUCH)); |
} |
+// The following method logic is as follow : |
+// - On versions prior to Windows 8 it will always return POINTER_TYPE_FINE |
+// and/or POINTER_TYPE_COARSE (if the device has a touch screen). |
+// - If the device is a detachable/convertible win8/10 device and the keyboard/ |
+// trackpad is detached/flipped it will always return POINTER_TYPE_COARSE. |
+// It does not cover the case where an external mouse/keyboard is connected |
+// while the device is used as a tablet. This is because Windows doesn't provide |
+// us a reliable way to detect keyboard/mouse presence with |
+// GetSystemMetrics(SM_MOUSEPRESENT). |
+// - If the device doesn't have a touch screen it will return POINTER_TYPE_FINE. |
+// In the rare cases (this is Microsoft documentation) where |
+// GetSystemMetrics(SM_MOUSEPRESENT) returns 0 we will return POINTER_TYPE_NONE. |
+// - If the device has a touch screen the available pointer devices are |
+// POINTER_TYPE_FINE and POINTER_TYPE_COARSE. |
int GetAvailablePointerTypes() { |
- int available_pointer_types = 0; |
+ // IsTabletDevice guarantees us that : |
+ // - The device has a touch screen. |
+ // - It is used as a tablet which means that it has no keyboard connected. |
+ // On Windows 10 it means that it is verifying with ConvertibleSlateMode. |
+ if (base::win::IsTabletDevice(nullptr)) |
+ return POINTER_TYPE_COARSE; |
+ |
+ if (GetSystemMetrics(SM_MOUSEPRESENT) == 0) |
+ return POINTER_TYPE_NONE; |
+ |
+ int available_pointer_types = POINTER_TYPE_FINE; |
if (IsTouchDevicePresent()) |
available_pointer_types |= POINTER_TYPE_COARSE; |
- if (GetSystemMetrics(SM_MOUSEPRESENT) != 0 && |
- GetSystemMetrics(SM_CMOUSEBUTTONS) > 0) |
- available_pointer_types |= POINTER_TYPE_FINE; |
- |
- if (available_pointer_types == 0) |
- available_pointer_types = POINTER_TYPE_NONE; |
return available_pointer_types; |
} |
+// This method follows the same logic as above but with hover types. |
int GetAvailableHoverTypes() { |
- int available_hover_types = 0; |
+ if (base::win::IsTabletDevice(nullptr)) |
+ return HOVER_TYPE_ON_DEMAND; |
+ |
+ if (GetSystemMetrics(SM_MOUSEPRESENT) == 0) |
+ return HOVER_TYPE_NONE; |
+ |
+ int available_hover_types = HOVER_TYPE_HOVER; |
if (IsTouchDevicePresent()) |
available_hover_types |= HOVER_TYPE_ON_DEMAND; |
- if (GetSystemMetrics(SM_MOUSEPRESENT) != 0) |
- available_hover_types |= HOVER_TYPE_HOVER; |
- |
- if (available_hover_types == 0) |
- available_hover_types = HOVER_TYPE_NONE; |
return available_hover_types; |
} |