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

Unified Diff: content/renderer/gamepad_shared_memory_reader.cc

Issue 195873019: Gamepad API: add support for connection events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: and a missing override Created 6 years, 7 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..f1b1e835144c85ab26a7ee33fb1599d07a809e0a 100644
--- a/content/renderer/gamepad_shared_memory_reader.cc
+++ b/content/renderer/gamepad_shared_memory_reader.cc
@@ -6,19 +6,28 @@
#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"
#include "ipc/ipc_sync_message_filter.h"
+#include "third_party/WebKit/public/platform/WebGamepadListener.h"
namespace content {
GamepadSharedMemoryReader::GamepadSharedMemoryReader()
: gamepad_hardware_buffer_(NULL),
+ gamepad_listener_(NULL),
+ is_polling_(false),
ever_interacted_with_(false) {
+}
+
+void GamepadSharedMemoryReader::StartPollingIfNecessary() {
+ if (is_polling_)
+ return;
+
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(
@@ -26,6 +35,7 @@ GamepadSharedMemoryReader::GamepadSharedMemoryReader()
UMA_HISTOGRAM_BOOLEAN("Gamepad.ValidSharedMemoryHandle", valid_handle);
if (!valid_handle)
return;
+
renderer_shared_memory_.reset(
new base::SharedMemory(renderer_shared_memory_handle_, true));
CHECK(renderer_shared_memory_->Map(sizeof(GamepadHardwareBuffer)));
@@ -33,9 +43,25 @@ GamepadSharedMemoryReader::GamepadSharedMemoryReader()
CHECK(memory);
gamepad_hardware_buffer_ =
static_cast<GamepadHardwareBuffer*>(memory);
+
+ is_polling_ = true;
+}
+
+void GamepadSharedMemoryReader::StopPollingIfNecessary() {
+ if (is_polling_) {
+ RenderThread::Get()->Send(new GamepadHostMsg_StopPolling());
+ is_polling_ = false;
+ }
}
void GamepadSharedMemoryReader::SampleGamepads(blink::WebGamepads& gamepads) {
+ // Blink should set the listener before start sampling.
+ CHECK(gamepad_listener_);
+
+ StartPollingIfNecessary();
+ if (!is_polling_)
+ return;
+
// ==========
// DANGER
// ==========
@@ -88,8 +114,45 @@ void GamepadSharedMemoryReader::SampleGamepads(blink::WebGamepads& gamepads) {
}
}
+void GamepadSharedMemoryReader::SetGamepadListener(
+ blink::WebGamepadListener* listener) {
+ gamepad_listener_ = listener;
+ if (gamepad_listener_) {
+ // Polling has to be started rigth now and not just on the first sampling
+ // because want to get connection events from now.
+ StartPollingIfNecessary();
+ } else {
+ StopPollingIfNecessary();
+ }
+}
+
GamepadSharedMemoryReader::~GamepadSharedMemoryReader() {
- RenderThread::Get()->Send(new GamepadHostMsg_StopPolling());
+ StopPollingIfNecessary();
+}
+
+bool GamepadSharedMemoryReader::OnControlMessageReceived(
+ const IPC::Message& message) {
+ 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(
+ int index,
+ const blink::WebGamepad& gamepad) {
+ if (gamepad_listener_)
+ gamepad_listener_->didConnectGamepad(index, gamepad);
+}
+
+void GamepadSharedMemoryReader::OnGamepadDisconnected(
+ int index,
+ const blink::WebGamepad& gamepad) {
+ if (gamepad_listener_)
+ gamepad_listener_->didDisconnectGamepad(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