Home | History | Annotate | Download | only in platform
      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