blob: dde59833ed2b63eeba883c3be4450eca38f82400 [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_EVENT_OBSERVER_HELPER_H_
#define SERVICES_WS_EVENT_OBSERVER_HELPER_H_
#include <memory>
#include <set>
#include "base/macros.h"
#include "ui/aura/window_event_dispatcher_observer.h"
#include "ui/events/event_constants.h"
namespace ws {
class WindowTree;
// EventObserverHelper is used when a client has requested to observe events
// that the client would not normally receive. This class observes events by way
// of aura::WindowEventDispatcherObserver and forwards them to the client.
// See mojom::WindowTree::ObserveEventTypes() for more information.
class EventObserverHelper : public aura::WindowEventDispatcherObserver {
public:
explicit EventObserverHelper(WindowTree* tree);
~EventObserverHelper() override;
// Returns true if |event| is listed in the set of requested |types_|.
bool DoesEventMatch(const ui::Event& event) const;
void set_types(const std::set<ui::EventType>& types) { types_ = 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;
// The requested types of events to be observed.
std::set<ui::EventType> types_;
WindowTree* tree_;
// Events matching the requested |types_| 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
// event observer.
std::unique_ptr<ui::Event> pending_event_;
DISALLOW_COPY_AND_ASSIGN(EventObserverHelper);
};
} // namespace ws
#endif // SERVICES_WS_EVENT_OBSERVER_HELPER_H_