| // 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_HOST_EVENT_QUEUE_H_ |
| #define SERVICES_WS_HOST_EVENT_QUEUE_H_ |
| |
| #include "base/component_export.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/optional.h" |
| |
| namespace aura { |
| class WindowTreeHost; |
| } |
| |
| namespace ui { |
| class Event; |
| struct EventDispatchDetails; |
| } |
| |
| namespace ws { |
| |
| class EventQueue; |
| class HostEventDispatcher; |
| |
| // HostEventQueue is associated with a single WindowTreeHost and used to queue |
| // events (if necessary), before the WindowTreeHost does processing. |
| // HostEventQueue is created by way of |
| // WindowService::RegisterHostEventDispatcher(). The expectation is |
| // WindowTreeHost calls to HostEventQueue::DispatchOrQueueEvent() on every |
| // event. When necessary, HostEventQueue calls back to HostEventDispatcher to |
| // handle the actual dispatch. |
| class COMPONENT_EXPORT(WINDOW_SERVICE) HostEventQueue { |
| public: |
| HostEventQueue(base::WeakPtr<EventQueue> event_queue, |
| aura::WindowTreeHost* window_tree_host, |
| HostEventDispatcher* host_event_dispatcher); |
| ~HostEventQueue(); |
| |
| // If necessary, queues the event. If the event need not be queued, |
| // HostEventDispatcher::DispatchEventFromQueue() is called synchronously. If |
| // the event was not queued, the return value contains the result of the |
| // event processing. |
| base::Optional<ui::EventDispatchDetails> DispatchOrQueueEvent( |
| ui::Event* event, |
| bool honor_rewriters = true); |
| |
| aura::WindowTreeHost* window_tree_host() { return window_tree_host_; } |
| |
| HostEventDispatcher* host_event_dispatcher() { |
| return host_event_dispatcher_; |
| } |
| |
| private: |
| friend class EventQueue; |
| |
| // Dispatches an event directly, circumventing any queuing. This is private as |
| // it's only useful internally. |
| ui::EventDispatchDetails DispatchEventDontQueue(ui::Event* event, |
| bool honor_rewriters); |
| |
| // Because of shutdown ordering, HostEventQueue may be deleted *after* |
| // EventQueue. |
| base::WeakPtr<EventQueue> event_queue_; |
| aura::WindowTreeHost* window_tree_host_; |
| HostEventDispatcher* host_event_dispatcher_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HostEventQueue); |
| }; |
| |
| } // namespace ws |
| |
| #endif // SERVICES_WS_HOST_EVENT_QUEUE_H_ |