// Copyright 2019 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 COMPONENTS_EXO_WAYLAND_SERIAL_TRACKER_H_ #define COMPONENTS_EXO_WAYLAND_SERIAL_TRACKER_H_ #include #include #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/optional.h" struct wl_display; namespace exo { namespace wayland { class SerialTracker { public: enum EventType { POINTER_ENTER, POINTER_LEAVE, POINTER_BUTTON_DOWN, POINTER_BUTTON_UP, TOUCH_DOWN, TOUCH_UP, OTHER_EVENT, }; explicit SerialTracker(struct wl_display* display); ~SerialTracker(); // After shutdown, |GetNextSerial| returns 0. void Shutdown(); uint32_t GetNextSerial(EventType type); // Get the serial number of the last {pointer,touch} pressed event, or nullopt // if the press has since been released. base::Optional GetPointerDownSerial(); base::Optional GetTouchDownSerial(); // Needed because wl_touch::cancel doesn't send a serial number, so we can't // test for it in GetNextSerial. void ResetTouchDownSerial(); // Get the EventType for a serial number, or nullopt if the serial number was // never sent or is too old. base::Optional GetEventType(uint32_t serial) const; private: FRIEND_TEST_ALL_PREFIXES(SerialTrackerTest, WrapAroundWholeRange); struct wl_display* display_; // EventTypes are stored in a circular buffer, because serial numbers are // issued sequentially and we only want to store the most recent events. std::vector events_; // [min_event_, max_event) is a half-open interval containing the range of // valid serial numbers. Note that as serial numbers are allowed to wrap // around the 32 bit space, we cannot assume that max_event_ >= min_event_. uint32_t min_event_ = 1; uint32_t max_event_ = 1; base::Optional pointer_down_serial_; base::Optional touch_down_serial_; DISALLOW_COPY_AND_ASSIGN(SerialTracker); }; } // namespace wayland } // namespace exo #endif // COMPONENTS_EXO_WAYLAND_SERIAL_TRACKER_H_