#include "ui/base/pointer/pointer_device.h"
#include "base/check_op.h"
#include "base/win/win_util.h"
#include "ui/base/win/hidden_window.h"
namespace ui {
namespace {
bool IsTouchDevicePresent() {
int value = GetSystemMetrics(SM_DIGITIZER);
return (value & NID_READY) &&
((value & NID_INTEGRATED_TOUCH) || (value & NID_EXTERNAL_TOUCH));
}
}
int GetAvailablePointerTypes() {
if (base::win::IsDeviceUsedAsATablet(nullptr))
return POINTER_TYPE_COARSE;
bool is_touch_device_present = IsTouchDevicePresent();
if (GetSystemMetrics(SM_MOUSEPRESENT) == 0 && !is_touch_device_present)
return POINTER_TYPE_NONE;
int available_pointer_types = POINTER_TYPE_FINE;
if (is_touch_device_present)
available_pointer_types |= POINTER_TYPE_COARSE;
return available_pointer_types;
}
int GetAvailableHoverTypes() {
if (base::win::IsDeviceUsedAsATablet(nullptr))
return HOVER_TYPE_NONE;
if (GetSystemMetrics(SM_MOUSEPRESENT) != 0)
return HOVER_TYPE_HOVER;
return HOVER_TYPE_NONE;
}
TouchScreensAvailability GetTouchScreensAvailability() {
if (!IsTouchDevicePresent())
return TouchScreensAvailability::NONE;
return TouchScreensAvailability::ENABLED;
}
int MaxTouchPoints() {
if (!IsTouchDevicePresent())
return 0;
return GetSystemMetrics(SM_MAXIMUMTOUCHES);
}
PointerType GetPrimaryPointerType(int available_pointer_types) {
if (available_pointer_types & POINTER_TYPE_FINE)
return POINTER_TYPE_FINE;
if (available_pointer_types & POINTER_TYPE_COARSE)
return POINTER_TYPE_COARSE;
DCHECK_EQ(available_pointer_types, POINTER_TYPE_NONE);
return POINTER_TYPE_NONE;
}
HoverType GetPrimaryHoverType(int available_hover_types) {
if (available_hover_types & HOVER_TYPE_HOVER)
return HOVER_TYPE_HOVER;
DCHECK_EQ(available_hover_types, HOVER_TYPE_NONE);
return HOVER_TYPE_NONE;
}
}