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) {} |