blob: 262267295de62909d53de40c3eb13c905399fc9a [file] [log] [blame] [edit]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_POINTER_POINTER_DEVICE_H_
#define UI_BASE_POINTER_POINTER_DEVICE_H_
#include <cstdint>
#include <optional>
#include <tuple>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include <jni.h>
#endif // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_WIN)
#include "base/win/windows_types.h"
#endif // BUILDFLAG(IS_WIN)
namespace ui {
enum class TouchScreensAvailability {
NONE, // No touch screens are present.
ENABLED, // Touch screens are present and enabled.
DISABLED, // Touch screens are present and disabled.
};
COMPONENT_EXPORT(UI_BASE)
TouchScreensAvailability GetTouchScreensAvailability();
// Returns the maximum number of simultaneous touch contacts supported
// by the device. In the case of devices with multiple digitizers (e.g.
// multiple touchscreens), the value MUST be the maximum of the set of
// maximum supported contacts by each individual digitizer.
// For example, suppose a device has 3 touchscreens, which support 2, 5,
// and 10 simultaneous touch contacts, respectively. This returns 10.
// http://www.w3.org/TR/pointerevents/#widl-Navigator-maxTouchPoints
COMPONENT_EXPORT(UI_BASE) int MaxTouchPoints();
// Bit field values indicating available pointer types. Identical to
// blink::PointerType enums, enforced by compile-time assertions in
// third_party/blink/public/common/web_preferences/web_preferences.cc.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.base
// GENERATED_JAVA_PREFIX_TO_STRIP: POINTER_TYPE_
enum PointerType {
POINTER_TYPE_NONE = 1 << 0,
POINTER_TYPE_FIRST = POINTER_TYPE_NONE,
POINTER_TYPE_COARSE = 1 << 1,
POINTER_TYPE_FINE = 1 << 2,
POINTER_TYPE_LAST = POINTER_TYPE_FINE
};
// Bit field values indicating available hover types. Identical to
// blink::HoverType enums, enforced by compile-time assertions in
// third_party/blink/public/common/web_preferences/web_preferences.cc.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.base
// GENERATED_JAVA_PREFIX_TO_STRIP: HOVER_TYPE_
enum HoverType {
HOVER_TYPE_NONE = 1 << 0,
HOVER_TYPE_FIRST = HOVER_TYPE_NONE,
HOVER_TYPE_HOVER = 1 << 1,
HOVER_TYPE_LAST = HOVER_TYPE_HOVER
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. See PointerDigitizerType in:
// tools/metrics/histograms/metadata/input/enums.xml
enum class PointerDigitizerType : uint8_t {
kUnknown = 0,
// Integrated into a display.
kDirectPen = 1,
// Not integrated into a display.
kIndirectPen = 2,
kTouch = 3,
kTouchPad = 4,
kMaxValue = kTouchPad
};
// Description of an input pointer device.
struct COMPONENT_EXPORT(UI_BASE) PointerDevice final {
#if BUILDFLAG(IS_WIN)
using Key = HANDLE;
#else
// Placeholder, override as needed when implementing a new platform specific
// GetPointerDevice(s) method.
using Key = uintptr_t;
#endif
Key key;
PointerDigitizerType digitizer;
int32_t max_active_contacts;
};
// Use this to override the return value of `GetAvailablePointerAndHoverTypes()`
// for as long as this object is alive.
class COMPONENT_EXPORT(UI_BASE)
[[maybe_unused, nodiscard]] ScopedSetPointerAndHoverTypesForTesting {
public:
ScopedSetPointerAndHoverTypesForTesting(int available_pointer_types,
int available_hover_types);
~ScopedSetPointerAndHoverTypesForTesting();
const std::pair<int, int>& pointer_and_hover_types() const {
return pointer_and_hover_types_;
}
private:
std::pair<int, int> pointer_and_hover_types_;
};
COMPONENT_EXPORT(UI_BASE)
std::pair<int, int> GetAvailablePointerAndHoverTypes();
COMPONENT_EXPORT(UI_BASE) PointerType GetPrimaryPointerType();
COMPONENT_EXPORT(UI_BASE) HoverType GetPrimaryHoverType();
COMPONENT_EXPORT(UI_BASE)
std::optional<PointerDevice> GetPointerDevice(PointerDevice::Key key);
COMPONENT_EXPORT(UI_BASE) std::vector<PointerDevice> GetPointerDevices();
inline constexpr bool operator==(const PointerDevice& left,
const PointerDevice& right) {
return left.key == right.key;
}
inline constexpr bool operator==(const PointerDevice& left,
PointerDevice::Key right) {
return left.key == right;
}
inline constexpr bool operator==(PointerDevice::Key left,
const PointerDevice& right) {
return left == right.key;
}
} // namespace ui
#endif // UI_BASE_POINTER_POINTER_DEVICE_H_