// 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_