blob: a7f1aba64bc58f42ea4df8b33145ce4407217047 [file] [log] [blame]
// Copyright 2016 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_LIBEVENT_H_
#define UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_LIBEVENT_H_
#include "base/macros.h"
#include "base/message_loop/message_pump_libevent.h"
#include "ui/events/events_export.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/events/platform/x11/x11_event_source.h"
namespace ui {
// The XEventDispatcher interface is used in two different ways: the first is
// when classes want to receive XEvent directly and second is to say if classes,
// which also implement the PlatformEventDispatcher interface, are able to
// process next translated from XEvent to ui::Event events. Only used with Ozone
// X11 currently.
class EVENTS_EXPORT XEventDispatcher {
public:
// XEventDispatchers can be used to test if they are able to process next
// translated event sent by a PlatformEventSource. If so, they must make a
// promise internally to process next event sent by PlatformEventSource.
virtual void CheckCanDispatchNextPlatformEvent(XEvent* xev) = 0;
// Tells that an event has been dispatched and an event handling promise must
// be removed.
virtual void PlatformEventDispatchFinished() = 0;
// Returns PlatformEventDispatcher if this XEventDispatcher is associated with
// a PlatformEventDispatcher as well. Used to explicitly add a
// PlatformEventDispatcher during a call from an XEventDispatcher to
// AddXEventDispatcher.
virtual PlatformEventDispatcher* GetPlatformEventDispatcher() = 0;
// Sends XEvent to XEventDispatcher for handling. Returns true if the XEvent
// was dispatched, otherwise false. After the first XEventDispatcher returns
// true XEvent dispatching stops.
virtual bool DispatchXEvent(XEvent* xevent) = 0;
protected:
virtual ~XEventDispatcher() {}
};
// A PlatformEventSource implementation for Ozone X11. Converts XEvents to
// ui::Events before dispatching. For X11 specific events a separate list of
// XEventDispatchers is maintained. Uses Libevent to be notified for incoming
// XEvents.
class EVENTS_EXPORT X11EventSourceLibevent
: public X11EventSourceDelegate,
public PlatformEventSource,
public base::MessagePumpLibevent::FdWatcher {
public:
explicit X11EventSourceLibevent(XDisplay* display);
~X11EventSourceLibevent() override;
static X11EventSourceLibevent* GetInstance();
// Adds a XEvent dispatcher to the XEvent dispatcher list.
// Also calls XEventDispatcher::GetPlatformEventDispatcher
// to explicitly add this |dispatcher| to a list of PlatformEventDispatchers
// in case if XEventDispatcher has a PlatformEventDispatcher. Thus,
// there is no need to separately add self to the list of
// PlatformEventDispatchers. This is needed because XEventDispatchers are
// tested if they can receive an XEvent based on a XID target. If so, the
// translated XEvent into a PlatformEvent is sent to that
// PlatformEventDispatcher.
void AddXEventDispatcher(XEventDispatcher* dispatcher);
// Removes an XEvent dispatcher from the XEvent dispatcher list.
// Also explicitly removes an XEventDispatcher from a PlatformEventDispatcher
// list if the XEventDispatcher has a PlatformEventDispatcher.
void RemoveXEventDispatcher(XEventDispatcher* dispatcher);
// X11EventSourceDelegate:
void ProcessXEvent(XEvent* xevent) override;
private:
// Registers event watcher with Libevent.
void AddEventWatcher();
// Tells XEventDispatchers, which can also have PlatformEventDispatchers, that
// a translated event is going to be sent next, then dispatches the event and
// notifies XEventDispatchers the event has been sent out and, most probably,
// consumed.
void DispatchPlatformEvent(const PlatformEvent& event, XEvent* xevent);
// Sends XEvent to registered XEventDispatchers.
void DispatchXEventToXEventDispatchers(XEvent* xevent);
// PlatformEventSource:
void StopCurrentEventStream() override;
void OnDispatcherListChanged() override;
// base::MessagePumpLibevent::FdWatcher:
void OnFileCanReadWithoutBlocking(int fd) override;
void OnFileCanWriteWithoutBlocking(int fd) override;
X11EventSource event_source_;
// Keep track of all XEventDispatcher to send XEvents directly to.
base::ObserverList<XEventDispatcher>::Unchecked dispatchers_xevent_;
base::MessagePumpLibevent::FdWatchController watcher_controller_;
bool initialized_ = false;
DISALLOW_COPY_AND_ASSIGN(X11EventSourceLibevent);
};
} // namespace ui
#endif // UI_EVENTS_PLATFORM_X11_X11_EVENT_SOURCE_LIBEVENT_H_