Home | History | Annotate | Download | only in x11
      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_X11_X11_EVENT_SOURCE_H_
      6 #define UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 #include "ui/events/events_export.h"
     10 #include "ui/events/platform/platform_event_source.h"
     11 #include "ui/gfx/x/x11_types.h"
     12 
     13 typedef struct _GPollFD GPollFD;
     14 typedef struct _GSource GSource;
     15 typedef union _XEvent XEvent;
     16 typedef unsigned long XID;
     17 
     18 namespace ui {
     19 
     20 class HotplugEventHandlerX11;
     21 
     22 // A PlatformEventSource implementation for reading events from X11 server and
     23 // dispatching the events to the appropriate dispatcher.
     24 class EVENTS_EXPORT X11EventSource : public PlatformEventSource {
     25  public:
     26   explicit X11EventSource(XDisplay* display);
     27   virtual ~X11EventSource();
     28 
     29   static X11EventSource* GetInstance();
     30 
     31   // Called by the glib source dispatch function. Processes all (if any)
     32   // available X events.
     33   void DispatchXEvents();
     34 
     35   // Blocks on the X11 event queue until we receive notification from the
     36   // xserver that |w| has been mapped; StructureNotifyMask events on |w| are
     37   // pulled out from the queue and dispatched out of order.
     38   //
     39   // For those that know X11, this is really a wrapper around XWindowEvent
     40   // which still makes sure the preempted event is dispatched instead of
     41   // dropped on the floor. This method exists because mapping a window is
     42   // asynchronous (and we receive an XEvent when mapped), while there are also
     43   // functions which require a mapped window.
     44   void BlockUntilWindowMapped(XID window);
     45 
     46  protected:
     47   XDisplay* display() { return display_; }
     48 
     49  private:
     50   // PlatformEventSource:
     51   virtual uint32_t DispatchEvent(XEvent* xevent) OVERRIDE;
     52   virtual void StopCurrentEventStream() OVERRIDE;
     53 
     54   // The connection to the X11 server used to receive the events.
     55   XDisplay* display_;
     56 
     57   // Keeps track of whether this source should continue to dispatch all the
     58   // available events.
     59   bool continue_stream_;
     60 
     61   scoped_ptr<HotplugEventHandlerX11> hotplug_event_handler_;
     62 
     63   DISALLOW_COPY_AND_ASSIGN(X11EventSource);
     64 };
     65 
     66 }  // namespace ui
     67 
     68 #endif  // UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
     69