blob: 02b5f5a321d12b53442a90a6dcb8a217ddf20450 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SERIAL_TRACKER_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SERIAL_TRACKER_H_
#include <cstdint>
#include <vector>
#include "base/containers/fixed_flat_map.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace wl {
// Utility classes that help on tracking and retrieving "serial" values and
// meta-data, received through Wayland protocol events. Each serial value is
// associated with an event type, which is represented by a SerialType enum
// entry.
enum class SerialType {
kMouseEnter,
kMousePress,
kTouchPress,
kKeyPress,
kMaxValue = kKeyPress
};
struct Serial {
uint32_t value;
SerialType type;
base::TimeDelta timestamp;
};
class SerialTracker final {
public:
SerialTracker();
SerialTracker(const SerialTracker&) = delete;
SerialTracker& operator=(const SerialTracker&) = delete;
~SerialTracker();
// Update/unset serial for a given |type|.
void UpdateSerial(SerialType type, uint32_t serial);
void ResetSerial(SerialType type);
// Returns the current serial for a given |type|, if any.
absl::optional<Serial> GetSerial(SerialType type) const;
// Returns the most recent serial matching the given |types|, if any.
absl::optional<Serial> GetSerial(const std::vector<SerialType>& types) const;
private:
const base::TimeTicks base_time_;
base::fixed_flat_map<SerialType,
absl::optional<Serial>,
static_cast<size_t>(SerialType::kMaxValue) + 1>
serials_;
};
} // namespace wl
#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SERIAL_TRACKER_H_