• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_EVENTS_PLATFORM_PLATFORM_EVENT_SOURCE_H_
6 #define UI_EVENTS_PLATFORM_PLATFORM_EVENT_SOURCE_H_
7 
8 #include <map>
9 #include <vector>
10 
11 #include "base/auto_reset.h"
12 #include "base/macros.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/observer_list.h"
15 #include "ui/events/events_export.h"
16 #include "ui/events/platform/platform_event_types.h"
17 
18 namespace ui {
19 
20 class Event;
21 class PlatformEventDispatcher;
22 class PlatformEventObserver;
23 class ScopedEventDispatcher;
24 
25 // PlatformEventSource receives events from a source and dispatches the events
26 // to the appropriate dispatchers.
27 class EVENTS_EXPORT PlatformEventSource {
28  public:
29   virtual ~PlatformEventSource();
30 
31   static PlatformEventSource* GetInstance();
32 
33   // Adds a dispatcher to the dispatcher list. If a dispatcher is added during
34   // dispatching an event, then the newly added dispatcher also receives that
35   // event.
36   void AddPlatformEventDispatcher(PlatformEventDispatcher* dispatcher);
37 
38   // Removes a dispatcher from the dispatcher list. Dispatchers can safely be
39   // removed from the dispatcher list during an event is being dispatched,
40   // without affecting the dispatch of the event to other existing dispatchers.
41   void RemovePlatformEventDispatcher(PlatformEventDispatcher* dispatcher);
42 
43   // Installs a PlatformEventDispatcher that receives all the events. The
44   // dispatcher can process the event, or request that the default dispatchers
45   // be invoked by setting |POST_DISPATCH_PERFORM_DEFAULT| flag from the
46   // |DispatchEvent()| override.
47   // The returned |ScopedEventDispatcher| object is a handler for the overridden
48   // dispatcher. When this handler is destroyed, it removes the overridden
49   // dispatcher, and restores the previous override-dispatcher (or NULL if there
50   // wasn't any).
51   scoped_ptr<ScopedEventDispatcher> OverrideDispatcher(
52       PlatformEventDispatcher* dispatcher);
53 
54   void AddPlatformEventObserver(PlatformEventObserver* observer);
55   void RemovePlatformEventObserver(PlatformEventObserver* observer);
56 
57   static scoped_ptr<PlatformEventSource> CreateDefault();
58 
59  protected:
60   PlatformEventSource();
61 
62   // Dispatches |platform_event| to the dispatchers. If there is an override
63   // dispatcher installed using |OverrideDispatcher()|, then that dispatcher
64   // receives the event first. |POST_DISPATCH_QUIT_LOOP| flag is set in the
65   // returned value if the event-source should stop dispatching events at the
66   // current message-loop iteration.
67   virtual uint32_t DispatchEvent(PlatformEvent platform_event);
68 
69  private:
70   friend class ScopedEventDispatcher;
71   static PlatformEventSource* instance_;
72 
73   // Called to indicate that the source should stop dispatching the current
74   // stream of events and wait until the next iteration of the message-loop to
75   // dispatch the rest of the events.
76   virtual void StopCurrentEventStream();
77 
78   // This is invoked when the list of dispatchers changes (i.e. a new dispatcher
79   // is added, or a dispatcher is removed).
80   virtual void OnDispatcherListChanged();
81 
82   void OnOverriddenDispatcherRestored();
83 
84   // Use an ObserverList<> instead of an std::vector<> to store the list of
85   // dispatchers, so that adding/removing dispatchers during an event dispatch
86   // is well-defined.
87   typedef ObserverList<PlatformEventDispatcher> PlatformEventDispatcherList;
88   PlatformEventDispatcherList dispatchers_;
89   PlatformEventDispatcher* overridden_dispatcher_;
90 
91   // Used to keep track of whether the current override-dispatcher has been
92   // reset and a previous override-dispatcher has been restored.
93   bool overridden_dispatcher_restored_;
94 
95   ObserverList<PlatformEventObserver> observers_;
96 
97   DISALLOW_COPY_AND_ASSIGN(PlatformEventSource);
98 };
99 
100 }  // namespace ui
101 
102 #endif  // UI_EVENTS_PLATFORM_PLATFORM_EVENT_SOURCE_H_
103