1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/events_export.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/platform/platform_event_source.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/x/x11_types.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtypedef struct _GPollFD GPollFD;
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtypedef struct _GSource GSource;
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtypedef union _XEvent XEvent;
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtypedef unsigned long XID;
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace ui {
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass HotplugEventHandlerX11;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A PlatformEventSource implementation for reading events from X11 server and
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// dispatching the events to the appropriate dispatcher.
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass EVENTS_EXPORT X11EventSource : public PlatformEventSource {
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit X11EventSource(XDisplay* display);
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~X11EventSource();
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static X11EventSource* GetInstance();
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Called by the glib source dispatch function. Processes all (if any)
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // available X events.
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void DispatchXEvents();
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Blocks on the X11 event queue until we receive notification from the
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // xserver that |w| has been mapped; StructureNotifyMask events on |w| are
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // pulled out from the queue and dispatched out of order.
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // For those that know X11, this is really a wrapper around XWindowEvent
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // which still makes sure the preempted event is dispatched instead of
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // dropped on the floor. This method exists because mapping a window is
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // asynchronous (and we receive an XEvent when mapped), while there are also
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // functions which require a mapped window.
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void BlockUntilWindowMapped(XID window);
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  XDisplay* display() { return display_; }
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // PlatformEventSource:
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual uint32_t DispatchEvent(XEvent* xevent) OVERRIDE;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void StopCurrentEventStream() OVERRIDE;
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The connection to the X11 server used to receive the events.
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  XDisplay* display_;
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Keeps track of whether this source should continue to dispatch all the
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // available events.
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool continue_stream_;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<HotplugEventHandlerX11> hotplug_event_handler_;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(X11EventSource);
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace ui
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
69