// Copyright 2018 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 SERVICES_WS_POINTER_WATCHER_H_
#define SERVICES_WS_POINTER_WATCHER_H_

#include <memory>

#include "base/macros.h"
#include "ui/aura/window_event_dispatcher_observer.h"

namespace ui {

class Event;
}

namespace ws {

class WindowTree;

// PointerWatcher is used when a client has requested to observe pointer events
// that the client would not normally receive. PointerWatcher observes events
// by way of aura::WindowEventDispatcherObserver and forwards them to the
// client.
//
// This class provides the server implementation of
// mojom::WindowTree::StartPointerWatcher(), see it for more information.
class PointerWatcher : public aura::WindowEventDispatcherObserver {
 public:
  enum class TypesToWatch {
    // Pointer up/down events.
    kUpDown,

    // Pointer up, down, move (including drag) and wheel events.
    kUpDownMoveWheel,
  };

  explicit PointerWatcher(WindowTree* tree);
  ~PointerWatcher() override;

  // Applies any necessary transformations on the event before sending to the
  // client.
  static std::unique_ptr<ui::Event> CreateEventForClient(
      const ui::Event& event);

  // Returns true if |event| matches the types the PointerWatcher has been
  // configured to monitor.
  bool DoesEventMatch(const ui::Event& event) const;

  void set_types_to_watch(TypesToWatch types) { types_to_watch_ = types; }

  // See comment above |pending_event_| for details.
  void ClearPendingEvent();

 private:
  // aura::WindowEventDispatcherObserver:
  void OnWindowEventDispatcherStartedProcessing(
      aura::WindowEventDispatcher* dispatcher,
      const ui::Event& event) override;
  void OnWindowEventDispatcherFinishedProcessingEvent(
      aura::WindowEventDispatcher* dispatcher) override;

  TypesToWatch types_to_watch_ = TypesToWatch::kUpDown;

  WindowTree* tree_;

  // Events matching TypesToWatch are processed in two phases:
  // . In OnWindowEventDispatcherStartedProcessing() if the event should be
  //   sent to the client, it's stored in |pending_event_|.
  // . In OnWindowEventDispatcherFinishedProcessingEvent() if |pending_event_|
  //   is non-null, |pending_event_| is sent to the client.
  // During event processing if the event targets the client, then
  // |pending_event_| is reset. This is done to avoid sending the event twice.
  // WindowTreeClient::OnWindowInputEvent() indicates if the event matched
  // an observed pointer event.
  std::unique_ptr<ui::Event> pending_event_;

  DISALLOW_COPY_AND_ASSIGN(PointerWatcher);
};

}  // namespace ws

#endif  // SERVICES_WS_POINTER_WATCHER_H_
