| Index: content/renderer/gamepad_shared_memory_reader.cc
|
| diff --git a/content/renderer/gamepad_shared_memory_reader.cc b/content/renderer/gamepad_shared_memory_reader.cc
|
| index 23edeb3a22368251b5614e58c0ed136c505024e9..2efe4a4d6056669a89b9b304131149f004b9d14a 100644
|
| --- a/content/renderer/gamepad_shared_memory_reader.cc
|
| +++ b/content/renderer/gamepad_shared_memory_reader.cc
|
| @@ -6,7 +6,6 @@
|
|
|
| #include "base/debug/trace_event.h"
|
| #include "base/metrics/histogram.h"
|
| -#include "content/common/gamepad_messages.h"
|
| #include "content/common/gamepad_user_gesture.h"
|
| #include "content/public/renderer/render_thread.h"
|
| #include "content/common/gamepad_hardware_buffer.h"
|
| @@ -14,18 +13,31 @@
|
|
|
| namespace content {
|
|
|
| -GamepadSharedMemoryReader::GamepadSharedMemoryReader()
|
| - : gamepad_hardware_buffer_(NULL),
|
| +GamepadSharedMemoryReader::GamepadSharedMemoryReader(
|
| + const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
|
| + : io_message_loop_(io_message_loop),
|
| + main_message_loop_(base::MessageLoopProxy::current()),
|
| + gamepad_hardware_buffer_(NULL),
|
| + gamepad_listener_(NULL),
|
| + is_polling_(false),
|
| ever_interacted_with_(false) {
|
| +}
|
| +
|
| +bool GamepadSharedMemoryReader::EnsurePollingStarted() {
|
| + if (is_polling_)
|
| + return true;
|
| +
|
| CHECK(RenderThread::Get()->Send(new GamepadHostMsg_StartPolling(
|
| &renderer_shared_memory_handle_)));
|
| +
|
| // If we don't get a valid handle from the browser, don't try to Map (we're
|
| // probably out of memory or file handles).
|
| bool valid_handle = base::SharedMemory::IsHandleValid(
|
| renderer_shared_memory_handle_);
|
| UMA_HISTOGRAM_BOOLEAN("Gamepad.ValidSharedMemoryHandle", valid_handle);
|
| if (!valid_handle)
|
| - return;
|
| + return false;
|
| +
|
| renderer_shared_memory_.reset(
|
| new base::SharedMemory(renderer_shared_memory_handle_, true));
|
| CHECK(renderer_shared_memory_->Map(sizeof(GamepadHardwareBuffer)));
|
| @@ -33,9 +45,15 @@ GamepadSharedMemoryReader::GamepadSharedMemoryReader()
|
| CHECK(memory);
|
| gamepad_hardware_buffer_ =
|
| static_cast<GamepadHardwareBuffer*>(memory);
|
| +
|
| + is_polling_ = true;
|
| + return true;
|
| }
|
|
|
| void GamepadSharedMemoryReader::SampleGamepads(blink::WebGamepads& gamepads) {
|
| + if (!EnsurePollingStarted())
|
| + return;
|
| +
|
| // ==========
|
| // DANGER
|
| // ==========
|
| @@ -88,8 +106,64 @@ void GamepadSharedMemoryReader::SampleGamepads(blink::WebGamepads& gamepads) {
|
| }
|
| }
|
|
|
| +void GamepadSharedMemoryReader::SetGamepadListener(
|
| + blink::WebGamepadListener* listener) {
|
| + gamepad_listener_ = listener;
|
| +}
|
| +
|
| GamepadSharedMemoryReader::~GamepadSharedMemoryReader() {
|
| RenderThread::Get()->Send(new GamepadHostMsg_StopPolling());
|
| }
|
|
|
| +bool GamepadSharedMemoryReader::OnMessageReceived(const IPC::Message& message) {
|
| + DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(GamepadSharedMemoryReader, message)
|
| + IPC_MESSAGE_HANDLER(GamepadMsg_GamepadConnected, OnGamepadConnected)
|
| + IPC_MESSAGE_HANDLER(GamepadMsg_GamepadDisconnected, OnGamepadDisconnected)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void GamepadSharedMemoryReader::OnGamepadConnected(
|
| + const GamepadConnectionEventMessageParams& params) {
|
| + int index = params.index;
|
| + blink::WebGamepad gamepad;
|
| + params.GetWebGamepad(&gamepad);
|
| +
|
| + // Dispatch on the main JS thread.
|
| + main_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&GamepadSharedMemoryReader::DispatchGamepadConnected, this,
|
| + index, gamepad));
|
| +}
|
| +
|
| +void GamepadSharedMemoryReader::OnGamepadDisconnected(
|
| + const GamepadConnectionEventMessageParams& params) {
|
| + int index = params.index;
|
| + blink::WebGamepad gamepad;
|
| + params.GetWebGamepad(&gamepad);
|
| +
|
| + // Dispatch on the main JS thread.
|
| + main_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&GamepadSharedMemoryReader::DispatchGamepadDisconnected, this,
|
| + index, gamepad));
|
| +}
|
| +
|
| +void GamepadSharedMemoryReader::DispatchGamepadConnected(
|
| + int index,
|
| + const blink::WebGamepad& gamepad) {
|
| + if (gamepad_listener_)
|
| + gamepad_listener_->onGamepadConnected(index, gamepad);
|
| +}
|
| +
|
| +void GamepadSharedMemoryReader::DispatchGamepadDisconnected(
|
| + int index,
|
| + const blink::WebGamepad& gamepad) {
|
| + if (gamepad_listener_)
|
| + gamepad_listener_->onGamepadDisconnected(index, gamepad);
|
| +}
|
| +
|
| } // namespace content
|
|
|