910e62b5创建于 1月15日历史提交
// 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_