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
13typedef struct _GPollFD GPollFD;
14typedef struct _GSource GSource;
15typedef union _XEvent XEvent;
16typedef unsigned long XID;
17
18namespace ui {
19
20class HotplugEventHandlerX11;
21
22// A PlatformEventSource implementation for reading events from X11 server and
23// dispatching the events to the appropriate dispatcher.
24class 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