| Index: chrome/browser/chrome_browser_main_extra_parts_exo.cc
|
| diff --git a/chrome/browser/chrome_browser_main_extra_parts_exo.cc b/chrome/browser/chrome_browser_main_extra_parts_exo.cc
|
| index 5c814e74c1d460b2c40bc3d40c5b556a3aae16d1..54d0a17b87149e18dad6f1c7799f926ddcc380b5 100644
|
| --- a/chrome/browser/chrome_browser_main_extra_parts_exo.cc
|
| +++ b/chrome/browser/chrome_browser_main_extra_parts_exo.cc
|
| @@ -4,6 +4,10 @@
|
|
|
| #include "chrome/browser/chrome_browser_main_extra_parts_exo.h"
|
|
|
| +#if defined(USE_GLIB)
|
| +#include <glib.h>
|
| +#endif
|
| +
|
| #include "base/command_line.h"
|
| #include "base/macros.h"
|
| #include "base/message_loop/message_loop.h"
|
| @@ -13,6 +17,71 @@
|
| #include "components/exo/wayland/server.h"
|
| #include "content/public/browser/browser_thread.h"
|
|
|
| +#if defined(USE_GLIB)
|
| +namespace {
|
| +
|
| +struct GLibWaylandSource : public GSource {
|
| + // Note: The GLibWaylandSource is created and destroyed by GLib. So its
|
| + // constructor/destructor may or may not get called.
|
| + exo::wayland::Server* server;
|
| + GPollFD* poll_fd;
|
| +};
|
| +
|
| +gboolean WaylandSourcePrepare(GSource* source, gint* timeout_ms) {
|
| + *timeout_ms = -1;
|
| + return FALSE;
|
| +}
|
| +
|
| +gboolean WaylandSourceCheck(GSource* source) {
|
| + GLibWaylandSource* wayland_source = static_cast<GLibWaylandSource*>(source);
|
| + return (wayland_source->poll_fd->revents & G_IO_IN) ? TRUE : FALSE;
|
| +}
|
| +
|
| +gboolean WaylandSourceDispatch(GSource* source,
|
| + GSourceFunc unused_func,
|
| + gpointer data) {
|
| + GLibWaylandSource* wayland_source = static_cast<GLibWaylandSource*>(source);
|
| + wayland_source->server->Dispatch(base::TimeDelta());
|
| + wayland_source->server->Flush();
|
| + return TRUE;
|
| +}
|
| +
|
| +GSourceFuncs g_wayland_source_funcs = {WaylandSourcePrepare, WaylandSourceCheck,
|
| + WaylandSourceDispatch, nullptr};
|
| +
|
| +} // namespace
|
| +
|
| +class ChromeBrowserMainExtraPartsExo::WaylandWatcher {
|
| + public:
|
| + explicit WaylandWatcher(exo::wayland::Server* server)
|
| + : wayland_poll_(new GPollFD),
|
| + wayland_source_(static_cast<GLibWaylandSource*>(
|
| + g_source_new(&g_wayland_source_funcs, sizeof(GLibWaylandSource)))) {
|
| + wayland_poll_->fd = server->GetFileDescriptor();
|
| + wayland_poll_->events = G_IO_IN;
|
| + wayland_poll_->revents = 0;
|
| + wayland_source_->server = server;
|
| + wayland_source_->poll_fd = wayland_poll_.get();
|
| + g_source_add_poll(wayland_source_, wayland_poll_.get());
|
| + g_source_set_can_recurse(wayland_source_, TRUE);
|
| + g_source_set_callback(wayland_source_, nullptr, nullptr, nullptr);
|
| + g_source_attach(wayland_source_, g_main_context_default());
|
| + }
|
| + ~WaylandWatcher() {
|
| + g_source_destroy(wayland_source_);
|
| + g_source_unref(wayland_source_);
|
| + }
|
| +
|
| + private:
|
| + // The poll attached to |wayland_source_|.
|
| + scoped_ptr<GPollFD> wayland_poll_;
|
| +
|
| + // The GLib event source for wayland events.
|
| + GLibWaylandSource* wayland_source_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WaylandWatcher);
|
| +};
|
| +#else
|
| class ChromeBrowserMainExtraPartsExo::WaylandWatcher
|
| : public base::MessagePumpLibevent::Watcher {
|
| public:
|
| @@ -36,6 +105,7 @@ class ChromeBrowserMainExtraPartsExo::WaylandWatcher
|
|
|
| DISALLOW_COPY_AND_ASSIGN(WaylandWatcher);
|
| };
|
| +#endif
|
|
|
| ChromeBrowserMainExtraPartsExo::ChromeBrowserMainExtraPartsExo()
|
| : display_(new exo::Display) {}
|
|
|