blob: e1a51c8957600bb61bae3eb65fdcdee3eecd573a [file] [log] [blame]
// 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_