Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2141)

Unified Diff: content/renderer/gamepad_shared_memory_reader.cc

Issue 200873002: Gamepad API: add support for connection events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/gamepad_shared_memory_reader.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/renderer/gamepad_shared_memory_reader.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698