root/ui/events/platform/x11/x11_event_source.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_
#define UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_

#include "base/memory/scoped_ptr.h"
#include "ui/events/events_export.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/x11_types.h"

typedef struct _GPollFD GPollFD;
typedef struct _GSource GSource;
typedef union _XEvent XEvent;
typedef unsigned long XID;

namespace ui {

// A PlatformEventSource implementation for reading events from X11 server and
// dispatching the events to the appropriate dispatcher.
class EVENTS_EXPORT X11EventSource : public PlatformEventSource {
 public:
  explicit X11EventSource(XDisplay* display);
  virtual ~X11EventSource();

  static X11EventSource* GetInstance();

  // Called by the glib source dispatch function. Processes all (if any)
  // available X events.
  void DispatchXEvents();

  // Blocks on the X11 event queue until we receive notification from the
  // xserver that |w| has been mapped; StructureNotifyMask events on |w| are
  // pulled out from the queue and dispatched out of order.
  //
  // For those that know X11, this is really a wrapper around XWindowEvent
  // which still makes sure the preempted event is dispatched instead of
  // dropped on the floor. This method exists because mapping a window is
  // asynchronous (and we receive an XEvent when mapped), while there are also
  // functions which require a mapped window.
  void BlockUntilWindowMapped(XID window);

 private:
  // Initializes the glib event source for X.
  void InitXSource();

  // PlatformEventSource:
  virtual uint32_t DispatchEvent(XEvent* xevent) OVERRIDE;

  // The connection to the X11 server used to receive the events.
  XDisplay* display_;

  // The GLib event source for X events.
  GSource* x_source_;

  // The poll attached to |x_source_|.
  scoped_ptr<GPollFD> x_poll_;

  DISALLOW_COPY_AND_ASSIGN(X11EventSource);
};

}  // namespace ui

#endif  // UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_H_

/* [<][>][^][v][top][bottom][index][help] */