| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chrome_browser_main_extra_parts_exo.h" | 5 #include "chrome/browser/chrome_browser_main_extra_parts_exo.h" |
| 6 | 6 |
| 7 #if defined(USE_GLIB) | |
| 8 #include <glib.h> | |
| 9 #endif | |
| 10 | |
| 11 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 12 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 13 #include "chrome/browser/ui/ash/ash_util.h" | 9 #include "chrome/browser/ui/ash/ash_util.h" |
| 14 #include "chrome/common/chrome_switches.h" | 10 #include "chrome/common/chrome_switches.h" |
| 15 #include "components/exo/display.h" | 11 #include "components/exo/display.h" |
| 16 #include "components/exo/wayland/server.h" | 12 #include "components/exo/wayland/server.h" |
| 17 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 18 | 14 |
| 19 #if defined(USE_GLIB) | |
| 20 namespace { | |
| 21 | |
| 22 gboolean WaylandSourcePrepare(GSource* source, gint* timeout_ms) { | |
| 23 *timeout_ms = -1; | |
| 24 return FALSE; | |
| 25 } | |
| 26 | |
| 27 gboolean WaylandSourceCheck(GSource* source) { | |
| 28 return TRUE; | |
| 29 } | |
| 30 | |
| 31 gboolean WaylandSourceDispatch(GSource* source, | |
| 32 GSourceFunc unused_func, | |
| 33 gpointer data) { | |
| 34 exo::wayland::Server* server = static_cast<exo::wayland::Server*>(data); | |
| 35 server->Dispatch(base::TimeDelta()); | |
| 36 server->Flush(); | |
| 37 return TRUE; | |
| 38 } | |
| 39 | |
| 40 GSourceFuncs g_wayland_source_funcs = {WaylandSourcePrepare, WaylandSourceCheck, | |
| 41 WaylandSourceDispatch, nullptr}; | |
| 42 | |
| 43 } // namespace | |
| 44 | |
| 45 class ChromeBrowserMainExtraPartsExo::WaylandWatcher { | |
| 46 public: | |
| 47 explicit WaylandWatcher(exo::wayland::Server* server) | |
| 48 : wayland_poll_(new GPollFD), | |
| 49 wayland_source_( | |
| 50 g_source_new(&g_wayland_source_funcs, sizeof(GSource))) { | |
| 51 wayland_poll_->fd = server->GetFileDescriptor(); | |
| 52 wayland_poll_->events = G_IO_IN; | |
| 53 wayland_poll_->revents = 0; | |
| 54 g_source_add_poll(wayland_source_, wayland_poll_.get()); | |
| 55 g_source_set_can_recurse(wayland_source_, TRUE); | |
| 56 g_source_set_callback(wayland_source_, nullptr, server, nullptr); | |
| 57 g_source_attach(wayland_source_, g_main_context_default()); | |
| 58 } | |
| 59 ~WaylandWatcher() { | |
| 60 g_source_destroy(wayland_source_); | |
| 61 g_source_unref(wayland_source_); | |
| 62 } | |
| 63 | |
| 64 private: | |
| 65 // The poll attached to |wayland_source_|. | |
| 66 scoped_ptr<GPollFD> wayland_poll_; | |
| 67 | |
| 68 // The GLib event source for wayland events. | |
| 69 GSource* wayland_source_; | |
| 70 | |
| 71 DISALLOW_COPY_AND_ASSIGN(WaylandWatcher); | |
| 72 }; | |
| 73 #else | |
| 74 class ChromeBrowserMainExtraPartsExo::WaylandWatcher | 15 class ChromeBrowserMainExtraPartsExo::WaylandWatcher |
| 75 : public base::MessagePumpLibevent::Watcher { | 16 : public base::MessagePumpLibevent::Watcher { |
| 76 public: | 17 public: |
| 77 explicit WaylandWatcher(exo::wayland::Server* server) : server_(server) { | 18 explicit WaylandWatcher(exo::wayland::Server* server) : server_(server) { |
| 78 base::MessageLoopForUI::current()->WatchFileDescriptor( | 19 base::MessageLoopForUI::current()->WatchFileDescriptor( |
| 79 server_->GetFileDescriptor(), | 20 server_->GetFileDescriptor(), |
| 80 true, // persistent | 21 true, // persistent |
| 81 base::MessagePumpLibevent::WATCH_READ, &controller_, this); | 22 base::MessagePumpLibevent::WATCH_READ, &controller_, this); |
| 82 } | 23 } |
| 83 | 24 |
| 84 // base::MessagePumpLibevent::Watcher: | 25 // base::MessagePumpLibevent::Watcher: |
| 85 void OnFileCanReadWithoutBlocking(int fd) override { | 26 void OnFileCanReadWithoutBlocking(int fd) override { |
| 86 server_->Dispatch(base::TimeDelta()); | 27 server_->Dispatch(base::TimeDelta()); |
| 87 server_->Flush(); | 28 server_->Flush(); |
| 88 } | 29 } |
| 89 void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); } | 30 void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); } |
| 90 | 31 |
| 91 private: | 32 private: |
| 92 base::MessagePumpLibevent::FileDescriptorWatcher controller_; | 33 base::MessagePumpLibevent::FileDescriptorWatcher controller_; |
| 93 exo::wayland::Server* const server_; | 34 exo::wayland::Server* const server_; |
| 94 | 35 |
| 95 DISALLOW_COPY_AND_ASSIGN(WaylandWatcher); | 36 DISALLOW_COPY_AND_ASSIGN(WaylandWatcher); |
| 96 }; | 37 }; |
| 97 #endif | |
| 98 | 38 |
| 99 ChromeBrowserMainExtraPartsExo::ChromeBrowserMainExtraPartsExo() | 39 ChromeBrowserMainExtraPartsExo::ChromeBrowserMainExtraPartsExo() |
| 100 : display_(new exo::Display) {} | 40 : display_(new exo::Display) {} |
| 101 | 41 |
| 102 ChromeBrowserMainExtraPartsExo::~ChromeBrowserMainExtraPartsExo() {} | 42 ChromeBrowserMainExtraPartsExo::~ChromeBrowserMainExtraPartsExo() {} |
| 103 | 43 |
| 104 void ChromeBrowserMainExtraPartsExo::PreProfileInit() { | 44 void ChromeBrowserMainExtraPartsExo::PreProfileInit() { |
| 105 if (!chrome::ShouldOpenAshOnStartup()) | 45 if (!chrome::ShouldOpenAshOnStartup()) |
| 106 return; | 46 return; |
| 107 | 47 |
| 108 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 48 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 109 switches::kEnableWaylandServer)) { | 49 switches::kEnableWaylandServer)) { |
| 110 wayland_server_ = exo::wayland::Server::Create(display_.get()); | 50 wayland_server_ = exo::wayland::Server::Create(display_.get()); |
| 111 wayland_watcher_ = | 51 wayland_watcher_ = |
| 112 make_scoped_ptr(new WaylandWatcher(wayland_server_.get())); | 52 make_scoped_ptr(new WaylandWatcher(wayland_server_.get())); |
| 113 } | 53 } |
| 114 } | 54 } |
| 115 | 55 |
| 116 void ChromeBrowserMainExtraPartsExo::PostMainMessageLoopRun() { | 56 void ChromeBrowserMainExtraPartsExo::PostMainMessageLoopRun() { |
| 117 wayland_watcher_.reset(); | 57 wayland_watcher_.reset(); |
| 118 wayland_server_.reset(); | 58 wayland_server_.reset(); |
| 119 } | 59 } |
| OLD | NEW |