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